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.

[参考译文] TMS320F28386S:CM I2C EEPROM、读取 EEPROM 时出现问题

Guru**** 2524500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1247818/tms320f28386s-cm-i2c-eeprom-issues-with-reading-eeprom

器件型号:TMS320F28386S

您好!

我将一个 M24C08 I2C EEPROM 连接到 CM。

我能够从 EEPROM 写入和读取数据。

然而、当完成对数据块的读取时、EEPROM 需要从主器件获得一个 NACK。

我无法确定如何为 EEPROM 生成 NACK 条件。

此外、没有生成停止条件。

结果是读取数据后、SDA 线保持低电平、CLK 线处于高电平。
I2C 总线卡滞。


您能否解释一下如何正确读取块段、如何生成停止条件、以及如何向 EEPROM 发送 NACK?

void m24c08_Read_Data(uint8_t index, uint8_t * dest, uint32_t len)
{
    uint16_t i;

    // Read Byte - Select address.
    I2C_setSlaveAddress(I2C0_BASE,M24C08_ADDRESS,I2C_MASTER_WRITE);
    I2C_putMasterData(I2C0_BASE, index * 4);
    I2C_setMasterConfig(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);

    // Send restart.
    SysCtl_delay(2400);

    // Send Read command
    I2C_setSlaveAddress(I2C0_BASE,M24C08_ADDRESS,I2C_MASTER_READ);
    I2C_setMasterConfig(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
    SysCtl_delay(1200);

    for(i=0; i < len; i++) {
        I2C_setMasterConfig(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
        SysCtl_delay(1200);

        dest[i] = I2C_getMasterData(I2C0_BASE);
    }
//    I2C_setMasterConfig(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
    I2C_setMasterConfig(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 NIR、

    我们的主要专家不在办公室、因此我将在明天稍后时间与您联系。

    此致、

    阿米尔·奥马尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请尝试使用以下代码片段读取数据

    I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    I2C_putMasterData (I2C0_BASE、index * 4);

    I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
    while (I2C_isMasterBusy (I2C0_BASE));

    I2C_setSlaveAddress (I2C0_BASE、SLAVE_ADDRESS、I2C_MASTER_READ);
    I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);
    while (I2C_isMasterBusy (I2C0_BASE));

    for (i=0;i<len;j++)
    {
    dest[i]=I2C_getMasterData (I2C0_BASE);

    I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);
    while (I2C_isMasterBusy (I2C0_BASE));
    SYSCTL_DELAY (1200);

    此致

    西达尔特