高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-6-4
|
本使用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;
}
|
|