我通过GPIO口模拟I2C对E2进行读/写操作。先对地址0x20写入数据0x01,再去读地址0x20,但是读到的数据是0xff。一下是逻辑分析仪抓取到的图。
写完数据后,延时10ms之后再去读取数据!感觉这个时序有点问题!
一般SCL和SDA上都会借一个上拉电阻。
如果要去使用GPIO模拟I2C,必须对GPIO的时序了解比较清楚
根据问题描述和逻辑分析仪抓取的图,可能存在以下几种问题:
针对这些问题,可以按照以下步骤进行排查和解决:
SDA_GPIO->MODER |= GPIO_MODER_MODE1_0; //使能pin1第一种输出模式
SDA_GPIO->OTYPER |= GPIO_OTYPER_OT1; //设置为开漏/开极
C void I2C_Write_E2(unsigned char device_addr, unsigned char data_addr, unsigned char data) { IIC_Start();//起始信号 IIC_Send_Byte(device_addr << 1);//发送器件地址 + 写命令 if(!IIC_Wait_Ack())//等待ACK { IIC_Stop(); return; } IIC_Send_Byte(data_addr);//发送E2数据的地址 IIC_Wait_Ack();//等待ACK IIC_Send_Byte(data);//发送E2数据内容 IIC_Wait_Ack();//等待ACK IIC_Stop();//停止信号 }
C unsigned char I2C_Read_E2(unsigned char device_addr, unsigned char data_addr) { unsigned char temp = 0; IIC_Start();//起始信号 IIC_Send_Byte(device_addr << 1);//发送器件地址 + 写命令 if(!IIC_Wait_Ack())//等待ACK { IIC_Stop(); return 0xff;//失败返回0xff } IIC_Send_Byte(data_addr);//发送E2数据的地址 IIC_Wait_Ack();//等待ACK IIC_Start();//起始信号 IIC_Send_Byte((device_addr << 1) | 0x01);//发送器件地址 + 读命令 IIC_Wait_Ack();//等待ACK temp = IIC_Read_Byte(0);//读取E2数据内容,不发送应答位 IIC_Stop();//停止信号 return temp; }
如果以上操作仍不能解决问题,可能原因为程序逻辑有误或芯片规格不同导致,需要进一步排查。