已回答假定已回答

ADSP-BF706 将SPI0配置成DMA模式出现问题

侯晓林 在 2016-7-15 詢問的問題
最後回覆由Rocky2016於2016-8-1提供

芯片型号:ADSP-BF706

 

问题描述:

SPI0配置成DMA模式,配置程序如下(发送字节数为100),运行程序,用示波器观察SPI0_CLKSPI0_MOSI,只有8个字节的时钟且SPI0_MOSI为低(TFIFO刚好8个字节,怀疑发送的是TFIFO);如果将发送字节数改为56,用示波器观察SPI0_CLKSPI0_MOSI,相应只有56个字节的时钟且SPI0_MOSI仍为低。

 

希望指导如何配饰SPIDMA,或者提供例程作为参考,谢谢!

 

注:SPI0的普通模式(非DMA模式)已经调试通过;UARTEPPIDMA也都调试通过。

 

附:配置程序

//SPI0及其DMA通道初始化

void spi0_initial(void)

{

    uint8_t temp_data=0x00;

    //---------------------------------------------------------//

    /*------SPI0配置------*/

    //控制寄存器配置

    *pREG_SPI0_CTL=*pREG_SPI0_CTL&0x00; //控制寄存器初始化清零

    //低位在前

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_MSB_FIRST;

    //数据位数16bit

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_SIZE08;

    //软件控制片选

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_SW_SSEL;//|ENUM_SPI_CTL_HW_SSEL;

    //时钟极性和相位

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_SCKLO;

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_SCKBEG;

    //开漏输出使能

    //*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_ODM_EN;

    //SPI作为主机

    *pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_MASTER;

    //---------------------------------------------------------//

    //发送控制寄存器配置

*pREG_SPI0_TXCTL=*pREG_SPI0_TXCTL&0x00;     //发送控制寄存器初始化清零

    //当发送缓存区空,则发送0

    *pREG_SPI0_TXCTL=*pREG_SPI0_TXCTL|ENUM_SPI_TXCTL_ZERO;

*pREG_SPI0_TXCTL=*pREG_SPI0_TXCTL|ENUM_SPI_TXCTL_TWC_EN;

*pREG_SPI0_TXCTL=*pREG_SPI0_TXCTL|ENUM_SPI_TXCTL_TTI_EN;

    //发送使能

*pREG_SPI0_TXCTL=*pREG_SPI0_TXCTL|ENUM_SPI_TXCTL_TX_EN;

 

    //发送字计数器,需要发送多少个

    *pREG_SPI0_TWC=*pREG_SPI0_TWC&0x00;

    *pREG_SPI0_TWC=0x64;

    //发送个数重载计数器

    //*pREG_SPI0_TWCR=*pREG_SPI0_TWCR&0x00;

    //---------------------------------------------------------//

    //接收控制寄存器配置

*pREG_SPI0_RXCTL=*pREG_SPI0_RXCTL&0x00;     //接收控制寄存器初始化清零

    //SPI_RFIFO,接收覆盖

*pREG_SPI0_RXCTL=*pREG_SPI0_RXCTL|ENUM_SPI_RXCTL_OVERWRITE;

*pREG_SPI0_RXCTL=*pREG_SPI0_RXCTL|ENUM_SPI_RXCTL_RWC_EN;

*pREG_SPI0_RXCTL=*pREG_SPI0_RXCTL|ENUM_SPI_RXCTL_RTI_EN;

    //接收使能

    *pREG_SPI0_RXCTL=*pREG_SPI0_RXCTL|ENUM_SPI_RXCTL_RX_EN;

 

    //接收字计数器,需要接收多少个

    *pREG_SPI0_RWC=*pREG_SPI0_RWC&0x00;

    *pREG_SPI0_RWC=0x64;

    //接收个数重载计数器

    //*pREG_SPI0_RWCR=*pREG_SPI0_RWCR&0x00;

    //---------------------------------------------------------//

    //发送速率配置,SCLK/(REG_SPI0_CLK)

*pREG_SPI0_CLK=100;     //1Mbit/s

 

    //发送延迟或超前配置

    *pREG_SPI0_DLY=*pREG_SPI0_DLY&0x00;

 

    //中断使能寄存器

*pREG_SPI0_IMSK_SET=*pREG_SPI0_IMSK_SET&0x00;

    //允许接收完成中断

    //*pREG_SPI0_IMSK_SET=*pREG_SPI0_IMSK_SET|BITM_SPI_IMSK_SET_RF|BITM_SPI_IMSK_SET_TF;

    //---------------------------------------------------------//

    //SPI0状态中断服务函数注册

    if(adi_int_InstallHandler(INTR_SPI0_STAT,SPI0SendHandler,

NULL,true) != ADI_INT_SUCCESS)

    {

        temp_data=0x55;

    }

 

    /***********************************************************/

    //-----SPI2的发送DMA4初始化配置-----

    //SPI0发送DMA设置,相应通道为DMA4

*pREG_DMA4_ADDRSTART=&SPI0TxBuf;    //发送缓冲区首地址

*pREG_DMA4_CFG=0x0000; //DMA4配置寄存器清零

    //内存传输宽度和外设传输宽度均为1Byte

*pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_MSIZE01|ENUM_DMA_CFG_PSIZE01;

 

    //使用数据缓存区的起始地址

*pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_LD_STARTADDR;//|ENUM_DMA_CFG_SYNC;

    //DMA4方向,从内存读数据送往外设SPI0_Tx

    *pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_READ;

    //停止模式

*pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_STOP;

    //DMA4中断使能

*pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_XCNT_INT;//|ENUM_DMA_CFG_PERIPH_INT;

    //SPI0发送DMA中断服务函数注册

    if(adi_int_InstallHandler(INTR_SPI0_TXDMA,SPI0TxDMAHandler,

NULL,true)!= ADI_INT_SUCCESS)     //DMA4中断

    {

        temp_data=0x55;

    }

 

    *pREG_DMA4_XCNT=0x64;

    *pREG_DMA4_XMOD=0x01;

    //DMA4通道使能

    *pREG_DMA4_CFG=*pREG_DMA4_CFG|ENUM_DMA_CFG_EN;

 

    /***********************************************************/

    //-----SPI0的接收DMA5初始化配置-----

    //SPI0接收DMA设置,相应通道为DMA5

*pREG_DMA5_ADDRSTART=&SPI0RxBuf;    //发送缓冲区首地址

*pREG_DMA5_CFG=0x0000; //DMA5配置寄存器清零

    //内存传输宽度和外设传输宽度均为1Byte

*pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_MSIZE01|ENUM_DMA_CFG_PSIZE01;

 

    //使用数据缓存区的起始地址

*pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_LD_STARTADDR;//|ENUM_DMA_CFG_SYNC;

    //DMA5方向,从外设SPI0_Rx接收数据并写入内存

    *pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_WRITE;

    //停止模式

*pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_STOP;

    //DMA5中断使能

*pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_XCNT_INT;//|ENUM_DMA_CFG_PERIPH_INT;

    //SPI0接收DMA5中断服务函数注册

    if(adi_int_InstallHandler(INTR_SPI0_RXDMA,SPI0RxDMAHandler,

NULL,true)!= ADI_INT_SUCCESS)     //DMA5中断

    {

        temp_data=0x55;

    }

 

    *pREG_DMA5_XCNT=0x64;

    *pREG_DMA5_XMOD=0x01;

    //DMA5通道使能

    *pREG_DMA5_CFG=*pREG_DMA5_CFG|ENUM_DMA_CFG_EN;

    //----------------------------------------------------------//

    //SPI0使能

*pREG_SPI0_CTL=*pREG_SPI0_CTL|ENUM_SPI_CTL_EN;      //接收控制寄存器配置

結果