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

c6747的spi0 dma发送不成功问题

我在项目中用到了贵公司的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没有任何信号即没有数据发送出来

希望有更多的人看到这个帖子,帮助我解决这个问题。多谢各位!

赞(0)
未经允许不得转载:TI中文支持网 » c6747的spi0 dma发送不成功问题
分享到: 更多 (0)