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.

TMS320F28377D: SPI和dma配合使用,传输结束rx fifo总是会留有2个数据DMA没有传输,怎么能让spiRX fifo中的数据全部传输完成。

Part Number: TMS320F28377D

spi配置

SpibRegs.SPICCR.bit.SPISWRESET = 0;
SpibRegs.SPICCR.all = 0x004F; 

SpibRegs.SPICTL.all = 0x0006; 
SpibRegs.SPISTS.all = 0x0000; 
SpibRegs.SPIBRR.all= 0x0001;

//增加FIFO
SpibRegs.SPIFFTX.all =0xE040 ;
SpibRegs.SPIFFRX.all =0x2040 ;

SpibRegs.SPIFFTX.bit.TXFFIL = 1; // Set TX FIFO level
SpibRegs.SPIFFRX.bit.RXFFIL = 1; // Set TX FIFO level

SpibRegs.SPIPRI.bit.FREE = 1;
SpibRegs.SPICCR.bit.SPISWRESET = 1;

dma 配置

DMACH5AddrConfig((volatile UINT16*)(&SpibRegs.SPITXBUF),(volatile UINT16 *)m_u16DmaTxData);
DMACH5BurstConfig(0,1,0); // Burst size, src step, dest step
DMACH5TransferConfig(1,1,0); // transfer size, src step, dest step

DMACH5ModeConfig(DMA_SPIBTX,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,
CHINT_END,CHINT_ENABLE);

DMACH6AddrConfig((volatile UINT16*)m_u16DmaTxData,(volatile UINT16 *)(&SpibRegs.SPIRXBUF));
DMACH6BurstConfig(0,0,1); // Burst size, src step, dest step
DMACH6TransferConfig(1,0,1); // transfer size, src step, dest step


DMACH6ModeConfig(DMA_SPIBRX,PERINT_ENABLE,ONESHOT_ENABLE,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,
CHINT_END,CHINT_ENABLE);

在dma传输结束后,RX_FIFO中总是发现有两个(SPIFFRX.bit.RXFFST =2)没传出,请问有什么办法让dma把RX_FIFO中的数据都读出来。

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    从您给出的DMA 传输配置来看,比较奇怪的是,传输大小设置为1。 这代表 DMA 通道将在传输2个16位字后被禁用。 CPU 必须在每2个16位字后重新使能 DMA 通道。 通常情况下会将传输大小设置为等于TRANSFER_SIZE = (NUM_WORDS/RXFFIL) - 1。 DMA 通道会不会有可能没有使能最终传输? 

    TRM中有以下描述:

    When Continuous mode is disabled (MODE.CHx[CONTINUOUS] = 0), DMA state machine disables channel after all bursts in a transfer loop (TRANSFER_COUNT = 0) are complete. The channel must be re-enabled by setting the RUN bit in the CONTROL register before another transfer can be started on that channel.

    此外,工程师还注意到 SPI 配置为非常快地运行,因为 SPIBRR 设置为1。 请问您尝试实现的 SPI 频率是多少?