最近调试QSPI控制器的flash驱动,遇到了一个问题:使用DMA方式读写flash,在写成功后,读校验阶段一直返回错误,发现错误的原因是读每页的最后一个字节数据丢失。
分析过程如下:
- 在读校验报错的地方,打断点或者加LOG找到报错的原因是按页读取操作,每页的最后一个字节数据一直是0
- 使用逻辑分析仪抓数据,发现QSPI写的数据和读出来的数据都是一样的,这个和代码报错的现象不同,说明QSPI总线上的数据收发是正确的,但是到代码这里buffer丢失了最后一个字节
- 不使用DMA方式的话,读写flash正常。
至此,问题到了buffer上,会不会是从DMA读到buffer过程中出现问题的呢?好在最后我们主管比我有经验,将问题放到了QSPI的时序上,虽然FLASH的手册上有时序图,但是没有注明发送地址和Dummy Clock之间需要加延时
然后找到了另一个FLASH的时序图做参考,虽然命令不同,但是看到在Dummy Cycles和Data之间有个tv保证了时序
于是在代码中加了一个delay的操作,这下DMA方式读QPSI flash没有丢失最后一个字节的数据,问题解决!