zrl
发表于 2024-11-16 16:22:59
本帖最后由 zrl 于 2024-11-16 23:12 编辑
响应R7和CMD8
使用CMD8可以向总线的所有卡说明主机支持的电压工作范围,如果范围与SD卡的工作范围一致则卡返回R7响应,否则卡将不返回响应,且OCR寄存器的第31位将不会置1,导致SD卡初始化失败。
zrl
发表于 2024-11-16 16:44:54
本帖最后由 zrl 于 2024-11-16 21:12 编辑
卡的初始化过程
配置卡并使其进入tran状态的过程称为卡的初始化,到tran状态前时钟线的频率不高于400kHz
左括号为当前工作状态,右括号为下一状态
zrl
发表于 2024-11-16 17:05:05
将卡设置到tran状态后,使用CMD17和CMD24发送对应扇区的地址即可使用DAT0向sd卡读写512字节。要想提升速度,可以发送和CMD6和ACMD6设置速度等级和拓展数据总线(DAT0到DAT3)。如果卡里有DSR寄存器,还可以在stby状态时使用CMD4,改变SD卡管脚的驱动能力,增加带宽
zrl
发表于 2024-11-16 17:22:05
CMD17单扇区读,sdio2.0扇区大小固定为512字节,使用CMD17发送地址(RCA<<16)即可读取512字节数据,crc为crc16,算法为crc16-xmodem,读取数据时要求不高,可忽视crc16,发送格式如下图,单线和4线读写的格式与单线spi和QSPI类似,不同点只有,开始位和结束位,以及4线crc16的计算和传输方式。
四线crc16的计算方式,比如DAT0你要将DAT0上发送的所有数据位按顺序写入一个缓冲区,大小为128字节,对缓冲区的数据使用crc16-xmodem计算其crc16,最后在dat0这一条线上发送它的crc16结果,意思就是对应数据线上的数据的crc16。
也许这就是stm32的spi为什么会有crc7的原因吧
zrl
发表于 2024-11-16 17:22:05
CMD24单扇区写,数据格式与读取时是一样的但是crc16一定要算对。使用cmd24发送完结束位的两个时钟后sd卡会在DAT0线上返回一个Token(也可称为校验结果)格式为
一位开始位0,3位数据,一位结束位1,如果数据为101则你的crc16是错的,sd卡将缓冲区数据全部抛弃;如果是010那么在接下来的几个时钟,sd将拉低DAT0表示忙,同时将接收缓冲区的数据写入flash。
在数据总线上写数据,必须在发送完cmd24后等待至少两个时钟后写,可以不等响应。
zrl
发表于 2024-11-16 17:37:27
读写时可读取响应R1获取卡状态表的第八位(READY_FOR_DATA)来判断sd卡是否能读写。建议GPIO模拟读SD卡时不接收响应,因为响应和数据会同时在总线上出现。
没有响应的命令需要在发送完命令后向总线发送几个时钟(一般为8),确保其能正常接收下一个命令
sdio2.0数据传输时,通过CMD6将可以进入高速模式(也要看卡支不支持),使时钟频率最高达到50MHz,理论上在四线模式下极限传输速率可以达到25MB/s(没写错,大写的).
如果是sdio3.0的高端卡,理论极限传输速度可达104MB/s
zrl
发表于 2024-11-16 20:34:11
sdio详细规范中提到一些操作的间隔时钟数,比如上电时要向总线发送至少74个时钟,确保sd卡工作在工作电压。连续读取块的时候,假如主机想处理数据,规范里规定了主机在哪些时间可以停止时钟的发送。又比如发送完命令后多少个时钟后SD卡会发送响应,这些都在详细规范里有。对我们编写sdio的代码,和查看波形十分重要
神农鼎
发表于 2024-11-17 19:18:00
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10542&page=1&extra=#pid104095
zrl
发表于 2025-2-19 17:14:21
sd_wave.sr记录了从初始化到使用cmd17读取单块数据的波形,可以用pulseview打开,以放大细致的观看。
果粒陈
发表于 2025-4-16 09:21:18
zrl 发表于 2024-11-16 11:55
命令
sdio的命令有两种CMD和ACMD,是用来控制卡工作的,比如切换卡的工作电压(CMD11),切换卡的数据线数 ...
你好,截图的这个软件是什么软件呀?