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.

[参考译文] RM57L843:SPI DMA Ping Pong 配置

Guru**** 2542790 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/981742/rm57l843-spi-dma-ping-pong-configuration

器件型号:RM57L843

您好!

我已将 SPI DMA 配置为正常模式、以从外部 ADC 发送和接收数据。

但我希望持续接收 ADC 样本、因此我希望以乒乓式配置配置 SPI DMA 接收。

如何实现 DMA 交替配置、示例代码将很有帮助。

谢谢、

Shantanu S.

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

    您好、Shantanu、

    对于 SPI 接收、DMA 传输的源地址是 SPI BUF 寄存器、该寄存器是固定的。 您可以在 DMA 中断通知或 SPI INT 通知中修改目标地址。

    dmaRAMREG->PCP[DMA_CH0].IDADDR =(uint32)&new_ADDR;

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

    您好!

    我是否需要禁用 DMA,然后执行缓冲区更改,然后重新启用 DMA? 因为我要更改控制数据包配置。

    此致、

    Shantanu S.

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

    您好、 Shantanu、

    请参阅 TRM 中的注释:

    注意:如果通道处于挂起状态、改变通道控制包的内容将清除相应的挂起位(第20.3.1.2节)。 如果活动通道的控制数据包(如第20.3.1.3节所示)发生更改、则该通道将立即在仲裁边界处停止。 当同一通道再次被触发时、它将从新的控制数据包信息开始。

    我想知道您何时或在什么情况下将 DMA 目标切换到其他缓冲区。

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

    您好!

    目前我正在 dmaGroupANotification()中切换缓冲区,下面是附加的代码。

    G_dmaCTRL stctrl_Rx;//控制数据包对象
    
    空 dmaGroupANotification (dmaInterrupt_t inttype、uint32通道)
    {
    
    /*在用户代码开始和用户代码结束之间输入用户代码。 *
    /*用户代码开始(8)*/
    if (inttype == lfs){
    if (channel =dma_ch0){
    ucRxThrDMAflag_g=1;//标志来指示用于处理缓冲区的 DMA 中断
    if (ePing_buff =ELastUsedBuff)
    {
    stctrl_rx.dADD =(uint32_t)&stDCDMAMeas_G.uiDMARxPong;//切换到 pong buff */
    ELastUsedBuff = ePONG_buff;
    EBuffToProcess = ePING_缓冲;
    dmaSetCtrlPacket (DMA_CH1、stDCDMAMeas_G.stctrl_Rx);
    CYCESS_PMU_CODE = 1;
    gioSetBit (hetPORT1、BIT23、1);//tp 28
    }
    其他
    {
    stctrl_rx.dADD =(uint32_t)&stDCDMAMeas_G.uiDMARxPing;//切换到 ping 缓冲区*/
    ELastUsedBuff = ePING_buff;
    EBuffToProcess = ePONG_buff;
    dmaSetCtrlPacket (dma_ch1、stctrl_Rx);
    
    }
    
    /*触发 DMA */
    dmaSetChEnable (DMA_CH0、DMA_HW);
    dmaSetChEnable (DMA_CH1、DMA_HW);
    spiREG1->GCR1 |=(1U <<24UL);
    spiREG1->INT0 |=(1U <<16UL);
    }
    }
    

    我已在初始化中初始化控制数据包对象、其代码如下所示;

    stctrl_rx.dADD =(uint32_t)&stDCDMAMeas_G.uiDMARxPing;//初始化 Rx 目标以 ping buff */
    ELastUsedBuff = ePING_buff;
    
    stctrl_rx.Sadd =(uint32_t)&(spiREG1->BUF);
    stctrl_Rx.CHCTRL = 0;
    stctrl_rx.FRCNT = count;
    stctrl_rx.ELCNT = 1;
    stctrl_rx.ELDOFFSET = 0; /*元素目标偏移*/
    stctrl_rx.ELSOFFSET = 0; /*元素目标偏移*/
    stctrl_rx.FRDOFFSET = 0; /*帧目的偏移*/
    stctrl_rx.FRSOFFSET = 0; /*帧目标偏移*/
    stctrl_rx.PORTASGN = PORTB_READ_PORTA_WRITE;
    stctrl_Rx.RDSIZE = ACCESS_16_BIT;
    STCTRL_Rx.WRSIZE = ACCESS_16_BIT;
    STCTRL_Rx.tType = FRAME_TRANSFRAME;/*传输类型 /stctrl_rx.ADDMODERD
    = ADDR_FIXED; 读取/*地址模式 /stctrl_rx.ADDMODEWR
    = ADDR_INC1; /*地址模式写入 //
    stctrl_rx.AUTOINIT = AUTOINIT_OFF; /*自动初始化 *
    
    dmaSetCtrlPacket (DMA_CH0、stDCDMAMeas_G.stctrl_TX);
    dmaSetCtrlPacket (DMA_CH1、stDCDMAMeas_G.stctrl_Rx);
    dmaEnableInterrupt (DMA_CH0、LFS、DMA_INTA);
    dmaEnableInterrupt (DMA_CH1、LFS、DMA_INTA);
    dmaEnable();//启用 DMA 

    我希望这已经足够了、我将以正确的方式来做。

    如果您想了解任何其他详细信息、请告诉我。

    此致、

    Shantanu S.

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

    请尝试您的代码。 如有任何问题、请告诉我。