概述
随着项目中存储数据量的增加,之前用SPI通信模式读写SD卡数据效率有些低,已经跟不上大数据的收集,所以改用比SPI总线模式通信更加快速的SD总线模式通信,效率提高了几倍。现在简单介绍一下,也算是自己的备忘录。
嵌入式中,单片机与SD卡通信由两种模式:SPI总线通信模式;SD总线通信模式。
编号(按SD卡引脚) | SD总线模式 | SPI总线模式 | ||
名称 | 描述 | 名称 | 描述 | |
1 | DAT3 | 数据线3 | CS | 片选 |
2 | CMD | 命令/响应 | MOSI | 数据输入 |
3 | VSS1 | 电源地 | VSS1 | 电源地 |
4 | VDD | 电源 | VDD | 电源 |
5 | CLK | 时钟线 | SCK | 时钟线 |
6 | VSS2 | 电源地 | VSS2 | 电源地 |
7 | DAT0 | 数据线0 | MISO | 数据输出 |
8 | DAT1 | 数据线1 | / | / |
9 | DAT2 | 数据线2 | / | / |
值得注意的是SD总线模式中有4条数据线;SPI总线模式中仅有一条数据线(MOSI和MISO不能同时读数据,也不能同时写数据);这样在嵌入式中,单片机与SD卡通信时采用SD总线模式比SPI总线模式速度快几倍。SPI总线模式在之前的文章中介绍过,在这里主要介绍SD总线模式。
1、主机(单片机)发送命令:通过CMD线,48位数据。
主机与SD卡之间的所有通信都由主机控制。主机发送两种类型的命令:广播和寻址(点对点)命令。
①广播命令 广播命令适用于所有卡。其中一些命令需要响应。
②寻址(点对点)命令 被寻址的命令被发送到被寻址的卡并引起该卡的响应。
2、主机(单片机)接收响应:通过CMD线,48位数据或者136位数据。
响应是R1,R1b,R2,R3,R6,R7。详细介绍看技术手册,链接为!!!
3、主机(单片机)读写数据:通过DAT0-3线。
SD卡在SPI总线通信模式和SD总线通信模式下的操作模式是不同的,在这里主要介绍SD总线模式的操作模式。
卡状态与操作模式的概述
SD卡状态 | 操作模式 |
非活动状态 | 非活动 |
空闲状态 |
卡识别模式 |
就绪状态 | |
识别状态 | |
待机状态 |
数据传输模式 |
转移状态 | |
发送数据状态 | |
接收数据状态 | |
编程状态 | |
断开状态 |
SD卡识别模式
SD卡初始化和识别流程
SD卡数据传输模式
数据读取
当没有数据传输时,DAT总线电平由上拉提高。传输的数据块由开始位(1或4位LOW)组成,后面是连续的数据流。数据流包含有效载荷数据。数据流结束位(1或4位高)。数据传输与时钟信号同步。块的有效载荷面向数据传输由1或4位CRC校验和保护。
块读取-块读取是面向块的数据传输。数据传输的基本单位是一个最大的块大小总是512字节。小块的开始和结束地址完全包含在内在512字节内可以发送边界。无论READ_BL_LEN如何,由CMD16设置的块长度可以设置为512字节。每个块的末尾都会附加一个CRC,以确保数据传输的完整性。 CMD17启动一个块读取,并在完成传输后,卡片返回转移状态。 CMD18开始传输几个连续的块。块将不断传输,直到发出CMD12命令。
数据写入
数据传输格式与数据读取格式类似。对于面向块的写入数据传输,CRC校验位被添加到每个数据块。通过这种机制,写操作可以防止错误传输的数据。
块写入-在块写入期间(CMD24 - 27,42,56(w)),一个或多个数据块从主机传输到由主机在每个块末尾附加1或4位CRC的卡。卡支持块需要写CMD16设置的块长度为512字节,无论如何WRITE_BL_LEN被设置为1k或2k字节。
数据擦除
为了提高数据吞吐量,最好同时擦除许多写块。这些写入块的识别是通过CMD32,CMD33命令完成的。主机应遵守以下命令序列:ERASE_WR_BLK_START,ERASE_WR_BLK_END和ERASE(CMD38)。
最后
以上就是花痴夏天为你收集整理的SD卡中,比SPI总线模式通信更加快速的SD总线模式通信的全部内容,希望文章能够帮你解决SD卡中,比SPI总线模式通信更加快速的SD总线模式通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复