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.

[参考译文] TMS320F28379D:如何在 i2c 上继续传输

Guru**** 2551300 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1285560/tms320f28379d-how-continue-transfer-on-i2c

器件型号:TMS320F28379D

您好!

我使用 i2c 进行与 EEPROM 的通信。 长数据传输的应用、例如128字节。 我使用 FIFO、但它只有16个字节。

不幸的是、由于时间限制、我无法使用中断。 我只能周期性地检查 CPU 中 i2c 模块的标志。 连续检查之间的时间间隔可能很长(例如100ms)。

如果我在 i2c 总线上进行写入事务、但没有 停止条件、那么在此之后是否可以在 i2c 上开始新的传输而不生成启动条件?

i2c 上的序列:

  向 EEPROM 启动一些数据

这是时间间隔---

  将数据添加到 EEPROM

  ...

  数据的最后一部分

此致、

Piotr Romaniuk

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

    您好 Piotr:

    我 认为这是可行的、根据 I2C 外设的工作方式、它需要为每次 传输发送一个起始位;最接近的配置可能适合的是自由数据格式、只需要1个起始条件和后续数据字节。  尝试针对同一"事务"延迟传输的问题是、即使您将线路保持为低电平并且不发送任何内容、 EEPROM/器件很可能仍会在时钟沿这些值计时并只读取0并期待/发送 ACK。

    每个事务是128字节还是您排序后超过128字节的整体数据? 如果是后者、我不清楚为什么您需要在没有另一个启动条件的情况下继续进行交易。

    此致、

    阿米尔·奥马尔

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

    您好!

     尝试为同一个"事务"延迟传输的问题是,即使您将线路保持为低电平并且不发送任何内容, EEPROM/设备很可能仍将对这些值计时并仅读取0并预期/发送 ACK。

    时钟(SCL 线路上的信号)由主器件、此处为 CPU 生成。 我认为 EEPROM 没有理由不等待。  

    是每个事务是否为128字节,还是您对所有数据进行排序后超过128字节?

    我使用24LC512。 它具有128个字节长的页。 考虑到地址字节(此芯片两个)、它要求在一个完整的 i2c 事务(从开始到停止)中最多传输130个字节。 这是一个编程时间优化的问题。 与每个单独的事务同时对一个页进行编程(5ms)。  如果我在单独的 i2c 事务中发送数据、则需要几乎10倍的时间。

    问题是、可以在不生成启动条件的情况下强制该 CPU 模块继续传输。

    此致、

    Piotr Romaniuk

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    时钟(SCL 线路上的信号)由主 CPU 生成,此处为 CPU。 我认为 EEPROM 没有理由不等待。  [/报价]

    除非你 Bit-Bang 式处理时钟、否则我不知道一旦数据计数达到零 且 FIFO 为空、时钟将如何保持低电平。  尽管可以根据应配置的字节数量(最多65,536个)来读取大量数据、但 I2CCNT 数据计数寄存器可用于确定发送/接收的字节数。 我将询问一些设计专家 对此可能存在何种权变措施、并最迟在下周结束之前与您联系。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道一旦您的数据计数达到零 且 FIFO 为空,它将如何保持低电平

    void i2c_t:::mode_start_WRITE_nostop (void){
    this->error = status_ok;
    i2cregs->I2CMDR.all = I2CMDR_MST_MASK | I2CMDR_IRS_MASK  | I2CMDR_TRX_MASK | I2CMDR_STT_MASK;

    它用于读取数据。 执行第一个 i2c 写入事务、其中传输 EEPROM 存储器中的地址(此处不是 i2c 停止)、执行下一个 i2c 读取事务(由停止条件完成)。  

     I2CCNT 数据计数寄存器用于确定传输/接收的字节数、但根据应配置的字节数(最多65,536)应该可以读取大量数据。 [/报价]

    该处理器中的 FIFO 很小-只有16个字节。 如果希望发送更多内容、则需要监控 FIFO 阈值标志并将下一部分发送到 FIFO。 不幸的是、我无法提供快速零监控、也无法使用中断。 在本例中、FIFO 会欠运转。

    我将询问一些设计专家 对此可能存在什么解决方法,并最迟在下周结束时回复您。

    谢谢你。

    此致、

    Piotr Romaniuk

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    遗憾的是,我无法提供快速的零功耗监控,也无法使用中断。 在本例中、FIFO 将欠载。

    是的、不幸的是、我也看到了同样的情况。 我仍在与设计专家讨论尽可能做到这一点的方法。 根据我到目前为止的理解、由于没有 DMA 访问 、因此很难从 I2C 接收缓冲区/FIFO 将数据主动传输到存储器中。

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

    根据我与其他专家的讨论、如果您在 RSFULL 状态设置后读取数据(您 可以轮询该状态位)、您可以连续读取数据、并且时钟应自动拉伸以允许您继续读取数据。