Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2676380
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 嵌入式

2015-01-27 14:08:28


http://blog.csdn.net/tanxs001/article/details/6091320

SDIO 

       SDIO 卡是在 SD 内存卡接口的基础上发展起来的接口, SDIO 接口兼容以前的 SD 内存卡,并且可以连接 SDIO 接口的设备,目前根据 SDIO 协议的 SPEC  SDIO 接口支持的设备总类有蓝牙,网卡,电视卡等。

       SDIO 协议是由 SD 卡的协议演化升级而来的,很多地方保留了 SD 卡的读写协议,同时 SDIO 协议又在 SD 卡协议之上添加了 CMD52  CMD53 命令。由于这个, SDIO  SD 卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开始来支持低速 I/O 能力。低速卡支持类似调制解调器 , 条形码扫描仪和 GPS 接收器等应用。高速卡支持网卡,电视卡还有“组合”卡等,组合卡指的是存储器 +SDIO 

       SDIO  SD 卡的 SPEC 间的又一个重要区别是增加了低速标准。 SDIO 卡只需要 SPI  1  SD 传输模式。低速卡的目标应用是以最小的硬件开支来支持低速 I/O 能力,低速卡支持类似 MODEM ,条形扫描仪和 GPS 接收器等应用。对组合卡来说,全速和 4BIT 操作对卡内存储器和 SDIO 部分都是强制要求的。

       在非组合卡的 SDIO 设备里,其最高速度要只有达到 25M ,而组合卡的最高速度同 SD 卡的最高速度一样,要高于 25M

 

SDIO 总线

       SDIO 总线和 USB 总线类似, SDIO 总线也有两端,其中一端是主机( HOST )端,另一端是设备端( DEVICE ),采用HOST- DEVICE 这样的设计是为了简化 DEVICE 的设计,所有的通信都是由 HOST 端发出命令开始的。在 DEVICE 端只要能解溪 HOST 的命令,就可以同 HOST 进行通信了。

       SDIO  HOST 可以连接多个 DEVICE ,如下图所示 :

 

 

       这个是同 SD 的总线一样的 , 其中有如下的几种信号

1.        CLK 信号 :HOST  DEVICE 的时钟信号 .

2.        CMD 信号:双向的信号,用于传送命令和反应。

3.        DAT0-DAT3 信号 : 四条用于传送的数据线。

4.        VDD 信号 : 电源信号。

5.        VSS1  VSS2: 电源地信号。

 SDIO 总线定义中 ,DAT1 信号线复用为中断线。在 SDIO  1BIT 模式下 DAT0 用来传输数据, DAT1 用作中断线。在 SDIO  4BIT 模式下 DAT0-DAT3 用来传输数据,其中 DAT1 复用作中断线。

 

SDIO 命令:

       SDIO 总线上都是 HOST 端发起请求,然后 DEVICE 端回应请求。其中请求和回应中会数据信息。

1.        Command: 用于开始传输的命令,是由 HOST 端发往 DEVICE 端的。其中命令是通过 CMD 信号线传送的。

2.        Response: 回应是 DEVICE 返回的 HOST 的命令,作为 Command 的回应。也是通过

CMD 线传送的。

3.        Data: 数据是双向的传送的。可以设置为 1 线模式,也可以设置为 4 线模式。数据是通过 DAT0-DAT3 信号线传输的。

   SDIO 的每次操作都是由 HOST  CMD 线上发起一个 CMD ,对于有的 CMD  DEVICE 需要返回 Response ,有的则不需要。

       对于读命令,首先 HOST 会向 DEVICE 发送命令,紧接着 DEVICE 会返回一个握手信号,此时,当 HOST 收到回应的握手信号后,会将数据放在 4 位的数据线上,在传送数据的同时会跟随着 CRC 校验码。当整个读传送完毕后, HOST 会再次发送一个命令,通知 DEVICE 操作完毕, DEVICE 同时会返回一个响应。

       对于写命令,首先 HOST 会向 DEVICE 发送命令,紧接着 DEVICE 会返回一个握手信号,此时,当 HOST 收到回应的握手信号后,会将数据放在 4 位的数据线上,在传送数据的同时会跟随着 CRC 校验码。当整个写传送完毕后, HOST 会再次发送一个命令,通知 DEVICE 操作完毕, DEVICE 同时会返回一个响应。

 

