/*在调试dma的时候遇到不理解的问题,spi从机模式,接收主机的数据,第一个cs低电平搬运的数据是3个或5个FF 
另外使用正常的操作,读取dma剩余字节,关闭dma,处理数据,重新初始化dma,不要这段数据了,因为每次接收数据不固定 
执行这个操作时,dma第一次开启打不开,重新初始化也没用,关掉dma失能,第二次可以看到缓冲区有数据,但是接受字节为0 
无法进行依赖的操作 
/ 
/FF的问题还是没有解决,但是因为只有第一帧,所以把第一帧丢掉了,然后测试功能, 
从机额外一根引脚链接片选,检测cs上升沿信号(spi接受完一帧数据) 
使用十分平常的方法,进外部中断检测dma还剩多少数据未传输,以计算传输多少数据 
失能dma通道,处理接收的数据,然后重新配置dma目标地址,使数据从0地址开始,重复流程已接受处理不同长度的数据 
在调试过程中,失能dma通道后无法再次开启dma,尝试失能spidma接收标志,重置dma,重新初始化,重新失能dmamux模块 
都没有用,原本想重新写一个初始化,怀疑因为代码重重包装漏掉了那一步,但是查询参考手册,dma章节没有怎么设置目标地址 
源地址的递增这些,倒是有地址偏移和接收数据偏移。自己配置并没有成功 
于是联系厂家,在厂家调试后告诉我调用一个函数,然后好了 
函数里进行如下配置 
重置dma* 
(void)Dma_ResetChannel(pHWUnitCfg->u8TxDmaChannel); 
(void)Dma_ResetChannel(pHWUnitCfg->u8RxDmaChannel); 
等待spi空闲,移位寄存器无数据* 
while (0U != u32RegVal_SR); 
清楚接收和发送fifo* 
u32RegVal_FSR = ((Spi_GetFSRConfig()) & (SPI_FSR_TFCNT_U32 | SPI_FSR_RFCNT_U32)); 
****初始化spi 
****使能spi,spidubug标志 
****因为使用dma,所以使能spidma接收和发送 
 
- Discard all frames in FIFO *
 
Spi_CRConfig(pSpiDev->pHWUnitCfg->u8HWOffset, SPI_CR_SWRST_U32); 
 - Enable SPI *
 
Spi_CRConfig(pSpiDev->pHWUnitCfg->u8HWOffset, (SPI_CR_SPEN_U32 | SPI_CR_DBGEN_U32)); 
 - DMA Transmit and Receive Data Enable *
 
  if (STD_OFF != SPI_DMA_SUPPORT) 
 
if (FALSE != pSpiDev->pHWUnitCfg->u16UseDma) 
{ 
SPI_PTR[pSpiDev->pHWUnitCfg->u8HWOffset]->DER = (SPI_DER_RDMEN_U32 | SPI_DER_TDMEN_U32); 
} 
****再配置dma的接收发送目标地址 
****开启spidma发送 
相对这个步骤并没有初始化spi,没有清除发送接收缓冲区,另外确实有些中间变量标志位 
*/ 
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |