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**** 2123470 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?

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    您好 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);

    此致

    西达尔特