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.

F280049的SPI使用DMA无法正常使用



请问技术支持:

单纯跑F280049的例程spi_ex2_dma_loopback完全正常,Spia在loopback模式下,DMA的CH5可以将发送缓冲区数组sdata[]中的数据搬运到SpiaRegs的spitxbuf中,然后又被CHa6从SpiaRegs的spirxbuf搬运到接收缓冲区数组rdata[]中。

现在要在该例程的基础上,关闭loopback模式,加入SPI的GPIO配置,让DMA来处理spia和spib中的数据,即DMA的CH5将发送缓冲区数组sdata[]中的数据搬运到SpibRegs的spitxbuf寄存器,发送到SpiaRegs的spirxbuf寄存器中,CH6再将数据搬运到接收缓冲区数组rdata[]中,但是不能正常运行。

通过调试发现,dma可以将数据从sdata搬运到SpibRegs的spitxbuf寄存器,该寄存器中的值为sdata数组的最后一位,且DMA CH5的conrol_reg寄存器的runsts位为0,表示DMA CH5完成搬运;SpiaRegs的spirxbuf寄存器的值也是sdata数组的最后一位,应该表明Spia和Spib能正常通信;

但DMA CH6却无法将spirxbuf中的数据搬运到接收缓冲区rdata中,DMA CH6的conrol_reg寄存器的runsts位为1,表示CH6一直在运转,但就是不搬运数据。

以下是DMA和SPI的相关配置代码,请高人指点,在使用这个例程前,我已经正常使用该F280049核心板的SPI发送接收数据,SPI可使用FIFO正常发送,能通过SPI正常接收STM32芯片发送的数据。

DMAInitialize();

DMASource = (volatile uint16_t *)sdata;
DMADest = (volatile uint16_t *)rdata;

//
// configure DMACH5 for TX
//
DMACH5AddrConfig(&SpibRegs.SPITXBUF,DMASource);
DMACH5BurstConfig(BURST,1,0); // Burst size, src step, dest step
DMACH5TransferConfig(TRANSFER,1,0); // transfer size, src step, dest step
DMACH5ModeConfig(DMA_SPIBTX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,
CHINT_END,CHINT_ENABLE);

//
// configure DMA CH2 for RX
//
DMACH6AddrConfig(DMADest,&SpiaRegs.SPIRXBUF);
DMACH6BurstConfig(BURST,0,1);
DMACH6TransferConfig(TRANSFER,0,1);
DMACH6ModeConfig(DMA_SPIARX,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,
CHINT_END,CHINT_ENABLE);

SpiaRegs.SPIFFRX.all=0x2040; // RX FIFO enabled, clear FIFO int
SpiaRegs.SPIFFRX.bit.RXFFIL = FIFO_LVL; // Set RX FIFO level

SpibRegs.SPIFFTX.all=0xE040; // FIFOs enabled, TX FIFO released,
SpibRegs.SPIFFTX.bit.TXFFIL = FIFO_LVL; // Set TX FIFO level

InitSpiaGpio();
InitSpibGpio();
//
// Initialize SPI-A
//
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back
//
SpibRegs.***.bit.SPISWRESET = 0;
SpibRegs.***.bit.CLKPOLARITY = 0;
SpibRegs.***.bit.*** = (16-1);

//
// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled
//
SpibRegs.***.bit.MASTER_SLAVE = 1;
SpibRegs.***.bit.TALK = 1;
SpibRegs.***.bit.CLK_PHASE = 0;
SpibRegs.***.bit.SPIINTENA = 0;

//
// Set the baud rate
//
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;

SpibRegs.SPIPRI.bit.FREE = 1;

//
// Release the SPI from reset
//
SpibRegs.***.bit.SPISWRESET = 1;

SpiaRegs.***.bit.SPISWRESET = 0;
SpiaRegs.***.bit.CLKPOLARITY = 0;
SpiaRegs.***.bit.*** = (16-1);

//
// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled
//
SpiaRegs.***.bit.MASTER_SLAVE = 0;
SpiaRegs.***.bit.TALK = 1;
SpiaRegs.***.bit.CLK_PHASE = 0;
SpiaRegs.***.bit.SPIINTENA = 0;

//
// Set FREE bit
// Halting on a breakpoint will not halt the SPI
//
SpiaRegs.SPIPRI.bit.FREE = 1;

//
// Release the SPI from reset
//
SpiaRegs.***.bit.SPISWRESET = 1;

看看到底是配置错误还是硬件BUG

希望得到TI 工作人员的回答