全部博文(204)
2012年(204)
分类: C/C++
2012-06-10 13:00:02
SD存储卡的物理参数,引脚定义以及数据传输的协议兼容MMC卡。SD存储卡的通信是基于一个高级的九针接口(时钟线,命令线,四针数据线,三针电源线),这个接口可以工作在最大频率25MHz和低电压范围。
SD控制器集成于芯片内部,用以与SD卡进行通信,实现系统的SD功能扩展。
1条CMD线,所有的命令和回应都是通过这条线一位一位的传输.不同模式或不同版本下,命令有不同含义.(SD(SD[0],SD[3:0]),SPI))
1条时钟线,时钟源是来自APH总线时钟
4条数据线,SPI模式下用了两条(一条输出,一条输入),SD的一位模式下一条(输出输入),也可以用完四条(输出输入,DATA[0]将分时复用).
SD卡是以块为单位,初始化时有配置,一般为512字节,一个扇区有4096个块.
SEP4020控制器:
封装了命令和数据的移位操作,支持SDI_1.0规范.有FIFO和DMA模式.当操作某些寄存器时,控制器会自动帮我们转换成48位的命令包通过移位控制器发给SD从机.
SD命令包格式
---------------------------------------------------------------------------------------------------------
Bit 位置 [47] [46] [45:40] [39:08] [07:01] [0]
Bit 宽度 1 1 6 32 7 1
值 0 1 x x x 1
说明 Start Bit Transmission Bit Command Index Argument CRC7 End Bit
----------------------------------------------------------------------------------------------------------
ACMD命令:
ACMD是特殊命令.虽然发送方法也是用SDICARG和SDICCON来发.但是,在发送特殊命令前,要先发送一条普通的不带参数的CMD55命令,表示下一条所发送的命令是特殊命令.
CID SD卡的唯一ID号
RCA SD的相对地址(SD卡已经保存在芯片内部)
CSD 该寄存器保存着SD卡的详细信息,如块大小,SD卡的容量大小,文件系统等信息.
SCR 该寄存器保存的SD的特殊性信息(例如支持的总线位宽,SD卡的版本),MMC卡没有此寄存器,获取该寄存器的数据需要从数据线读的.
OCR 该寄存器保存着SD的可供电范围,并且区别是否为HC卡(根据返回的ORC回应第30位是否置1).
CIA (Card I/O Area)
CIS (Card Information Structure)跟Linux内核的参数TagList的存放方式很相似,都是以标识号和长度加后续内容表示一个节点.
SD模式的命令说明:
CMD0 GO_IDLE_STATE Mandatory Mandatory Used to change from SD to SPI mode /* 使SD卡进入Idle状态 */
CMD2 ALL_SEND_CID Mandatory CID not supported by SDIO /* 广播获取卡的CID信息 */
CMD3 SEND_RELATIVE_ADDR Mandatory Mandatory /* 广播获取SD卡所分配的相对地址 */
CMD4 SET_DSR Optional DSR not supported by SDIO
CMD5 IO_SEND_OP_COND Mandatory
CMD6 SWITCH_FUNC Mandatory1 Mandatory1 Added in Part 1 v1.10
CMD7 SELECT/DESELECT_CARD Mandatory Mandatory /* 根据获取指定的RCA,选中SD卡,如果在选中一个卡的状态下,又选中其他的卡,那么之前的卡会自动取消选中,如果发送地址0,则表示取消选中全部卡 */
CMD9 SEND_CSD Mandatory CSD not supported by SDIO /* 获取SD相关的存储信息,如块大小,容量等. */
CMD10 SEND_CID Mandatory CID not supported by SDIO
CMD12 STOP_TRANSMISSION Mandatory /* 停止多块传输操作 */
CMD13 SEND_STATUS Mandatory Card Status includes only SDMEM information /* 获取卡的状态 */
CMD15 GO_INACTIVE_STATE Mandatory Mandatory
CMD16 SET_BLOCKLEN Mandatory /* 设置SD卡的块大小,CSD寄存器有描述. */
CMD17 READ_SINGLE_BLOCK Mandatory /* 使SD卡进入传输状态,读取单个块 */
CMD18 READ_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,读取多个块,直到收到CMD12为止 */
CMD24 WRITE_BLOCK Mandatory /* 使SD卡进入传输状态,写入单个块 */
CMD25 WRITE_MULTIPLE_BLOCK Mandatory /* 使SD卡进入传输状态,写入多个块 */
CMD27 PROGRAM_CSD Mandatory CSD not supported by SDIO
CMD28 SET_WRITE_PROT Optional
CMD29 CLR_WRITE_PROT Optional
CMD30 SEND_WRITE_PROT Optional
CMD32 ERASE_WR_BLK_START Mandatory
CMD33 ERASE_WR_BLK_END Mandatory
CMD38 ERASE Mandatory
CMD42 LOCK_UNLOCK Optional
CMD52 IO_RW_DIRECT Mandatory
CMD53 IO_RW_EXTENDED Mandatory Block mode is optional
CMD55 APP_CMD Mandatory /*特殊指令前命令,在发送ACMD类指令前,需要发送此命令 */
CMD56 GEN_CMD Mandatory
ACMD6 SET_BUS_WIDTH Mandatory /*设置SD卡的总线位宽,这个需要读取SCR确定*/
ACMD13 SD_STATUS Mandatory
ACMD22 SEND_NUM_WR_BLOCKS Mandatory
ACMD23 SET_WR_BLK_ERASE_COUNT Mandatory
ACMD41 SD_APP_OP_COND Mandatory /* 获取SD电压值 */
ACMD42 SET_CLR_CARD_DETECT Mandatory
ACMD51 SEND_SCR Mandatory SCR not supported by SDIO /* 获取SD卡的SCR寄存器的值 */