Part Number:TMS320F280049C
//=========代码部分=========
void B1(void) {for(i = 0;i < 3;i++){EE24CX_Write_Byte(i,I2C_SendMsg[i]);}for(i = 0;i < 3;i++){I2C_ReceiveMsg[i] = EE24CX_Read_Byte(i);DEVICE_DELAY_US(Delay_MinTime);}B_Task_Ptr = &B1; }
在主函数中通过B1事件读取EEPROM中的数据
int16_t EE24CX_Write_Byte(uint16_t ADDR,uint16_t Data) {I2C_setDataCount(I2CA_BASE,2);I2C_putData(I2CA_BASE, ADDR);//发送设备地址I2C_putData(I2CA_BASE, Data);//发送需要访问的寄存器地址I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//设置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号,并将刚刚配置的信息发送出I2C_sendStopCondition(I2CA_BASE);//发送终止信号DEVICE_DELAY_US(Delay_MinTime);return 1; } uint16_t EE24CX_Read_Byte(unsigned char ADDR) {uint16_t Data;I2C_setDataCount(I2CA_BASE,1);I2C_putData(I2CA_BASE, ADDR);//发送地址信息I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime/8);I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime/8);Data = I2C_getData(I2CA_BASE);//读取数据I2C_sendNACK(I2CA_BASE);//发送NACKI2C_sendStopCondition(I2CA_BASE);//发送停止信号return Data; }
通过上面两个函数读写数据
//=========现象=========
在Debug时可以看到接收回来的顺序是33、11、22
但我用逻辑分析仪读取到的数据顺序明明是11、22、33
YingJed Ying:
而且该程序首次运行时总是"11、11、22"
第二次开始就一直是"33、11、22"了
如果增加次数
可以看到第一次读回来的数据是"22、11、22、33、44、55"
从第二次开始就是"66、11、22、33、44、55"
正确的顺序应该是"11、22、33、44、55、66"
因为当我不使用硬件I2C而是用软件IO模拟I2C时读取到的就是正确的顺序
无论是用硬件I2C还是软件IO模拟的I2C他们在逻辑分析仪下的时序都是正确的,这是什么原因?
,
Green Deng:
你好,I2C读取eeprom的问题建议直接前往英文E2E论坛咨询,这边目前没有测试条件所以没做过类似测试。
e2e.ti.com/…/c2000-microcontrollers-forum
,
YingJed Ying:
已经找到问题了,读取的时候添加延时读回来的数据就正常了
uint16_t EE24CX_Read_Byte(unsigned char ADDR) {uint16_t Data;I2C_setDataCount(I2CA_BASE,1);I2C_putData(I2CA_BASE, ADDR);//发送地址信息I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式I2C_sendStartCondition(I2CA_BASE);//发送起始信号DEVICE_DELAY_US(Delay_MinTime);//这个地方的延时增加后就正常了Data = I2C_getData(I2CA_BASE);//读取数据I2C_sendNACK(I2CA_BASE);//发送NACKI2C_sendStopCondition(I2CA_BASE);//发送停止信号return Data; }
,
YingJed Ying:
之前也有这个延时,但是时间不够长