您好、TI!
我使用 DMA 传输 I2C RXdata。 每次传输1个字节时发生的情况。 这是成功的。
但如果我一次发送2个或更多字节。 它只能传输每个组的第一个数据、我的代码最初不使用 DMA。 但现在我想使用 DMA 传输数据。
我发现在 I2C IRQ 中,一组数据最初通过此切换语句循环,但 DMA 仅触发一次,因此只传递第一个数据。

我该如何解决这个问题!!!
我的配置:

我真的需要你的帮助!
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.
您好、TI!
我使用 DMA 传输 I2C RXdata。 每次传输1个字节时发生的情况。 这是成功的。
但如果我一次发送2个或更多字节。 它只能传输每个组的第一个数据、我的代码最初不使用 DMA。 但现在我想使用 DMA 传输数据。
我发现在 I2C IRQ 中,一组数据最初通过此切换语句循环,但 DMA 仅触发一次,因此只传递第一个数据。

我该如何解决这个问题!!!
我的配置:

我真的需要你的帮助!
尊敬的 Yuhao:
很抱歉回复晚了。
我只需修改代码、称为"spi_controller_repeed_multibyte_fifo_dma_interrupts"
将 SPI 更改为 I2C。 将'SPI_send'拆分为'I2C_Read'和'I2C_Write'。其余部分也进行了仿真。
但它不起作用。 I2C 中断只能在红色部分中切换。

在这之后,程序卡在这个

那么我该如何转换代码呢? 我真的需要帮助。
我之所以要使用 DMA、实际上是因为我只是想使用 DMA 进行数据传输。 即复制 I2C 接收的数据、这样可以节省 CPU 资源、并且不会中断传输过程。 然后我发现在处理数据时 DMA 访问寄存器而不是 FIFO。 I2C 接收到的数据位于 FIFO 中、MRXDATA 寄存器仅代表 FIFO 中的初始值。 也就是说、如果我使用 I2C 一次读取和写入多个数据、例如4个字节的数据、那么我的 DMA 只能处理第一个数据"A"。 如果我将 DMA 长度配置为4、它将对"A"进行四次处理、因为每次触发时、MRXDATA 寄存器始终包含 FIFO 的初始值、 如果要刷新或删除 FIFO 的初始数据、则需要使用 CPU 来读取它。 使用 CPU 读取该 MRXDATA 寄存器后、内部的值会自动刷新、但这与我的原始打算背道而驰。 我的目标是节省 CPU 资源。
对不起 madarin。
我之所以想用DMA,其实我只是想用DMA做数据搬运。也就是拷贝I2C接收到的数据,这样就可以节省CPU资源并且传输过程不会被中断打断。然后我发现DMA搬运数据时是访问寄存器的而不是FIFO,I2C收到的数据在FIFO里,MRXDATA这个寄存器只表示FIFO里最开始的那个值。也就是如果我I2C一次性读写多个数据比如说4个bytes的数据,那么我DMA只能搬运第一个数据“a”,如果我配置DMA长度为4,那么他会搬运四次“a”,因为它每次被触发的时候MRXDATA寄存器里一直都是FIFO最开始的值,而如果要刷新或者说删除FIFO最开始的数据,需要用CPU读取。用CPU读取这个MRXDATA寄存器后里面的值会自动刷新,但是这就违背了我的初衷。我的目的就是要节省CPU资源。
尊敬的 Yuhao:
几天后,我有一些想法。
问题是、每个 I2C 通信仅触发一次 DMA。 因此我仅获取最后的字节。
如果我想获取每个字节、 应该在 MRXFIFO 接收到一个字节后触发 DMA。
也许我应该配置此寄存器:

事实上、我真正想要的是一个示例。 我曾尝试将 SPI SDK 传输到 I2C、但失败了!
如果有任何 DMA I2C 示例,操作将会轻松得多。
非常感谢。