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.

[参考译文] CC3235MODSF:I2C 从设备- DMA

Guru**** 2558250 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1021765/cc3235modsf-i2c-slave---dma

器件型号:CC3235MODSF

我尝试在 I2C 外设作为从设备运行时使用 UDMA、并再次遇到 CPU 信号处理问题。

DMA 设置为从缓冲器向 FIFODATA 寄存器传输40个字节(或当 i2c 主器件向 cc3235 "从器件"写入数据时反向)。

 I2C_SLAVE_INT_TX_DMA_DONE 和 I2C_SLAVE_INT_RX_DMA_DONE 中断均已启用。

当 I2C 主设备尝试读取 CC3235时、会发生此问题。

1) 1)我设置 DMA 将40字节传输到 FIFO。

2) 2)然后将 GPIO 设置为低电平。

3) 3)当 I2C_SLAVE_INT_TX_DMA_DONE 完成时、GPIO 变为高电平(当可能发生另一个传输时、GPIO 信号内部信标)。

问题是:DMA TX 完成似乎提前发出信号、并导致应用程序回卷/初始化 DMA 并发送下一个缓冲区数据覆盖/损坏传输的字节。

在该图中、当 DMA_RDY 信号变为高电平时、会发生覆盖->应用重新加载指向其他缓冲区的 DMA -> 通过将错误数据填充到 FIFO 来破坏正在进行的 I2C TX。

是否有方法以任何可靠的方式向 I2C 传输结束发出信号?
(我不寻找驱动程序支持我知道驱动程序不支持此用例、我对 CPU /低级用法感兴趣、根据 swru543a 技术参考手册、CPU 配备了 I2C 从设备和 uDMA)

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

    您好!

    驱动 GPIO 的是什么? 如何处理来自外设的中断? 缺少多少数据?

    您还可以查看 Tx FIFO 空中断。

    此致、

    Sarah

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

    感谢您的回复。

    GPIO 由应用驱动。

    当我设置用于传输的 DMA 时、GPIO 被设置为低电平。

    TX_DMA_DONE  IRQ 达到时、我向 i2c 处理任务发送一个信号、并且 GPIO 被设置为高电平。

    在图片中、您可以看到正在进行的 DMA 编排 I2C 传输。
    它开始发送一条消息、该消息中只有一个虚拟缓冲区、其中包含递增的数字。

    不幸 的是,我触发的事件(I2C_SLAVE_INT_TX_DMA_DONE)似乎发生在实际传输完成之前。
    无论我将 TXFIFO 配置为触发电平(0、1、2、... 等)。  

    这会导致在应用程序中再次设置 DMA、并且过早开始填充另一个"dummy2"缓冲区、当 GPIO 再次变为低电平时、您可以看到这一点。第一条消息中的值随着以81、82开始而损坏、 (DMA 开始将另一个缓冲区移出到 TX FIFO)。 然后发送第二条消息、其中包含"dummy2"缓冲区的剩余内容(86..87..88...等)。

    遗憾 的是、开始使用"Tx FIFO 空中断"的建议也不是有效的选项。 我在这里报告了无数个论坛主题、关于这个问题、我怀疑这个信号有 CPU 错误->所有这些主题都已关闭、没有解释或进一步调查。 一年来、我们将疑似错误上报给了 TI、直到今天、我们才收到任何有关该问题的答案。

    我尝试使用 DMA 的原因是为了避免处理 TX FIFO 空中的可疑错误。 我希望这个 TX_DMA_DONE 信号代表一个完成的 I2C 传输。

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

    我在导致数据覆盖的代码中发现了问题(在 DMA 重新配置之前、TX_FLUSH 是问题)。

    但是、我仍然看到在 I2C 传输完成之前、TX_DMA_DONE 被发出信号。

    TX_FIFO_EMPTY 根本不发出信号。

    我尝试设置 DMA 以传输 N+M 字节(其中 N 是我希望发送的字节数量、M=[1;8])、但不幸的是、这也不起作用。 当设置 M=[1;7]时、TX_DMA_DONE 信号变得更接近最后一个移出字节、但即使是7、它也在传输结束之前。 如果 M=8 (因此 DMA 应该在发送所需数量后再增加8个字节)也不是一个选项、因为 NAK 条件看起来不会触发最后的第8个虚拟字节传输-> TX_DMA_DONE 从未完成。

    目前、我唯一的权变措施(权变措施)是在事件之后等待1-2ms、如果由于某种原因、主控方决定提取字节之间存在间隙/延迟、则永远不能保证这种情况有效。