请问技术支持:
单纯跑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:
就这么简单的修改例程,难道中文论坛的技术支持没法验证一下,主要是我英文不行,翻译成英文表述不清