原子例程SDIO移植经验及例程小错误

2019-07-21 00:51发布


     首先灰常感谢原子哥 ,一直以来对我在M3的路上帮助相当大,也就不多提了...
之前调了一个星期 F407 SDIO驱动,各种调试之后最后发现原子的例程是可以直接使用的
移植很简单,复制粘贴sdio_sdicard.c和.h  然后编译哪里不对改哪里,我也就不多提了...
   说说我之前移植成功后的问题,用查询模式就会写漏文件,用DMA模式程序直接挂在:等待DMA可配置
捣鼓了很久发现是自己工程的原因,平时我们的工程都会写好一个APP,把什么打开、读写、关闭文件什么乱七八糟的文件封装,然后SPI或者SDIO移植完后
直接循环调用APP的函数测试。问题就出现在这里,之前一直找不出来,实在没头绪后安装了个MDK5直接用原子例程SDIO跑,终于发现了这个无法理解的坑。
    例如APP里的写一个文件函数就是调用了f_mount,   f_open ,f_write,f_close等等,例如测读写速度就循环调用这函数。然后发现漏写文件,在线调试f_open返回了0x01,就是底层驱动错误,往里面跳发现是在打开文件时,读扇区0调用SDIO读写接口函数的时候,接受起始位发生了错误 [mw_shl_code=c,true]else if(SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) //接受起始位错误 { SDIO_ClearFlag(SDIO_FLAG_STBITERR);//清除错误标志 return SD_START_BIT_ERR; } [/mw_shl_code] 改用DMA模式,在线调试,直接在查询DMA的时候挂了, [mw_shl_code=c,true]while (DMA_GetCmdStatus(DMA2_Stream3) != DISABLE){}//等待DMA可配置[/mw_shl_code] 然后一直纠结在SDIO驱动各种配置里面,其实并不是。我们循环调用APP函数中,一直在调用f_mount挂载,虽然每次文件操作完成后都有注销掉,但是频繁地
调用挂载就是会出错,原因我也不知道,我又把SDIO的屏蔽掉换回SPI模式,然而循环调用并没有什么问题,也没有出现漏写文件或者是DMA挂掉什么的,还是
说只是SDIO模式下不能频繁调用?找不到相关资料,还是说我板子问题?求大神告知。    
     最后,把APP里面的所有挂载及注销SD卡的代码全屏蔽,在文件操作之前只挂载一次,问题就解决了。稀里糊涂的又回到原点,唉...

在调试过程中也发现了
原子哥例程的一个小问题,按原子哥例程代码跑下来的话应该是4位数据模式,然而MDK跑下来之后,SDIO_CLKCR寄存器值为176,而

宽总线模式是在12:11位,也就是说初始化中 [mw_shl_code=c,true]if(errorstatus==SD_OK)errorstatus=SD_EnableWideBusOperation(SDIO_BusWide_4b);[/mw_shl_code] 没有起作用,继续往里跳就会发现,在使能宽总线模式函数SD_Error SDEnWideBus(u8 enx)中错了,入口参数enx来于 [mw_shl_code=c,true]SDIO_BusWide_4b,而这个值是0x00000800,32位转8位,恒0,函数始终不能开启宽总线模式。u8 enx改成u32 enx,搞定,[/mw_shl_code] [mw_shl_code=c,true]读写又快了一点, 但是还是不理想,写只有800k,求大神总结下提速的方法,谢谢[/mw_shl_code]

    
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。