经过反复试验发现,好像STR912的DMA机制存在Bug;
1. 下面的程序段居然可以通过, LED3亮
SSP0->DR=0; //1 向SSP0端口发送一个数据 Delay_us(100); //2 等待发送完成 for (i=0; i<8; i++) //3 读空SSP0 的FIFO中的数据,FIFO的深度为8 T0= SSP0->DR; StartDMA_Rx(RxBu,1); //4 启动读出SSP0的DMA DMA_Rx_WaitEnd; //5 等待DMA的完成 LED_ON(LED3); //6
如果去掉第1条语句,程序将会永远等待在语句5; 看来一次对SSP0->DR的写动作会导致,dma 控制器永久的记住有1个数据需要被读出; 尽管该Rx FIFO 数据确实已经被读空了.
2.接下来的实验,增加对SSP0->DR的写动作,看看是否会导致增加新的数据? 结果: 不会导致增加新的数据,永远只是多出1个数据; 3. 拜读了ST的文件<<STR91xF Errata sheet>>,是乎并不是这种现象的解释, 我是用的芯片标志是 KOR HP 631 应该是D 版.
2.4 BSPI transmit DMA request Description of limitation in Rev B The DMA Requests signals are active at power-up and cleared only when the SPI block is enabled. This can cause spurious DMA requests if the BSPI DMA channels are configured before enabling the BSPI block. Fixed in Rev D. The DMA Transmit Requests from BSPI are cleared (de-activated) at reset.
4. 处理办法: 在直接访问 SSP0端口的时候,关闭 SSP0 的DMA Rx使能; 仅当需要进行DMA数据接收的时候才使能SSP0 的DMA Rx. 问题可以避免。下面的代码会在语句5永远等待。
SSP_DMACmd(SSP0,SSP_DMA_Receive ,DISABLE); SSP0->DR=0; //1 向SSP0端口发送一个数据 Delay_us(100); //2 等待发送完成 for (i=0; i<8; i++) //3 读空SSP0 的FIFO中的数据,FIFO的深度为8 T0= SSP0->DR; SSP_DMACmd(SSP0,SSP_DMA_Receive,ENABLE); StartDMA_Rx(RxBu,1); //4 启动读出SSP0的DMA DMA_Rx_WaitEnd; //5 等待DMA的完成 LED_ON(LED3); //6
请熟悉ST ARM的专家或高手帮忙核实一下!
|