摘自:上海嵌入式索漫科技培训教材 作者:下家山
一:SDIO简介
在介绍SDIO原理前,还是先来点SDIO知识的普及工作吧!
新兴的消费性电子产品不仅要求大容量,高速,而且要求数据的保密性。因此,美国MEI公司,美国SanDisk 公司,日本Toshiba 公司,组成联合小组推出SD Card协议规范。该协议规范定义了SD Memory Card和SDIO Card。
我们平常所说的SD卡即SD Memory Card(Secure Digital Memory Card安全数字存储卡),专为存储数据而设计。该协议规范定义了SD Memory 卡的电压范围为1.6~3.6V,默认模式下最大时钟为25Mhz,速率最大可达到12.5M字节/秒(4根数据线);高速模式下,最大时钟可达到50Mhz,速率最大可达到25M字节/秒(4根数据线)。并支持SPI传输模式。目前规范的V1.10版本最大容量只支持到2Gbyte,但未来可达到32Gbyte。
SDIO Card ,即Secure Digital Input/Output Card(安全数字输入输出卡),是与SD Memory Card兼容的一种卡。其兼容能力包括:机制,电气特性,功耗,信号,软件。SDIO Card是为高速数据I/O传输,低功耗移动电子设备而设计的。目前,应用在wifi,gps,gprs,条码扫描器等设备接口部分。其电压范围为2.0~3.6V。协议规范定义了两种类型的SDIO Card,即高速SDIO Card和低速SDIO Card。高速SDIO Card 支持SPI,1-bit SD 和4-bit SD 传输模式,其时钟最大可达到25Mhz,速率最大可达到10M字节/秒。低速SDIO Card,只需要SPI和1-bit SD 传输模式,4-bit模式可选,其时钟最大为400Khz。
二:深入SDIO
虽然,SDIO接口的产品越来越多,但相比SD Memory Card来说,网上的资料很少。也就是说,基本上要靠自己了,网络帮不了你什么忙!
S3C2410 datasheet中SDIO部分的介绍不够详细,很多部分仅仅提到,因此我怀疑sumsung们并不重视这一部分。或者说,他们不擅长这部分。
不管调试哪个从设备,第一步想到应该是去读出该设备的ID号,因为每个设备肯定是有ID号的,而且在其Datasheet中应该有说明,这是证明你读写寄存器最简单的方法了。对于很多I2C总线接口的设备,读出设备的ID号比较简单,只要读出存放该设备ID号的寄存器就OK了;但,针对SDIO接口规范,要读出SDIO卡的ID号,就不只操作一个寄存器这么简单了。因为,SDIO的最大速率达到10Mbyte,这么高的速率肯定是以其复杂的协议规范为代价的。
2.1 SDIO Signal Pins
三 读SDIO card ID 号
要读出ID号,需要对卡进行初始化工作。下面是我在S3c2410上调试conexant wifi card 时的初始化顺序
3.1 S3C2410—SDIO相关寄存器设置
对S3c2410的设置,要根据下列几种情况来考虑
1,polling方式;
2,interrupt 方式;
3,DMA方式;
因为,我最终是要用到DMA方式,所以我这里只介绍DMA方式的设置。(在调试过程中,一般是先从polling开始调试,因为其最简单)但,因初始化过程中只发送几个命令,所以,我还是采用的polling方式,即使用CMD53命令时,我才用到DMA。
而初始化时只需要设置rSDIPRE,rSDICON,rSDIDTIMER三个寄存器:
rSDIPRE:SDI 波特率设置寄存器,在发送数据前,波特率一般设置到400Khz;
rSDICON:SDI 控制寄存器,只需ByteOrder, FRST, CTYP置位;
rSDIDTIMER:数据超时寄存器;(等待SDI数据响应时间,一般设置到0xff00)
在设置完这些寄存器后应该delay 74个clock。
注意:发送每个命令前rSDICARG(命令参数寄存器),rSDICCON(命令控制寄存器)是必须设置的。
3.2 如何判断命令是否发送正确
命令发送后,需要根据rSDICSTA(命令状态寄存器), rSDIRSP0-3(命令响应寄存器)来判断是否正确响应。
rSDICSTA(命令状态寄存器)
如果,RspFin位置位,表示命令响应结束,但这并不代表命令响应正确,还有检测RspCrc, CmdTout 是否置位,如果置位则表示发生错误。(在发送cmd5时,crc位可以不管, 个人认为)在检测状态位的同时,还要判断RspIndex是否为你发送时的命令号。
rSDIRSP0-3(命令响应寄存器)要根据你所发送的命令来解析是否正确。
3.3 得到CIS 结构指针地址
3.3.1 什么是CIS
每个SDIO card 有一个CIS区域,在这个CIS区域内分成0-7八段,对应到FN0-FN7(Function Number 0-7)。而且,每个段的CIS都有一个CIS pointer(CIS 指针)指向其起始地址。(FN0-7代表每个SDIO卡支持功能数,发送CMD5后,响应R4的Number of I/O function 域指示卡所支持的最大功能号。即,如果Number of I/O function == 1,那么表示此卡支持FN0和FN1。FN0是每个卡都支持的,存放卡最基本的信息,Card Common Card Information Structure表示的就是这个意思,卡的ID号就存放在FN0所对应的CIS中,所以要读出卡的ID号,首先就要得到FN0所对应CIS的指针)
对,CIS(CIA)区域的读写操作是通过CMD52来实现的。
例:
我在得到conexant wifi card CIS指针时操作如下:
因为,卡ID号存放在common CIS内,所以我们需要操作FN0。根据SDIO协议规范FN0 CIS Pointer地址为0x09, 0x0A, 0x0B: