TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F280049C: 利用I2C硬件读取数据后用for循环赋值时出现错误

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:

之前也有这个延时,但是时间不够长

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280049C: 利用I2C硬件读取数据后用for循环赋值时出现错误
分享到: 更多 (0)