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.

[参考译文] CCS/RM44L920:DMA 的 SPI TX/RX 问题

Guru**** 2620915 points

Other Parts Discussed in Thread: RM44L920, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/786881/ccs-rm44l920-spi-tx-rx-problem-with-dma

器件型号:RM44L920
主题中讨论的其他器件: HALCOGEN

工具/软件:Code Composer Studio

您好!

我需要按周期顺序读取4个 ADC 的采样数据、其中4个 ADC 共享相同的 SPI 、但由 CS 触发的多路信号分离器进行访问。 若要读取 ADC 采样数据、 需要与 ADC 在帧之后进行通信:1条读取命令+ 3个时钟、4个字节、每个字节为8位。

现在、我想使用 DMA 模式来读取 ADC 采样数据。 下面是我的设计: 将 DMA Request[0](即标准模式下的 SPI 接收请求)连接到 DMA CHANAN 1,而 DMA Request[1](即标准模式下的 SPI 传输请求到 DMA 通道0),我的控制数据包 定义如下:

G_dmaCTRL dmaCTRL_tran ={

    ( uint32 )和***[0],         //初始源地址

  (uint32) spiREG1->DAT1,         //初始目的地址

    DMA_CH1、                     //要触发的下一个 Ctrl 数据包+ 1.

      4、                           //帧  计数
      4、                          //元素数量
      0、                          //元素目标偏移量
      4、                          //元素源偏移
      0、                         //帧目的偏移量
      16、                        //帧源偏移
   0x04、                      // DMA 端口
    ACCESS_32_BIT、            //读取元素大小
    ACCESS_32_BIT、          //写入元素大小
    1、                       //触发类型-帧/块
    ADDR_OFFSET、            //源的寻址模式
    0、                       //目的地址寻址模式
    0、                      //自动初始化模式
    NO_CHANNEL、                //  uint32组合;     //下一个 ctrl 数据包触发(未使用)
   };

 g_dmaCTRL dmaCTRL_rec={

    (uint32) spiREG1->BUF、         //初始源地址

    ( uint32 ) Spi1DmaRevData       //初始目的地址

    DMA_CH0、                 //要触发的下一个 Ctrl 数据包+ 1.

      4、          //帧  计数
      4、          //元素数量
      4、        //元素目标偏移量
      0、        //元素源偏移
      16、        //帧分频偏移
      0、         //帧源偏移
   0x04、            // DMA 端口
    ACCESS_32_BIT、      //读取元素大小
    ACCESS_32_BIT、      //写入元素大小
    1、                   //触发类型-帧/块
    0、                   //源的寻址模式
    ADDR_OFFSET、        //目的地址寻址模式
    0、                      //自动初始化模式
    NO_CHANNEL、         //下一个 Ctrl 数据包触发器(未使用)
   };

我的问题是它无法正常工作。  从 OSC 中、我仅定期捕获16个 SPI 时钟、这意味着2个字节、 CS0仅在前8个时钟有效、但在后8个时钟无效。如果它正常工作、一个 CS 将在32个 SPI 时钟(4字节)内保持有效、因为它在 SPI 接收器中断模式下工作。

