Bug现象:采用SPI-DMA读写外部FLash,在Transmit端,发送260个字节的数据包,最后只发送了256个字节后,就执行了下一条指令。
问题分析:PSoC采用Descriptor作为容器来传递数据,每个Descriptor的容量为256字节,我们需要传输超过256个字节的数据,所以需要两个Descriptor级联,才能够进行传输。
目前的Bug现象,表示DMA只完成了一个Descriptor的传输,没有链接到第二个Descriptor。
问题排查:
1.通过英飞凌Descriptor的例程,把程序改成和例程一模一样后,通过观察波形,发现能够传输两个Descriptor的数据。
2.一句一句的,在现在的例程上面,恢复原来的程序,进行问题点的定位,定位问题在DMA_RX的中断配置问题。(客户TX与RX的传输,均依赖于DMA_RX中断)
3.问题定位在,仅传输单个的Descriptor(<256字节)的程序中,DMA_RX中断的interruptType属性配置问题,中断类型客户采用的是Trigger on descriptor completion,例程采用的是Trigger on completion of entire descriptor chain。
采用 Trigger on descriptor completion,则第一个Descriptor传输完毕之后,DMA传输就会停止;
采用 Trigger on completion of entire descriptor chain,则一个 Descriptor chain(Descriptor1+Descriptor2)传输完毕之后,DMA的传输才会停止;
所以问题在于我们目前的 SPI-DMA程序中,DMA的配置中 interruptType这一项设置错了,而导致的问题,修改完毕即可进行正常传输。 |