野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 51|回复: 3

RT1052使用软件I2C驱动GT911问题

[复制链接]
发表于 2020-9-11 13:38:27 | 显示全部楼层 |阅读模式
本使用RT1052软件软件I2C驱动GT911触摸,进行了芯片的初始化和选定了地址为0xBA,然后准备读取一下触摸芯片GT911的ID,发现读取回来都是不正确的({0xFF,0x00,0x00,0x00})。找了很久没有找到原因。测试过SDA和SCL的输出没有问题,然后不是
很理解SDA的输入该如何配置PAD的属性,具体原因不是很清楚,身边暂时没有示波器。不知道是不是PAD属性问题,恳请各位
大侠指点迷津。下面有部分代码:

1、初始化GT911的地址和读取ID
void I2C_Touch_Init(void)
{
        uint8_t tmp[4]={7,7,7,7};
        gpio_pin_config_t rst_int_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
         
        I2C_GTP_IOMUXC_MUX_Config(); /* 初始化各引脚IOMUXC相关 */
        I2C_GTP_IOMUXC_PAD_Config();
       
        /* 初始化 RST INT 引脚 先把RST INT配置为输出模式 */
        GPIO_PinInit(TOUCH_PAD_RST_GPIO, TOUCH_PAD_RST_GPIO_PIN, &rst_int_config);
        GPIO_PinInit(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, &rst_int_config);

        /*复位为低电平,为初始化做准备*/
        GPIO_PinWrite(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, 0U);
        GPIO_PinWrite(TOUCH_PAD_RST_GPIO, TOUCH_PAD_RST_GPIO_PIN, 0U);
        SysTick_Delay_Us(200);

        /*拉高一段时间,进行初始化*/
        GPIO_PinWrite(TOUCH_PAD_RST_GPIO, TOUCH_PAD_RST_GPIO_PIN, 1U);
        SysTick_Delay_Ms(70);

        //INT配置成中断输入
        rst_int_config.direction = kGPIO_DigitalInput;
        rst_int_config.outputLogic = 0;
        rst_int_config.interruptMode = kGPIO_IntRisingEdge;
        GPIO_PinInit(TOUCH_PAD_INT_GPIO, TOUCH_PAD_INT_GPIO_PIN, &rst_int_config);

        /* 使能引脚中断 */  
        //GPIO_PortEnableInterrupts(TOUCH_PAD_INT_GPIO, 1U << TOUCH_PAD_INT_GPIO_PIN);
        //DisableIRQ(GPIO2_Combined_16_31_IRQn);//这里禁止触摸中断

        GT911_RD_Reg(0xBA, tmp, 4);//读取ID tmp为 : {0xFF,0x00,0x00,0x00}
       
        //读取PID
        //GT911_RD_Reg(0X8140, tmp, 4); //读取tmp为 : {0xFF,0x00,0x00,0x00}
}




2、I2C的SCl SDA INT RST的PAD属性
/* I2C的SCL和SDA引脚使用同样的PAD配置 */
#define I2C_PAD_CONFIG_DATA            (SRE_0_SLOW_SLEW_RATE| \
                                        DSE_6_R0_6| \
                                        SPEED_1_MEDIUM_100MHz| \
                                        ODE_0_OPEN_DRAIN_DISABLED| \
                                        PKE_1_PULL_KEEPER_ENABLED| \
                                        PUE_0_KEEPER_SELECTED| \
                                        PUS_3_22K_OHM_PULL_UP| \
                                        HYS_0_HYSTERESIS_DISABLED)   

/* 触摸芯片的RST和INT引脚使用同样的PAD配置 */
#define GTP_RST_INT_PAD_CONFIG_DATA            (SRE_0_SLOW_SLEW_RATE| \
                                                DSE_6_R0_6| \
                                                SPEED_1_MEDIUM_100MHz| \
                                                ODE_0_OPEN_DRAIN_DISABLED| \
                                                PKE_1_PULL_KEEPER_ENABLED| \
                                                PUE_0_KEEPER_SELECTED| \
                                                PUS_2_100K_OHM_PULL_UP| \
                                                HYS_0_HYSTERESIS_DISABLED)   


3、部分I2C的通信阶段代码

void IIC_Ack(void)
{
        IIC_SCL(0);
    SDA_OUT();
    IIC_SDA(0);
    delay_us(2);
    IIC_SCL(1);
    delay_us(2);
        IIC_SCL(0);
}


//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void IIC_Send_Byte(uint8_t txd)
{                        
     uint8_t t;  
     SDA_OUT();        
     IIC_SCL(0);//拉低时钟开始数据传输
     for(t=0;t<8;t++)
     {            
         if((txd&0x80)>>7)
             IIC_SDA(1);
         else
             IIC_SDA(0);
         txd<<=1;      
         delay_us(2);  
         IIC_SCL(1);
         delay_us(2);
         IIC_SCL(0);   
         delay_us(2);
     }             
}


//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
uint8_t IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
     //SDA_IN();//SDA设置为输入
     for(i=0;i<8;i++ )
     {
         IIC_SCL(0);
         delay_us(2);
         IIC_SCL(1);
         receive<<=1;
         if(READ_SDA())receive++;  
         delay_us(1);
     }                    
     if (!ack)
         IIC_NAck();//发送nACK
     else
         IIC_Ack(); //发送ACK  
     return receive;
}



//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
uint8_t GT911_WR_Reg(uint16_t reg,uint8_t *buf,uint8_t len)
{
     uint8_t i;
     uint8_t ret=0;
     IIC_Start();   
     IIC_Send_Byte(GT_CMD_WR);       //发送写命令     
     IIC_Wait_Ack();
     IIC_Send_Byte(reg>>8);       //发送高8位地址
     IIC_Wait_Ack();                                                         
     IIC_Send_Byte(reg&0XFF);       //发送低8位地址
     IIC_Wait_Ack();
     for(i=0;i<len;i++)
     {      
         IIC_Send_Byte(buf[i]);      //发数据
         ret=IIC_Wait_Ack();
         if(ret)break;
     }
     IIC_Stop();                    //产生一个停止条件      
     return ret;
}

回复

使用道具 举报

发表于 2020-9-12 17:42:02 | 显示全部楼层
不用模拟的就正常吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-14 08:38:57 | 显示全部楼层
WishWish 发表于 2020-9-12 17:42
不用模拟的就正常吗

不是的,第一次就使用模拟的,还没试过成功。
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
好吧,解决了现在,什么问题都能遇到。至于什么问题就不说了。做一件事情就要一步一步来,思路清晰,搞好每一步,考虑到每一个东西。有些东西看起来复杂一点,但是也要分块做好每一块。over
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2020-9-24 19:40 , Processed in 0.259942 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表