SDIO 的寄存器:

      SDIO 卡的设备驱动 80% 的任务就是操作 SDIO 卡上的有关寄存器。 SDIO 卡最多允许有 7 个功能( function  , 这个同其功能号是对应的( 0  7  , 每个功能都对应一个 128K 字节大小的寄存器,这个见下面的图。功能号之所以取值范围是 1~7 ,而没有包含 0 ,是因为功能 0 并不代表真正的功能,而代表 CIA 寄存器,即 Common I/O Area ,这个纪录着 SDIO 卡的一些基本信息和特性,并且可以改写这些寄存器。其中地址 0x1000~0x17fff  SDIO 卡的 CIS 区域,就是基本信息区域, Common Information Structure 。初始化的时候读取并配对 SDIO 设备。

       这些寄存器的详细分区已经其对应的功能,在开发过程中都是需要仔细研读的,这些都在协议的 SPEC 中都有详细说明,这里就不在罗索了。  

 


CMD52 命令:

SDIO 设备为了和 SD 内存卡兼容, SD 卡所有 Command  Response 完全兼容,同时加入了一些新的 Command Response 。例如,初始化 SD 内存卡使用 ACMD41 ,而 SDIO 卡设备则用 CMD5 通知 DEVICE 进行初始化。

但二者最重要的区别是, SDIO 卡比 SD 内存卡多了 CMD52  CMD53 命令,这两个命令可以方便的访问某个功能的某个地址寄存器。

CMD52 命令是 IO_RW_DIRECT 命令的简称,其命令格式如下

首先第一位为 0, 表明是起始位,第二位为传输方向,这里为 1 ,代表方向为 HOST  DEVICE 设备传送,其后 6 位为命令号,这里是 110100b ,用十进制表示为 52  CMD52 的名字也由此而来。紧接着是读写标志位。

      然后是操作的功能号。也就是 function   number 。如果为 0 则指示为 CCCR 寄存器组。

       紧接着是寄存器地址,用 17 指示,由于功能寄存器有 128K 地址, 17 位正好能寻址。

       再下来 8  Write data or Staff Bits 的意思是说,如果当前为写操作,则为数据,否则 8 位为填充位。无意义。

       最后 7 位为 CRC 校验码。最后一位为结束位 0 

       对于 CMD52  Response  48 位,命令格式如下:

 

       总结下, CMD52 是由 HOST 发往 DEVICE 的,它必须有 DEVICE 返回来的 Response  CMD52 不需要占用 DAT线,读写的数据是通过 CMD52 或者 Response 来传送。每次 CMD52 只能读或者写一个 byte 

 

CMD53 命令:

CMD52 每次只能读写一个字节,因为有了 CMD53 对读写进行了扩展, CMD53 允许每次读写多个字节或者多个块(BLOCK)  CMD53 的命令格式如下:

       第一位是 1, 为开始位,然后是一位方向位,总是 1 ,代表方向为 HOST  DEVICE 设备传送,其后 6 位为命令号,这里是 110101b ,用十进制表示为 53  CMD53 的名字也由此而来。

       然后是 1 位的读写标志。接着是 3 位功能号,这个同 CMD52 都是相同的。 Block   Mode 如果 1 代表是块传输模式,否则为字节传输模式。

       OP Code 为操作位,如果是 0 ,代表数据往固定的位置读写,如果 1 代表是地质增量读写。例如,对地址 0 固定读写 16个字节,相当于 16 次读写的地址 0 ,而对地址 0 增量读写 16 个字节,相当于读写 0~15 地址的数据。

       然后是 17 位的地址寄存器,可以寻址到 128K 字节的地址,然后是 9 位的读写的计数,对于字节读取,读写大小就是这个计数,而对于块读写,读写的大小是计数乘以块的大小。

       随后的 7 位为 CRC 校验码。最后一位为 1 

       当读写操作是块操作的时候,块的大小是可以通过设置 FBR 中的相关寄存器来设置。

        CMD52 命令不同的是, CMD53 没有返回的命令的,这里判断是否 DEVICE 设备读写完毕是需要驱动里面自己判断的,一般有 2 个方法, 1. 设置相应的读写完毕中断。如果 DEVICE 设备读写完毕,则对 HOST 设备发送中断。2.HOST 设备主动查询 DEVICE 设备是否读写完毕,可以通过 CMD 命令是否有返回来判断是否 DEVICE 是否读写完毕。

阅读(821) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~