您好!
我已将 SPI DMA 配置为正常模式、以从外部 ADC 发送和接收数据。
但我希望持续接收 ADC 样本、因此我希望以乒乓式配置配置 SPI DMA 接收。
如何实现 DMA 交替配置、示例代码将很有帮助。
谢谢、
Shantanu S.
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.
您好!
我已将 SPI DMA 配置为正常模式、以从外部 ADC 发送和接收数据。
但我希望持续接收 ADC 样本、因此我希望以乒乓式配置配置 SPI 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.