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.
Q:当我们在 DMA 寄存器上写入要发送的数据时,应该会触发 I2C 中断并启动通信。
如果您可以共享分步说明来配置相同的功能(寄存器)、
Lavina、您好!
我建议您先使用 i2c_controller_rw_multibyte_fifo_interrupts 示例执行此操作、该 示例位于 SDK 的以下位置:mspm0_sdk_1_30_00_03\examples\nortos\LP_MSPM0G3507\driverlib\i2c_controller_rw_multibyte_fifo_interrupts
导入此项目后、您可以打开.syscfg 文件、打开"I2C"选项卡、然后向下滚动到"DMA 配置"选项卡。 您可以在此处配置 DMA 通道、由 I2C TX FIFO 触发。 在 SysConfig 中配置 DMA 通道后,需要 使用 DL_DMA_setSrcAddr ()和 DL_DMA_setDestAddr ()函数配置 DMA 的源地址和目标地址。 完成此操作并确保设置 DMA 传输大小(可以使用 DL_DMA_setTransferSize ()或 SysConfig 完成)后,您可以使用 DL_DMA_enableChannel ()启用传输开始。
若要切换此示例以使用 DMA ,您还需要 删除 该示例使用的 DL_I2C_ControllerTXFIFO ()函数。 由于我们没有发布带有 DMA 示例的 I2C、因此我还建议您使用带 DMA 的 SPI 示例来帮助开发、可以在 SDK 中的以下位置找到该示例: mspm0_sdk_1_30_00_03\examples\nortos\lp_MSPM0G3507\driverlib\spi_controller_fifo_dma_interrupts
我通过参考下面的示例在我的项目中完成了配置。
您是否还在 SysConfig 中启用了 I2C DMA? 您能否发布选项卡的图像以显示其配置设置?
观察上面的函数、这些并不是 driverlib 函数。 我不知道这是否能正确地初始化 DMA、因为我不知道这些函数有什么作用。
一般过程应为:
初始化传输模式、目的和源地址增量、目的和源数据宽度、触发器和触发器类型。
然后、设置源地址、目标地址和传输大小、然后启用 SChannel。
如果只传输一个字节的数据、是否需要进行 目的地址和源地址递增?
您能否分享配置 DMA 通道以向 I2C 外设发送5字节数据的步骤
编辑 MSPM0 DMA 学院中所示的示例以发送5个字节。 然后编辑该示例、使目标寄存器成为 I2C TX 缓冲区。 I2C0的基地址为0x400F0000、 I2C1的基地址为0x400F2000。 两者的偏移量都是0x1220。 因此、对于 I2C0、TX 缓冲器位于0x400F1220、对于 I2C1、TX 缓冲器位于0x400F3220。 确保在 DMA 传输之前初始化 I2C。 有关如何初始化 I2C 的信息、请参阅 MSPM0 I2C Academy 中的示例。
TXFIFO 能够通过 DMA 处理多达8字节的数据。 超过8个字节、没有启用 I2C 停止字节。
TXFIF0是否存在任何字节计数限制? 与单次传输模式一样、一次最多只能向 FIFO 放置8个字节?
当我通过 I2C 传输更多的8个字节的数据时、停止位没有启用、它在一次可以从 Tx FIFO 发送出去的字节数方面存在任何限制
Lavina、您好!
I2C FIFO 为8字节深。 如果您一次向 I2C FIFO 传输超过8个字节、它将被填满、并且您的数据无法正确发送。 查看 SysConfig 中的 I2C DMA 配置选项卡、可以看到 FIFO 部分满时有触发器设置。 如果使用这些设置和单传输模式、FIFO 不会被覆盖、并且 I2C 传输可以是连续的。