亿加合和智能车制作

标题: SD卡记录摄像头的一些坑和最终办法 [打印本页]

作者: ReDe    时间: 2018-3-3 21:55
标题: SD卡记录摄像头的一些坑和最终办法
这篇文章分享一下SD卡记录摄像头数据的一些代码和经验。
这篇文章实验的环境是K60。最终的方案是SPI + DMA写SD卡,最后会有代码。
    最早的时候,学长记录摄像头数据是用山外的SDHC库来写扇区,因为没有文件系统,电脑上没办法直接读取数据,然后用单片机再读出来发串口到调试助手上面去。感觉太过麻烦了,于是自己写了一个简易的FAT32文件系统,初始化的时候创建一个32MB的文件,拿到扇区地址,之后连续写摄像头数据,既不会因为文件系统影响写入时间,也不会突然断电而没有同步到文件。

    然而真正的问题并不在这里,写文件的时候最经常遇到的问题是,写入速度太慢,SDHC一次写入两个扇区的时间飘忽不定,一度达到8ms以上,有的时候会卡死在寄存器等待的地方,严重影响了程序的时序和逻辑。真正的困扰在于SDHC工作在25MHz都已经这么慢,何况SPI呢?
    真正的启发是在玩Arduino的时候,写了一个扇区 ,发现逻辑分析仪测得的时间只有2ms。Arduino使用的是8MHz SPI通信,竟然可以稳定在2ms的时间,发现问题并不在通信速度上。于是准备开始使用的SPI写SD卡,保持一个稳定的速度最为重要。但是在网上找了一圈也没有找到,SPI读写SD卡比较完善的库,只好把Arduino的那一套搬过来,把之前C++用C重写了一遍,移植到了K60上,直接把片选脚复用成GPIO,频率调到8MHz。连续写两个扇区大概只有3.5ms左右。SPI 25Mhz下和8Mhz下差距不过0.4ms,主要是SPI传输延迟(DT,PDT寄存器为0)已经达到极限,一味提高频率几乎没有任何收益。
[attach]92159[/attach]
    于是开始配置DMA,DMA跟SPI有一点很坑,SPI有长度为4的FIFO,DMA发送512字节,发到508字节时,DMA就触发中断了(其余的4 bytes 在FIFO里被后面清掉了),需要清掉FIFO,判断SD卡状态接着发下一个扇区,发送的时序完全一样,但是就是DMA写会失败,发现传输的字节数不一样,原来是DMA没有发完放到了FIFO里就触发了中断,只好重新用SPI计数寄存器判断才解决。
    本以为DMA写扇区已经大功告成了。因为SD卡发送完成时需要发送STOP TOKEN并等待2+ms左右,实际8MHz SPI传输完两个扇区的数据只用了不到1ms,我想先发送STOP TOKEN,然后进入程序逻辑,等处理完数据再进行等待。然而在DELAY 2ms以后,这段等待时间竟然还在!!!意味着这2ms的时间没办法被跳过,期间你必须不断发送0xff给SD卡时钟!!!
[attach]92160[/attach]
    最后想到一个办法,通过DMA发送这些数据,于是出于习惯,const uint8_t h_ff[] = {0xff};,把地址给DMA发送256个中断一次判断SD卡是否已经准备好了。这样就完全不消耗CPU时间了,然而却发现DMA发了一个就不发了,最后问题是去掉const就可以了,貌似DMA没办法发送flash上codata段的数据。。。
    至此几乎所有的坑都踩了一遍,成功了,期间很多折磨人的bug也不值得一一细说了。[attach]92156[/attach]
这是山外摄像头开启双缓冲下的表现,sd_fps是写入帧数
[attach]92158[/attach]
代码会自动在分区里按序号保存文件
[attach]92157[/attach]
python读取摄像头的数据,示例会包含在代码里,运行环境是Anaconda python3
[attach]92161[/attach]


作者: ReDe    时间: 2018-3-3 21:58
我使用的是8G C10的SD卡,跟卡也会有些许关系,自己斟酌
作者: 歪腰    时间: 2018-3-5 21:13
DSLogic好用吗?
作者: じ~凝眸处    时间: 2018-3-6 16:10
前排,前排。
作者: ReDe    时间: 2018-3-8 08:05
本帖最后由 ReDe 于 2018-3-8 08:08 编辑
歪腰 发表于 2018-3-5 21:13
DSLogic好用吗?

buffer模式400MHz采样,还是很好用的

作者: xiaoming2202    时间: 2018-3-8 14:56
楼主强
作者: 蒙哥马利    时间: 2018-3-22 23:09
66666666666666666666666
作者: 13127173361    时间: 2018-3-23 03:23
蒙哥马利 发表于 2018-3-22 23:09
66666666666666666666666

朋哥6666666666666666666666666666666666666





欢迎光临 亿加合和智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2