sd卡记录

首先
检测是否有卡插入
有个上电有个等待上电完成
设置SPI速度为低速 对寄存器spi的设置
先产生>74个脉冲,让SD卡自己初始化完成
发送循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态,超时退出。返回的是r1 0x01

CMD0 CMD8 CMD55+ACMD41 cmd1 cmd16 cmd58 cmd9 cmd17 cmd18 cmd23 cmd24 cmd25
cmd7 表示选中或者取消选中卡
CMD12 表示停止传输
Transfer 状态 理解为 可以进行传输操作模式
Programming状态理解为继续传输状态即传输完成

若没有超时
发送CMD8获取卡片的SD版本信息,
若果回应的是0x05,卡片版本信息是v1.0版本的
发卡初始化指令CMD55+ACMD41,如果有应答,说明是SD卡,且初始化完成。 没有回应,说明是MMC卡,额外进行相应初始化
发送CMD55,回复0x01。
发送ACMD41,mmc不回复,sd卡回复0x00
如果是mmc卡,,还要发送cmd1,把MMC卡初始化命令(没有测试),收到回复为0x00
将spi设置为高速。
发送cmd16来设置Sector Size,收到回复为0x00

如果回复的是0x01下面是V2.0卡的初始化
    CMD8命令后会传回4字节的数据,要跳过再结束本命令,
    四个字节用来判断该卡是否支持2.7V-3.6V的电压范围。
    发送CMD55,回复0x01。
    发送ACMD41,sd卡回复0x00
    鉴别SD2.0卡版本
    发送cmd58命令,收到回复0x00,读取ocr的值。
    读OCR指令发出后,紧接着是4字节的OCR信息
        检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC,如果CCS=1:SDHC   CCS=0:SD2.0
    设置spi为高速

读操作
先进行有无卡的检测
设置速度为高速
如果是单个块读,首先将块转换为字节,然后发送cmd17命令,crc为0. 顺序是命令 地址 crc
如果接收到的是0xFF,(还是高电平证明还在忙)等待响应,或超时退出,如接收到0x00则读成功了,
接下来如果接收数据0xFE,则开始接收数据,知道长度接收完成。
然后释放spi的片选
如果是多块读操作。
首先将块转换为字节,然后发送cmd18命令,crc为0. 顺序是命令 地址 crc,顺序是命令 地址 crc
开始接收,待所有块接收完成后释放spi的片选

写操作
单字写
设置速度为高速
将块地址转换为字节,然后发送cmd24命令,crc为0. 顺序是命令 地址 crc
如果接收到的是0xFF,(还是高电平证明还在忙)等待响应,或超时退出,如接收到0x00则读成功了,
先放置3个空数据,即24个空时钟,等待sd卡准备好。
然后发送0xFE作为数据的开始
开始传输写数据
等待两个byte的空周期,等待回复一个0x05
等待写完成。
多块写
设置为高速模式
然后发送cmd23命令,crc为0. 顺序是命令 块多少 crc
将块地址转换为字节,然后发送cmd25命令,crc为0. 顺序是命令 地址 crc,收到0x00回复
先放置3个空数据,即24个空时钟,等待sd卡准备好。
放起始令牌0xFC 表明是多块写入
开始写数据,写完一块后,中间等待两个byte的空周期,等待回复一个0x05,
等待写完即回复0xFF
发结束传输令牌0xFD,收到回复为0x00表示传输正确。
等待线上重新出现0xFF。

ioctl操作
获取磁盘的容量
发送cmd9命令,crc为0xFF,得到回应为0x00.
开始接收CSD字段。有128位,即16个字节。从开始接收到0xFE作为数据的开始。直到接受完。

猜你喜欢

转载自blog.csdn.net/qq_28219531/article/details/77069545