写一下这两天郁闷的SDIO调试。经历坎坷,但最终还是搞定了!!祝贺一下,老天总是在我快要放弃的时候才眷顾我一下。
把WIFI的驱动从103移植到205,刚开始感觉应该不难吧,都是STM的东西,但真正做下来才知道,F1XX ,F2XX相差还是很大的。SDIO,dma都有较大的区别,F2XX相对于F1XX有很多改进的地方,不是说不好,而是从F1XX直接跳到F2XX有点不适应。
首先说SDIO,103的SDIO是挂在AHB总线上的,而205的SDO是挂在APB总线上的,造成了它们的寄存器地址都不一样,在这上面就走了很多弯路。
还有DMA,这个改进的在多了,眨一看,以为不是一个公司的芯片,完全不同,205上增加了很多103上没有的东西,是让我迷惑的就是stream流,DMS FIFO,什么DMA1,DMA2各有8个streams,每个stream又可以选择8个通道。把我给彻底搞迷糊了。尤其是这个SDIO,居然SDIO通道可以map到stream3或者stream6上都可以,怎么搞的????
st为什么这么早,我也不清楚,但是据说可以避免DMA申请冲突,提升数据带宽等等等等,
由于出现了FIFO就可以实现DMA的目的地址,与源地址可以不对齐的,比如目的地址数据是32位的,源地址数据可以是8位的,完全可以在FIFO里面打散重组。这个不错,不过没有用到。
还有可以流控,这个可害惨我了,花了我几乎一下午的时间,调试这个东西。
单字节的命令读写都同有问题了,可是一到数据块BLOCK的读写就出现错误,看DMA的寄存器,总共16个了,发了12个停止了,记数器里还有4个没有发送。为什么没有发完,我一遍一遍的检查寄存器,没有问题呀,难道不是DMA的问题,是SDIO的问题?有可能,既然DMA没有问题,那一定是SDIO的问题。于是又详细的查看SDIO寄存器的各个位含义,但是还是没有发现不合适,错误的地方。没辙了,我把官方SDIO操作sd卡的例程,一句一句的对比,看看有什么不一样的地方,最后发现在什么突发模块的设置不一样,还有就是流控不一样,因为在103中根本就没有点两个概念,老程序里面也没有设置,所以我移植的时候也没怎么搭理它,结果悲剧出现在这。修改之后,运行,OK,
困惑我一天的问题就这么解决了。
好久没有调试这么底层的东西了,因为STM的库太好了,不需要我再去观察寄存器了,也许嵌入式最有魅力,也是最值钱的东西也就在这里!!!!!!!