TI中文支持网
TI专业的中文技术问题搜集分享网站

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 工作人员的回答

Annie Liu:

为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上https://e2e.ti.com/support/microcontrollers/c2000/f/171,将由资深的工程师为您提供帮助。我们的E2E英文社区有TI专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。

chen zeng:

回复 Annie Liu:

就这么简单的修改例程,难道中文论坛的技术支持没法验证一下,主要是我英文不行,翻译成英文表述不清

user6447408:

回复 chen zeng:

您好,我单纯跑spi_ex2_dma_loopback 怎么读取不到SPI txbuf数据呢

赞(0)
未经允许不得转载:TI中文支持网 » F280049的SPI使用DMA无法正常使用
分享到: 更多 (0)