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:具有 CSI 24c16 EEPROM 的 I2C FIFO

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/975561/tms320f280049c-i2c-fifo-with-csi-24c16-eeprom

器件型号:TMS320F280049C
主题中讨论的其他器件:C2000WARE

您好、TI 团队、

我正在使用 I2C 驱动程序、我设法使 i2c fifo 工作、fifo Tx、fifo Rx 中断工作。 我正在正确获取中断。

我的问题是、当我尝试读取 EEPROM 时、我将访问一些随机地址值、而不是我想要的正确存储器位置

目前,我正在执行以下读取操作步骤(步骤1中禁用了*模块)

  • 我正在设置从地址(0x50)、然后我将 TRX 设为1以发送地址值、并且 MST = 1并在我的发送函数中将寄存器地址加载到我的全局数组中
  • 然后我将启用模块(IRS = 1)、我将在启用模块之前加载数据、因为我的 TXFIFO 电平设置为0。
  • 现在、Tx 中断命中次数和数据(我要访问的存储器地址)被加载到 I2CDXR 寄存器(FIFO 缓冲区)中  
  • 然后通过设置 STT 来推入1启动条件
  • 我将 TRX 位设置为0进行读取、MST = 1、然后在 寄存器中设置从地址(0x50)
  • 我正在获取 Rx 中断、但 I2CDRR 寄存器中的数据不是我使用写函数写入的数据。

我的写入函数正在工作、因为我可以看到我加载的值、我只能在我执行多次读取(因此我知道数据写入 EEPROM)时看到这些值(这是新的 EEPROM、因此所有数据位必须为1)

我怀疑 写操作可能也无法访问我正在传递或希望写入的正确地址。

那么,请告诉我如何访问正确的位置,我缺少什么?

我要做的是从特定位置进行写入和读取。

