|
|
本帖最后由 inthsunshine 于 2023-5-14 10:17 编辑
单片机的SD功能挺有意思的,可以玩大容量存储
以前曾尝试用普通的SPI驱动TF卡,无奈跑TF需要协议,比I2C协议复杂多,它是基于命令-响应模式,SPI口只是完成数据发送和接收,而协议部分需要软件完成,占用CPU较多,帧的形成和解析都要软件实现,比较麻烦,而且只能工作于1位模式,性能和功能都受限,SPI模式不是个好东西,也许在某些场合可以用用
这次决定用支持硬件SD的CPU做块板,看看性能如何, 如果单纯的读写, 也有点无趣,所以自然想到把音频录音和播放加进去,增加点趣味性
拍照时彩屏没装上
常见的STM32 SDIO支持的SD卡协议版本是2.0,最高50MHz时钟(可能USB的关系,官方的启动文件设置成48M), 理论最大读写25MB/s; 象H7这种高端的可以支持4.2版本, 最大104MB/s,支持UHS-I
玩SD的核心就是读写,关键是所谓的识别过程,卡上电后处于空闲状态,通过命令使之进入传输状态,之后就可以读写数据,识别的流程在SD卡规范2.0里有详细的描述,这里就不重复,如果有兴趣建议看原版的规范,既详细也权威,不是网上某些资料可比的,因为有1.1和2.0的不同操作,网上搜出来可能是针对1.1,而这种卡基本看不到了(小等于2G的卡),另外提醒一下,官方标准库有个示例程序,据网上反应问题多多,我没用它的驱动,我都是完全自己写的,不过我看了官方的驱动,确实有些问题,感觉它是把老版本的驱动(1.1)更新成2.0发布的但又没更新全,还残留很多1.1的东西,有点坑人
SDIO连接线有CK(时钟), CMD(发送命令和接收响应),以及数据线D0-D3,在识别阶段,只需要发送命令和响应,大多数命令仅使用CK和CMD, 在数据传输(读写)时, 会用到D0-D3, 先在CMD发送读写命令,然后在D0-D3发送或者接收数据。
上电默认是1位模式,我测试了12MHz,24MHz,甚至48MHz时钟,都能正常读写,速度也正常,但切换到4位模式就收不到数据,反复检查,程序并没错,一头雾水
今天想起板子曾经有个元件没焊好导致彩屏无显示后来重焊解决, 于是把CPU所有管脚,TF卡座的所有引脚重新焊了一遍,居然4位模式可以工作了,真是无语 ,以前焊板子没出现过虚焊的问题,这次也许是锡膏抹少了或者管脚有氧化吧
最高时钟48MHz+4位模式,还是真的强悍啊,对于单片机,足够使用了,理论读写24MB/s, 读基本可以满速,写的话,老卡可能达不到,新点卡估计没问题
顺便把音频播放的代码加进去,播放正常,录音尚未测试,目前只是做个简单测试,先用44.1KHz/16位的WAV文件吧, 至于其它格式并非此板的重点,目前懒的弄
48MHz时钟信号,若播放常规格式WAV音频,1位模式+12M时钟都没问题,这时也有1.5MB/s的速度
读TF的长时基图,读写TF是以扇区为单位,一次512字节
读周期=1/44100 *(512/4)=2.9ms,和实测吻合
把上图看似尖脉冲的部分放大,实际是单块读的波形
读取1个扇区所需时间=1/48000000*(8/4)*512=21.33us
考虑到接收数据之前还需要发送命令以及程序运行时间,实际将大于上述时间
放大后,和前面2张一样是SDIO D3的数据
如此看来,读一个扇区时间小于25us, 挺快的,我手上的卡,比较老,电脑上测试也才10MB/s多的写入,估计放在板子上能到10M就很不错
硬件实现的确实不错
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|