我在项目中用到了贵公司的tms320c6747 dsp芯片,现在需要用到spi的dma功能,但是一直没有调通。
我用的spi口是spi0,初始化流程以及dma初始化流程如下,调试过程中调用spi dma一直没有被正确触发,是因为spi初始化不正确还是spi0dmasenddata里面的spi dma通道配置不正确?麻烦帮忙看看。多谢了!
spi0初始化流程:
void SetupSPI0()
{
SPI0_SPIGCR0 = 0; // Reset the SPI by clearing the RESET bit
// in the SPI global control register 0 (SPIGCR0) to 0
delay(100);
SPI0_SPIGCR0 = 0x01; // Take the SPI out of reset by setting SPIGCR0.RESET to 1.
SPI0_SPIGCR1 = 0x00000003; // MASTER MODE.
SPI0_SPIPC0 = (1 << 11) | // SPIx_SOMI pin is a SPI functional pin.
(1 << 10) | // SPIx_SIMO pin is a SPI functional pin.
(1 << 9) | // SPIx_CLK pin is a SPI functional pin.
0; // SPIx_SCS[n] pin is a GPIO functional pin.
SPI0_SPIPC1 = 1; // SPIx_SCS[n]管脚方向为输出.
SPI0_SPIDAT1 = 0|
(1 << 28); // The chip select signal is held active
SPI0_SPIFMT0 = 0|
(1 << 16) | // SPI clock delay.
(4 << 8) | // SPI clock frequency = SPI module clock/(PRESCALE + 1)
8; // SPI data word length.
SPI0_SPIDELAY = 0|
(8 << 24)| // C2TDELAY
(8 << 16); // T2CDELAY
SPI0_SPIGCR1 |= (1 << 24); // SPI enable.
SPI0_SPIINT0 =0x10000;//使能DMA传输
}
调用spi dma的方法:
#define CSL_EDMA3_CHA_SPI0_TX 15
#define SPI0_TX_TCC 3
void spi0DmaSendData(u8 *pData, u32 len)
{
//清除之前可能存在的错误状态
edma3ccRegs->SECR = (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX; //clear previous bit CSL_EDMA3_CHA_UART0_RX to enable edma channel CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->SECR = (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX; //clear previous bit CSL_EDMA3_CHA_UART0_RX to enable edma channel CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->ECR |= (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX; //clear event CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->EMCR = (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX; //clear previous events in channel CSL_EDMA3_CHA_UART0_RX
edma3ccRegs->IECR |= (u32)0x1 << SPI0_TX_TCC;
// PaRAM parameter
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].OPT = 0x6| (1<<20) |(SPI0_TX_TCC<<12);
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].SRC = (u32)pData;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].A_B_CNT = (len<<16)|0x1;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].DST = (u32)&SPI0_SPIDAT1;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].CCNT = 1;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].LINK_BCNTRLD = 0xffff; // UART2_BUFBAK_BASE 's address
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].SRC_DST_BIDX = 0x1;
edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].SRC_DST_CIDX = (len<<16);
//设置中断以及使能DMA
edma3ccRegs->DRA[1].DRAE |= (u32)0x1 << SPI0_TX_TCC;
edma3ccRegs->IESR |= (u32)0x1 << SPI0_TX_TCC; //设置IER的第TCCbit为1,使能传输完毕中断
edma3ccRegs->EESR = (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX;
edma3ccRegs->ESR = (u32)0x1 << CSL_EDMA3_CHA_SPI0_TX;
}
调用方式:
u8 testreg[10];
spiDmaSendData((u8*)testreg,5);
现象:
调用spiDmaSendData函数后,我在ccs的watch窗口里面已经看到spi dma完成了,因为edma3ccRegs->PARAMSET[CSL_EDMA3_CHA_SPI0_TX].CCNT=0了。
但是spi的管脚没有任何数据输出,用示波器量从spi0DmaSendData调用到dma完成(可以在edma3cc中断处理函数里看到)这段时间,没有量到任何有效的clock和spi_simo
我的问题是:
请问为何dma没有被正确的触发,是因为spi初始化不正确还是spi0dmasenddata里面的spi dma通道配置不正确?
多谢您的解答!!!!
yin zhen:
好像没有配置PINMUX啊,另外应该先初步调试通一般的SPI发送后,再调试DMA方式啊。
rose zhong:
回复 yin zhen:
感谢楼上的回答
我的PINMUX7设置为0x11111000,spi0的普通spi发送与接收都没有任何问题。现在问题就是配置好spi0dma后,我在edma3cc_paramset[15]里面看到ccnt已经减到0了,也即spi0 dma完毕,但是spi0的clock和mosi没有任何信号即没有数据发送出来
希望有更多的人看到这个帖子,帮助我解决这个问题。多谢各位!