SD Card Driver介绍
部分资料来源于SD spec
1. SD basics
标准卡: 最大容量2 GB
大容量卡: Version2.0中支持2-32GB
Sector size: 512B
大容量卡工作电压范围: 2.7-3.6 V
时钟/传输速率:
Default: 0 - 25 MHz, 最大 12.5 MB/sec (4线SD bus)
高速:0 - 50 MHz, 最大 25 MB/sec (4线SD bus)
SD bus:
CMD, DATA[0…3], CLK, VDD, VSS
SPI bus:
DataIn,DataOut, CS, CLK, VDD, VSs
2. Registers
CID 128bit Card ID
RCA 16bit 卡相对地址,主机与卡通信时使用
DSR 16bit Driver 状态寄存器
可选的,default: 0x404
CSD 128bit 跟卡相关的特殊数据寄存器
Bit 0-1 支持的spec version 1表示支持version2.0高容量卡
CCC card command classes卡命令类别(一共11种)
READ_BL_LEN, WRITE_BL_LEN 支持的最大读/写块长度,从512到2048B
SECTOR_SIZE擦除的扇区数0表示1个扇区,1表示两个扇区…
C_SIZE计算卡容量
C_SIZE_MULT计算卡容量的因子
SCR 64bit 卡配置寄存器
在工厂出厂时设置,只读
SD_BUS_WIDTHS 支持的数据宽度 0101
SD_SPEC 2表示version2.0
OCR 32bit 操作条件寄存器
Bit15-23 VDD 电压
bit 30 Card Capacity Status 1 高容量卡 0 标准卡 (bit 31 = 1才有效)
bit 31 Card power up status bit 1 上电结束 0 上电没有结束
CSR 32bit 卡状态寄存器
执行一条命令后返回的错误和状态信息
SSR 512bit 卡状态寄存器
与CSR类似,扩展给一些新应用使用
3. Command
四种方式:
Broadcast commands, no response
Broadcast commands with response
Addressed(point to point) commands, no data transfer
Addressed(point to point) commands with data transfer on DAT lines
格式
Bit position | 47 | 46 | 45-40 | 39-8 | 7-1 | 0 |
描述 | Start bit(0) | Transmission bit(1) | Command index | Argument | CRC7 | End bit(1) |
CMD0 Reset cards to idle state
CMD2 查询CID寄存器
CMD3 请求卡发布一个新的RCA
CMD7 切换状态(Standby<->Transfer 或者 Programming <-> Disconnect)
CMD8 查询OCR寄存器(工作电压,Powerup status, 容量)
CMD12 强制卡停止传输
CMD13 发送状态寄存器到Host
CMD15 置卡于Inactive state
CMD16 设置卡的Block长度
CMD17 设置读一个Block Length
CMD18 设置读多个Block Length
CMD24设置写一个Block Length
CMD25设置写多个Block Length
CMD27 编程CSD
CMD55 表示后面的一个命令是Application specific
4. SW Architecture
5. Driver
以下使用SD bus方式
WriteCommand:
output32(COMMAND_ARG_ADDR, argument)
output32(COMMAND_ADDR, command)
ReadResponse:
Input32(RESPONSE_ADDR+Offset)
ReadRegister
WriteCommand, then ReadResponse
Card detection
可以使用一个GPIO来检测Card 的插入和拔出
注意需要有debounce的功能
Power On
给电源上电,
设置时钟频率
设置中断,FIFO
Reset card to idle state(CMD0)
Read register CID/OCR/RCA…
Power Off
Reset SD controller
Disable clock
断电
ReadBloc Data(Sector, TotalSectorNum)
设置 Data Length
设置一次读的扇区数长度
设置DataDir
准备传输接收
读FIFO数据
停止传输接收
WriteBlockData(Sector, TotalSectorNum, buf)
设置Data Length
设置一次写的扇区数
设置DataDir
准备传输接收
往FIFO写数据
停止传输接收