SD卡SPI模式控制方式总结_第1页
SD卡SPI模式控制方式总结_第2页
SD卡SPI模式控制方式总结_第3页
SD卡SPI模式控制方式总结_第4页
SD卡SPI模式控制方式总结_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SD 卡 SPI 模式控制方式总结 值得参考 2010 08 01 14 04 1 SD 卡的命令格式 SD 卡的指令由6字节 Byte 组成 如下 Byte1 0 1 x x x x x x 命令号 由指令标志定义 如 CMD39为100111即16进制0 x27 那么 完整的 CMD39第一字节为01100111 即0 x27 0 x40 Byte2 5 Command Arguments 命令参数 有些命令没有参数 Byte6 前7位为 CRC Cyclic Redundacy Check 循环冗余校验 校验位 最后一位为停止位0 2 SD 卡的命令 SD 卡命令共分为12类 分别为 class0到 class11 不同的 SDd 卡 主控根据其功能 支持不同的命令集 如下 Class0 卡的识别 初始化等基本命令集 CMD0 复位 SD 卡 CMD1 读 OCR 寄存器 CMD9 读 CSD 寄存器 CMD10 读 CID 寄存器 CMD12 停止读多块时的数据传输 CMD13 读 Card Status 寄存器 Class2 读卡命令集 CMD16 设置块的长度 CMD17 读单块 CMD18 读多块 直至主机发送 CMD12为止 Class4 写卡命令集 CMD24 写单块 CMD25 写多块 CMD27 写 CSD 寄存器 Class5 擦除卡命令集 CMD32 设置擦除块的起始地址 CMD33 设置擦除块的终止地址 CMD38 擦除所选择的块 Class6 写保护命令集 CMD28 设置写保护块的地址 CMD29 擦除写保护块的地址 CMD30 Ask the card for the status of the write protection bits class7 卡的锁定 解锁功能命令集 class8 申请特定命令集 class10 11 保留 其中 class1 class3 class9 SPI 模式不支持 对 SD 卡的驱动主要有初始化 读 写 擦除等 1 初始化 步骤 1 延时至少74clock 2 发送 CMD0 需要返回0 x01 进入 Idle 状态 3 循环发送 CMD55 ACMD41 直到返回0 x00 进入 Ready 状态 如果是 MMC 此步应发送 CMD1 2 读 步骤 1 发送 CMD17 单块 或 CMD18 多块 读命令 返回0 x00 2 接收数据开始令牌0 xfe 或0 xfc 正式数据512Bytes CRC 校验2Bytes 默认正式传输的数据长度是512Bytes 可用 CMD16设置 3 写 步骤 1 发送 CMD24 单块 或 CMD25 多块 写命令 返回0 x00 2 发送数据开始令牌0 xfe 或0 xfc 正式数据512Bytes CRC 校验2Bytes 4 擦除 步骤 1 发送 CMD32 跟一个参数来指定首个要擦出的扇区号 SD 手册上说是块号 2 发送 CMD33 指定最后的扇区号 3 发送 CMD38 擦除指定区间的扇区 此3步顺序不能颠倒 还要注意发送 CMD 命令时 后面要跟一个字节的 CRC 校验数据 总之要保证每次发送的 数据包长度符合协议要求 命令 数 据符合时序要求 SD 卡在现在的日常生活与工作中使用非常广泛 时下已经成为最为通用的数据存储卡 在 诸如 MP3 数码相机等设备上也 都采用 SD 卡作为其存储设备 SD 卡之所以得到如此广泛的使用 是因为它价格低廉 存 储容量大 使用方便 通用性与安 全性强等优点 既然它有着这么多优点 那么如果将它加入到单片机应用开发系统中来 将使系统变得更加出色 这就要 求对 SD 卡的硬件与读写时序进行研究 对于 SD 卡的硬件结构 在官方的文档上有很详 细的介绍 如 SD 卡内的存储器结构 存储单元组织方式等内容 要实现对它的读写 最核心的是它的时序 笔者在经过了实际 的测试后 使用51单片机成功实 现了对 SD 卡的扇区读写 并对其读写速度进行了评估 下面先来讲解 SD 卡的读写时序 SD 卡 SPI 模式下与单片机的连接图 SD 卡支持两种总线方式 SD 方式与 SPI 方式 其中 SD 方式采用6线制 使用 CLK CMD DAT0 DAT3进行数据通信 而 SPI 方式采用4线制 使用 CS CLK DataIn DataOut 进行数据通信 SD 方式时的数据传输 速度与 SPI 方式要快 采用单片机对 SD 卡进行读写时一般都采用 SPI 模式 采用不同的初始化方式可以使 SD 卡工作于 SD 方 式或 SPI 方式 这里只对其 SPI 方式进 行介绍 2 SPI 方式驱动 SD 卡的方法 SD 卡的 SPI 通信接口使其可以通过 SPI 通道进行数据读写 从应用的角度来看 采用 SPI 接口的好处在于 很多单片机 内部自带 SPI 控制器 不光给开发上带来方便 同时也见降低了开发成本 然而 它也有 不好的地方 如失去了 SD 卡的性 能优势 要解决这一问题 就要用 SD 方式 因为它提供更大的总线数据带宽 SPI 接口的 选用是在上电初始时向其写入第 一个命令时进行的 以下介绍 SD 卡的驱动方法 只实现简单的扇区读写 1 命令与数据传输 SD 卡自身有完备的命令系统 以实现各项操作 写命令的例程 向 SD 卡中写入命令 并返回回应的第二个字节 unsigned char Write Command SD unsigned char CMD unsigned char tmp unsigned char retry 0 unsigned char i 禁止 SD 卡片选 SPI CS 1 发送8个时钟信号 Write Byte SD 0 xFF 使能 SD 卡片选 SPI CS 0 向 SD 卡发送6字节命令 for i 0 i 0 x06 i Write Byte SD CMD 获得16位的回应 Read Byte SD read the first byte ignore it do 读取后8位 tmp Read Byte SD retry while tmp 0 xff return tmp 2 初始化 SD 卡的初始化是非常重要的 只有进行了正确的初始化 才能进行后面的各项操作 在初 始化过程中 SPI 的时钟不能太 快 否则会造初始化失败 在初始化成功后 应尽量提高 SPI 的速率 在刚开始要先发送 至少74个时钟信号 这是必须的 在很多读者的实验中 很多是因为疏忽了这一点 而使初始化不成功 随后就是写入两 个命令 CMD0与 CMD1 使 SD 卡进入 SPI 模式 初始化例程 初始化 SD 卡到 SPI 模式 unsigned char SD Init unsigned char retry temp unsigned char i unsigned char CMD 0 x40 0 x00 0 x00 0 x00 0 x00 0 x95 SD Port Init 初始化驱动端口 Init Flag 1 将初始化标志置1 for i 0 i 0 x0f i Write Byte SD 0 xff 发送至少74个时钟信号 向 SD 卡发送 CMD0 retry 0 do 为了能够成功写入 CMD0 在这里写200次 temp Write Command SD CMD retry if retry 200 超过200次 return INIT CMD0 ERROR CMD0 Error while temp 1 回应01h 停止写入 发送 CMD1到 SD 卡 CMD 0 0 x41 CMD1 CMD 5 0 xFF retry 0 do 为了能成功写入 CMD1 写100次 temp Write Command SD CMD retry if retry 100 超过100次 return INIT CMD1 ERROR CMD1 Error while temp 0 回应00h 停止写入 Init Flag 0 初始化完毕 初始化标志清零 SPI CS 1 片选无效 return 0 初始化成功 转一篇文章 这些天没有出门 一直在家研究 SD 卡的 SPI 模式的初始化顺序 这里为大家总结了一下 编写该程序所需要的知识 SD 卡的官方资料 我承认这个资料很垃圾 比起民间的技术总结它的内容可谓又臭 又长 但是作为基础也要了解一下 SD 协议不用看 清晰明了的 MMC 卡时序图 虽然这个是 MMC 卡的 但是在初始化的时候 CMD0 的时序是一样的 电路 我用的 SD 卡的电路其实很简单 参考 SD 卡的官方资料中的电路链接就可以的 供电问题 由于 SD 卡的电压是3 3V 所以你的 CPU 必须支持3 3V 的 IO 端口输出 再来说一说鸡毛蒜皮的细节 1 为了使 SD 卡初始化进入 SPI 模式 我们需要使用的命令有3个 CMD0 ACMD41 CMD55 使用 ACMD 类的指令前应先发 CMD55 CMD55起到一个 切换到 ACMD 类命令的作用 2 为什么在使用 CMD0以后不使用 CMD1 CMD1是 MMC 卡使用的指令 虽然本文并 不想讨论 MMC 卡的问题 但是我还是要说 为了实现兼容性 上电或者发送 CMD0 后 应该首先发送 CMD55 ACMD41确认是否有回应 如果有回应则为 SD 卡 如果 等回应超时 则可能是 MMC 卡 再发 CMD1确认 正确的回应内容应该是 CMD0 0 x01 SD 卡处于 in idle state CMD55 0 x01 SD 卡处于 in idle state ACMD41 0 x00 SD 卡跳出 in idle state 完成初始化准备接受下一条指令 这里要说的是如果最后的回应内容还是0 x01的话 可以循环发送 CMD55 ACMD41 直到回应的内容0 x00 在所有的指令中 唯独 CMD0特殊 在向 SD 卡发送以前需要向 SD 卡发送74 个 时钟 那么为什么要74个 CLK 呢 因为在上电初期 电压的上升过程据 SD 卡组织的 计算约合64个 CLK 周期才能到达 SD 卡的正常工作电压他们管这个叫做 Supply ramp up time 其后的10个 CLK 是为了与 SD 卡同步 之后开始 CMD0的操作 严格按照此 项操作 一定没有问题 关于 SD 卡的 SPI 总线

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论