This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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);//发送NACK
    I2C_sendStopCondition(I2CA_BASE);//发送停止信号
    return Data;
}

通过上面两个函数读写数据

//=========现象=========

在Debug时可以看到接收回来的顺序是33、11、22

但我用逻辑分析仪读取到的数据顺序明明是11、22、33

  • 而且该程序首次运行时总是"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他们在逻辑分析仪下的时序都是正确的,这是什么原因?

  • 你好,I2C读取eeprom的问题建议直接前往英文E2E论坛咨询,这边目前没有测试条件所以没做过类似测试。

    e2e.ti.com/.../c2000-microcontrollers-forum

  • 已经找到问题了,读取的时候添加延时读回来的数据就正常了

    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);//发送NACK
        I2C_sendStopCondition(I2CA_BASE);//发送停止信号
        return Data;
    }

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