我想我有什么问题、请告诉我如何配置 DMA 数据包、或者您是否可以为我提供 Rm44L920?中的 SPI DMA 示例

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    在 HALCoGen 示例文件夹下有一个 TMS570LS31x_21x 示例。 您可以使用此示例作为参考。 有关此示例的说明,请参阅 HALCoGen 帮助( TMS570LS31x.chm )

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

    您好、Miro、

    感谢您的及时响应。

    我尝试了解 SPI 和 DMA 在标准 SPI 模式下而不是在多缓冲模式下的工作方式、我的理解是、请帮助指出我的问题、因为我的代码仍然无法正常工作。

    首先、由于我想根据每个 DMA 通过 SPI 外设读取 ADC 数据、 因此需要由硬件生成 TX_DMA_REQ 和 RX_DMA_REQ。

    这两个函数都由 DMAREQEN (SPIINT0[16])启用并且 SPIEN (SPIGCR1[24])被设定为1。

    由于是硬件请求、DMA 请求应是硬件请求并由执行

    dmaSetChEnable (DMA_CH0、DMA_HW);

    dmaSetChEnable (DMA_CH1、DMA_HW);

    其次、 DMA 通道配置:DMAREQ[1]、这是一个 SPI 发送请求(TX_DMA_REQ)、它连接到 DMA 通道0、因为它具有最高优先级、由 dmaReqAssign (DMA_CH0、1)执行;

    当 DMAREQ[0]是一个 SPI 接收请求(RX_DMA_REQ)连接到 DMA 通道1时、由 dmaReqAssign (DMA_CH1、0)执行;

    第三、正如预期的那样 、首先生成一个 TX_DMA_REQ、然后生成一个 RX_DMA_REQ。

    在读取所有 ADC 数据之前、TX_DMA_REQ 始终后跟 RX_DMA_REQ。

    因此、元素应为"1"、帧应为"4"以读取 ADC 数据、因为它需要发送命令和用于 ADC 数据传输的3个 SPI 时钟、触发源是由 DMA 请求触发的帧传输。

    该过程可评估为:

    1) TXBUF 为空

    2)------ >TX_DMA_REQ

    3)------------ >发送元素

    4)------------ >SPI 已接收数据

    5)---------------------------------- > RX_DMA_REQ

    6)------------------------------------------ > RX 元素复制数据

    和 Tx/RX DMA 数据包定义如下:

                                      TX                       RX
    初始源地址             ( uint32 )命令[0]     (uint32)&spiREG1->BUF
    初始目的地址          (uint32)&spiREG1->DAT1  (uint32) Spi1DmaRevData
    要触发的下一个 Ctrl 数据包+ 1      DMA_CH1 + 1            DMA_CH0 + 1
    帧  计数                    16.                      16.
    元素数量                   1                       1
    元素目标偏移量          0                       4.
    元件源偏移             4.                        0
    帧目的偏移量            0                        4.
    帧源偏移               4.                        0
    DMA 端口                       4.                         4.
    读取元素大小               ACCESS_32_BIT          ACCESS_32_BIT
    写入元素大小               ACCESS_32_BIT          ACCESS_32_BIT
    触发类型-帧/块          0                        0
    源的寻址模式      ADDR_OFFSET            ADDR_OFFSET
    针对目的 ADDR_OFFSET 的寻址模式            ADDR_OFFSET
    自动初始化模式                  0                         0

    谢谢、

    凯瑟琳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    对于采用多缓冲模式的 DMA,源地址和目的地址应为多缓冲 RAM,而不是 SPIDAT0/SPIDAT1或 SPIBUF (TRM 中的第28.7.1章)。
    我不知道您是如何使用 ADC 在收到命令后发送数据的(您能告诉我您使用的是什么 ADC)。 如何更改与之通信的 ADC (如何管理 CS)? 元件和帧计数应根据此进行设置。 有关帧和元素含义的更多信息、请参阅器件 TRM 的第16.2.2章。 寻址模式可以是:常量、后增量和索引(TRM 的第12.2.3章)。 您可以为源和要索引的目标(ADDR_OFFSET)选择两种模式、这样、地址将按照元素索引偏移寄存器和帧索引偏移寄存器中定义的 int 值进行加后增量。


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

    您好、Miro、

    感谢你的帮助。

    我的代码现在在多缓冲模式下工作、遵循您提供的 DMA 示例。

    我在这里还有几个问题。  在 TRM 第560页有两个注释:(1) SPI1、SPI3、SPI5在标准 SPI 模式下接收;(2) SPI1、SPI3、SPI5在标准 SPI 模式下发送。 我的问题是、如果我需要启动标准 SPI 双向转换、应该在标准模式下使用 SPI 传输的 DMA 请求、而不是 SPI 接收?  如果我想同时启动两个 SPI 双向转换、例如在 SPI1和 SPI3中、该怎么办? 我是否可以使用相同的 DMA 请求连接到不同的 DMA 通道、正如您所知、DMA 请求可以来自 SPI1、SPI3、SPI5?

    谢谢、

    凯瑟琳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    这些注释意味着、例如、如果您在标准模式下使用 SPI1、那么对于接收数据、您应该使用 DMAREQ[0]和传输 DMAREQ[1]。
    SPI 是同步串行接口。 在每个 SPI 时钟周期内、都会进行全双工数据传输。 如果要同时使用 DMA 进行接收和发送、则必须为接收分配 DMA 请求、并为发送到其他通道分配另一个 DMA 请求。

    此致、
    米罗