我的代码非常通用、因为它适用于传感器、EEPROM 和其他支持 i2c 的器件。

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

    P.S. 重复模式启用
    如果您想查看代码、我可以在个人消息中共享、而不是在公共消息中共享。

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

    Ashish、

    EEPROM 中指定的写入周期时间是多少? 通常、在 I2C 传输要编程到特定地址的数据后、将数据编程到 EEPROM 地址需要有限的时间(由 EEPROM 状态机定义)。 这通常被指定为写入周期时间。 如果您不等待写入周期时间、您将读取不正确的数据。

    I2C 写入函数发送开始条件+ EEPROM 地址、写入位设置+数据+停止条件

    等待 EEPROM 数据表中指定的写入周期时间

    I2C 读取功能发送开始条件+读取位设置的 EEPROM 地址+从器件数据+停止条件

    此致、

    曼诺伊

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

    增加延迟对 SIR 没有帮助。


    正如我先前所说的、我能够将数据写入 EEPROM、因为我可以在随机读取 EEPROM 时查看我使用写入函数上传的值。

    我的问题是我无法从特定地址读取。

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

    我在个人邮件中分享了我的代码、请仔细查看。

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

    Ashish、

    RandomRead 需要主发送器(发送 EEPROM 地址以进行读取)+在主接收器模式下重复启动以读取 EEPROM 内容、如下所示。 您的示例似乎没有显示主发送器+主接收器。 我只会看到主接收器模式。

    此致、

    曼诺伊

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

    HII Manoj、

    请问我该怎么办?

    目前、我正在尝试在下面执行此操作

    我想首先向要从中读取的从器件发送定位器地址(Master_Transmitter -发送存储器地址和从器件地址、TRX=1)

    然后是我要发送的起始条件

    然后、我使用重复启动条件调用 master_receiver 函数、并从 EEPROM 获取一些数据。

    我正在尝试执行这一步骤、但看起来这不是我想读取该地址的寄存器/存储器地址、我认为这不会执行

    请告诉我使用我的代码正确发送随机读取请求。

    谢谢、此致
    Ashish Bhoi

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

    您使用的是哪个 EEPROM?

    请使用 I2C 协议分析器发送 SCL/SDA 范围截屏。

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

    我正在使用 CSI 24C16 EEPROM 器件、从器件地址0x50。

    我没有 I2C 协议分析器、我可以从示波器向您发送示波器截图。

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

    Ashish、

    我在 I2C 逻辑分析仪图像中明确说明了执行 EEPROM 随机读取所需的确切方式。

    您是否与 EEPROM 制造商核实了您是否以正确的格式发送地址? 您的 EEPROM 是否希望地址采用相同的格式?

    此致、

    曼诺伊

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

    Manoj、您好!

    这里是 EEPROM 数据表中的快照、这里的 RandomRead 是由选择性读取命名的

    如您所见、它发送8个地址位和8个数据位。

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

    我需要尽快解决这个问题 Manoj 先生、请帮我、您看一下我的代码、

    我应该在哪里更新我想知道的 Sir。

    是我发送启动和停止条件的方式是正确的。

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

    我简要回顾了您的代码、我认为您没有正确使用 I2C 写入/读取功能。 请使用下面显示的伪代码来配置 I2C 写入/读取函数。 这假设您使用的是 I2C FIFO。

    这是 I2C_Write_byte 的伪代码

    1) 1)在主机发送器模式下配置 I2C、并启用重复模式

    2) 2)将 EEPROM 从器件地址(0x50表示 EEPROM、我有)写入 I2CSAR 寄存器

    3) 3)通过设置 I2CMDR.STT = 1来生成启动条件

    4) 4)将 EEPROM 地址写入 I2CDXR 寄存器 (假设您正在尝试写入 EEPROM 地址0x20、那么您需要在 I2CDXR 寄存器中写入0x20)

    5) 5)将要写入 EEPROM 的数据写入 I2CDXR 寄存器(假设我们正在尝试写入 EEPROM 地址0x20 =数据)

    6)等待 I2CTX FIFO 为空(I2CFFTX.TXFFST = 0?)

    7) 7)一旦 TXFIFO 为空、生成停止条件(I2CMDR.STP= 1)

    这是 I2C_READ_BYTE (随机读取)的伪代码

    此代码分为两部分

    a)首先是主发送器部分、用于发送要读取的 EEPROM 地址

    1) 1)在主机发送器模式下配置 I2C、并启用重复模式

    2) 2)将 EEPROM 从器件地址(0x50表示 EEPROM、我有)写入 I2CSAR 寄存器

    3) 3)通过设置 I2CMDR.STT = 1来生成启动条件

    3) 3)将 EEPROM 地址写入 I2CDXR 寄存器 (要从中读取的 EEPROM 地址)

    4) 4)等待 I2CTX FIFO 为空(I2CFFTX.TXFFST = 0?)

    b)第二部分是从 EEPROM 接收数据的主接收器部分

    1) 1)在主机接收器模式下配置 I2C 并启用重复模式

    2) 2)通过设置 I2CMDR.STT = 1 (这是重复的启动条件)来生成启动条件

    3) 3)等待 I2CRXFIFO 接收到一个字节 (I2CFFTX.RXFFST = 1?)

    4) 4)读取 I2XDRR 寄存器//此数据存储在 EEPROM 地址中

    5)生成停止条件(I2CMDR.STP= 1)

     

    此致、

    曼诺伊

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

    Ashish、

    我们发布了新的 I2C 示例、其中显示了如何使用轮询和中断方法与 EEPROM 进行通信。 请查看以下路径中的示例。

    您可以轻松地将其修改为其他 I2C 接口、例如温度传感器或闪存等

    EEPROM 轮询方法

    \\driverlib\f28004x\examples\i2c\i2c_ex4_EEPROM_Polling

    EEPROM 中断方法

    \\driverlib\f28004x\examples\i2c\i2c_ex4_EEPROM_interrupt

    此致、

    曼诺伊