完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
芯片型号:ADSP-BF706
问题描述: 将SPI0配置成DMA模式,配置程序如下(发送字节数为100),运行程序,用示波器观察SPI0_CLK和SPI0_MOSI,只有8个字节的时钟且SPI0_MOSI为低(TFIFO刚好8个字节,怀疑发送的是TFIFO);如果将发送字节数改为5或6,用示波器观察SPI0_CLK和SPI0_MOSI,相应只有5或6个字节的时钟且SPI0_MOSI仍为低。 希望指导如何配饰SPI的DMA,或者提供例程作为参考,谢谢! 注:SPI0的普通模式(非DMA模式)已经调试通过;UART和EPPI的DMA也都调试通过。 附:配置程序 //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; //接收控制寄存器配置 |
|
相关推荐
1个回答
|
|
您可先浏览下论坛中其他有关ADSP-BF706 的提问及解答。
|
|
|
|
只有小组成员才能发言,加入小组>>
1003 浏览 2 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1393 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1941 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4275 浏览 2 评论
9068 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1551浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1700浏览 2评论
1003浏览 2评论
1681浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1394浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 17:36 , Processed in 0.854836 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号