在阅读本文章之前,请先思考一下什么是总线,总线的作用是什么?相信大家都学过I2C总线,它由SCL和SDA两条线组成,通过这两条线就能完成各种通信。同样地,SD卡通信也需要有自己的总线模式。SD卡还比较牛逼,支持SD总线和SPI总线,老衲接触的比较多的是SD总线,所以这篇文章仅介绍SD总线,对于SPI总线老衲以后有机会再介绍。
SD总线:
大家都知道总线一般支持多种频率,在默认的频率下,SD总线支持一(主)对多(从)的模式,即支持一个HOST对多个SD卡的模式。但是,在高速和UHS-I,SD总线只能支持一对一的模式,即支持一个HOST对一个SD卡的模式。
问:那么对于一对多的模式,总线是如何找到相应的SD卡呢?
答:在SD卡初始化识别模式下,通过发送CMD3来获取RCA,即卡的逻辑地址,如果卡发现跟自己的逻辑地址是一致的,就会通过R6来响应。
SD总线协议:
SD总线是基于命令和数据的,开始于起始位,结束于结束位。Command和Response都是通过CMD线来传输的,Data是通过数据线来传输的。Command都是由主机(HOST)发起,Response都是由卡发出响应的。
数据的传输是以(Block)为单位的,数据块后面带有CRC校验位,图3-4描述了单块和多块的数据传输操作,多块数据传输通过Stop命令来结束数据传输操作。
因为HOST的速度总是比SD的速度要快,假如你往卡里面拼命写数据,这会出现什么问题?问题可大了,假如SD卡第一次都还没成功写完整,你就马上发第二次第三次的数据过来,那必将会造成数据的丢失,对吧。这就引申出了等待机制。HOST必须等待Card写完了,你才能继续发第二次数据传输。
那么,在SD总线的块写操作里,是通过Data0的信号状态指示卡是否Busy还是Ready的。
Command的内部编码格式:
Command命令都是由48bit组成的,每个命令的开始都是以‘0‘开始,以‘1‘结束的。每个命令都包含有CRC校验位,它的作用是,当数据传输发生错误时,可以重新重新发起操作。
Response的内部编码格式:
Response有四种编码模式,这取决于响应内容,长度为48bit或者136bit。由图3-7可知,当Response为R1、R3、R6时,响应长度为48bit,而Response为R2时,响应长度为136bit。并且在CMD线上传输都是先发送MSB,最后发送LSB,由于Command和Response都是在CMD线上传输的,所以它们都必须按照先发送MSB,最后发送LSB。这些规定都会在驱动里面被一个结构体封装掉,你知道是这么一回事就好了,不用特别在意。
SD卡的数据包格式:
1.Usual data (8 bit width):在字节之间先传输低字节后传输高字节,在字节里面先传输高位后传输低位。
2.Wide width data(SD卡寄存器):共有512bit,先传高位后传低位。
相应的数据格式这里就不贴图了,有兴趣的读者请查阅“Part_1_Physical_Layer_Specification_Ver3.00_Final_090416”的P28和P29,OK,这篇文章暂时聊到这里,精彩在后面哦。
SD3.0协议解读二