标签归档:单片机

51单片机实现对SD卡的读写

300ZS4SN

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。 SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应 用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的 存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写, 并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。

(1) SD卡的引脚定义

SD卡引脚功能详述:

引脚
编号
SD模式
        SPI模式
名称
类型
描述
名称
类型
描述
1
CD/DAT3
IO或PP
卡检测/
数据线3
#CS
I
片选
2
CMD
命令/
回应
DI
I
数据输入
3
VSS1
电源地
VSS
电源地
4
VDD
电源
VDD
电源
5
CLK
I
时钟
SCLK
I
时钟
6
VSS2
电源地
VSS2
电源地
7
DAT0
IO或PP
数据线0
DO
O或PP
数据输出
8
DAT1
IO或PP
数据线1
RSV
9
DAT2
IO或PP
数据线2
RSV

注:S:电源供给  I:输入 O:采用推拉驱动的输出
PP:采用推拉驱动的输入输出

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) 命令与数据传输
1. 命令传输
SD卡自身有完备的命令系统,以实现各项操作。命令格式如下:

命令的传输过程采用发送应答机制,过程如下:

每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

字节
含义
1
7
开始位,始终为0
6
参数错误
5
地址错误
4
擦除序列错误
3
CRC错误
2
非法命令
1
擦除复位
0
闲置状态
字节
含义
1
7
开始位,始终为0
6
参数错误
5
地址错误
4
擦除序列错误
3
CRC错误
2
非法命令
1
擦除复位
0
闲置状态
2
7
溢出,CSD覆盖
6
擦除参数
5
写保护非法
4
卡ECC失败
3
卡控制器错误
2
未知错误
1
写保护擦除跳过,锁/解锁失败
0
锁卡
字节
含义
1
7
开始位,始终为0
6
参数错误
5
地址错误
4
擦除序列错误
3
CRC错误
2
非法命令
1
擦除复位
0
闲置状态
2~5
全部
操作条件寄存器,高位在前

写命令的例程:

//--------------------------------------------
//  向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(0xFF);   
   //使能SD卡片选   
   SPI_CS=0;   
  
   //向SD卡发送6字节命令   
   for (i=0;i<0x06;i++)    
   {    
      Write_Byte_SD(*CMD++);   
   }   
      
   //获得16位的回应   
   Read_Byte_SD(); //read the first byte,ignore it.    
   do    
   {  //读取后8位   
      tmp = Read_Byte_SD();   
      retry++;   
read more

MCS-51单片机指令表

助 记 符 操  作  功  能 机  器  码 字节数 机器周期数
MOV  A,Ri 寄存器内容送累加器 E8~EF 1 1
MOV  Ri,A 累加器内容送寄存器 F8~FF 1 1
MOV  A,@Rj 片内RAM内容送累加器 E6,E7 1 1
MOV  @Rj,A 累加器内容送片内RAM F6,F7 1 1
MOV  A,direct 直接寻址字节内容送累加器 E5 nn地 2 1
MOV  direct,A 累加器内容送直接寻址字节 F5 nn地 2 1
MOV  direct,  Ri .寄存器内容送直接寻址字节 88~8Fnn地 2 2
MOV  Ri, direct 直接寻址字节内容送寄存器 A8~Afnn地 2 2
MOV  direct,@Rj 片内RAM内容送直接寻址字节 86, 87nn地 2 2
MOV  @Rj, direct 直接寻址字节内容送片内RAM A6, A7nn地 2 2
MOV  direct,direct 直接寻址字节内容送另一直接寻址字节 85 nn地源nn地目的 3 2
MOV  A,#data 立即数送累加器 74nn 2 1
MOV  Ri, #data 立即数送寄存器 78~7Fnn 2 1
MOV  @Rj, #data 立即数送片内RAMA 76.77nn 2 1
MOV  direct, #data 立即数送直接寻址字节 75nn地nn 3 2
MOV  DPTR,#data 16位立即数送数据指针寄存器 90nn高nn低 3 2
MOVX  A, @Rj 片外RAM内容送累加器(8位地址) E2,E3 1 2
MOVX  @Rj,  A 累加器内容送片外RAM(8位地址) F2,E3 1 2
MOVX  A, @DPTR 片外RAM内容送累加器(16位地址) E0 1 2
MOVX  @DPTR,  A 累加器内容送片外RAM(16位地址) F0 1 2
MOVC  A, @A+DPTR 相对数据指针内容送累加器 93 1 2
MOVC  A,  @A+PC 相对程序计数器内容送累加器 83 1 2
XCH  A, Ri 累加器与寄存器交换内容 C8~CF 1 1
XCH  A, @Rj 累加器与片内RAM交换内容 C6,C7 1 1
XCH  A,  direct 累加器与直接寻址字节交换内容 C5nn地 2 1
XCHD  A,  @Rj 累加器与片内RAM交换低直接内容 D6,D7 1 1
SWAP  A 累加器交换高半字节与低半字节内容 C4 1 1
PUSH  direct 直接寻址字节内容压入堆栈栈顶 C0nn地 2 2
POP   direct 堆栈栈顶内容弹出到直接寻址字节 D0nn地 2 2
ADD  A,  Ri 寄存器与累加器内容相加 28~2F 1 1
ADD  A,  @Rj 片内RAM与累加器内容相加 26,27 1 1
ADD  A,  direct 直接寻址字节与累加器内容相加 25nn地 2 1
ADD  A,  #data 立即数与累加器内容相加 24nn地 2 1
ADDC  A, Ri 寄存器与累加器与进位位内容相加 38~3F 1 1
ADDC  A, @Rj 片内RAM与累加器与进位位内容相加 36,37 1 1
ADDC  A,  direct 直接寻址字节与累加器与进位位内容相加 35nn地 2 1
ADDC  A,  #data 立即数与累加器与进位位内容相加 34nn地 2 1
SUBB  A,  Ri 累加器内容减寄存器与进位位内容 98~9F 1 1
SUBB  A,@Rj 累加器减片内RAM与进位位内容 96,97 1 1
SUBB  A, direct 累加器内容减直接寻址字节与进位位内容 95nn地 2 1
SUBB  A, #data 累加器内容减立即数与进位位内容 94nn地 2 1
INC  A 累加器内容加1 4 1 1
INC  Ri 寄存器内容加1 08~0F 1 1
INC  @Rj 片内RAM内容加1 06,07 1 1
INC  direct 直接寻址字节内容加1 05nn地 2 1
INC  DPTR 数据指针寄存器内容加1 A3 1 2
DEC  A 累加器内容减1 14 1 1
DEC  Ri 寄存器内容减1 18~1F 1 1
DEC  @Ri 片内RAM内容减1 16,17 1 1
DEC  direct 直接寻址字节内容减1 15nn地 2 1
DA  A 累加器内容十进制调整 D4 1 1
MUL  AB 累加器内容乘寄存器B内容 A4 1 4
DIV  AB 累加器内容除寄存器B内容 84 1 4
ANL  A,Ri 寄存器内容与累加器内容 58~5F 1 1
ANL  A,@Rj 片内RAM与累加器内容 56,57 1 1
ANL  A, direct 直接寻址字节内容与累加器内容 55nn地 2 1
ANL  direct,  A 累加器内容与直接寻址字节内容 52nn地 2 1
ANL  A, #data 立即数与累加器内容 54nn地 2 1
ANL  direct, #data 立即数与直接寻址字节内容 53nn地nn 3 2
ORL  A, Ri 寄存器内容或累加器内容 48~4F 1 1
ORL  A, @Rj 片内RAM内容或累加器内容 46,47 1 1
ORL  A, direct 直接寻址字节内容或累加器内容 45nn地 2 1
ORL  direct, A 累加器内容或直接寻址字节内容 42nn地 2 1
ORL  A, #data 立即数或累加器内容 44nn地 2 1
ORL  direct, #data 立即数内容或直接寻址字节内容 43nn地nn 3 2
XRL  A,  Ri 寄存器内容异或累加器内容 68~6F 1 1
XRL  A,  @Rj 片内RAM内容异或累加器内容 66,67 1 1
XRL  A,  direct 直接寻址字节内容异或累加器内容 65nn地 2 1
XRL  direct, A 累加器内容异或直接寻址字节内容 62nn地 2 1
XRL  A, #data 立即数异或累加器内容 64nn地 2 1
XRL  direct, #data 立即数异或直接寻址字节内容 63nn地nn 3 2
CPL  A 累加器内容取反 F4 1 1
CLR  A 累加器内容清零 E4 1 1
RL  A 累加器内容向左环移一位 23 1 1
RR  A 累加器内容向右环移一位 3 1 1
RLC  A 累加器内容带进位位向左环移一位 33 1 1
RRC  A 累加器内容带进位位向右环移一位 13 1 1
AJMP  addr  11 绝对转移(2KB地址内) 01~E1nn地 2 2
LJMP  addr  16 长转移(64KB地址内) 02nn高nn低 3 2
SJMP  rel 相对短转移(-128~+127B地址内) 80nn相对 2 2
JMP  @A+DPTR 相对长转移(64KB地址内) 73 1 2
JZ  rel 累加器内容为零转移 60nn相对 2 2
JNZ  rel 累加器内容不为零转移 70nn相对 2 2
CJNE  A, direct, rel 累加器内容与直接寻址字节内容不等转移 B5nn地 nn相对 3 2
CJNE  A, #data, rel 累加器内容与立即数不等转移 B4nn nn相对 3 2
CJNE  Ri, #data, rel 寄存器内容与立即数不等转移 B8~BFnn nn相对 3 2
CJNE  @Rj, #data, rel 片内RAM内容与立即数不等转移 B6,B7nn nn相对 3 2
DJNZ  Ri, rel 寄存器内容减1不为零转移 D8~DFnn相对 2 2
DJNZ  direct, rel 直接寻址字节内容减1不为零转移 D5nn地nn相对 3 2
ACALL  addr  11 绝对调子(2KB地址内) 11~F1nn地 2 2
LACALL  addr  16 长调子(64KB地址内) 12nn高nn低 3 2
RET 返主 22 1 2
RETI 中断返主 32 1 2
NOP 空操作 00 1 1
MOV  C,bit 直接寻址位内容送进位位 A2nn位 2 1
MOV  bit, C 进位位内容送直接寻址位 92nn位 2 1
CPL  C 进位位取反 B3 1 1
CLR  C 进位位清零 C3 1 1
SETB  C 进位位置位 D3 1 1
CPL  bit 直接寻址位去反 B2nn位 2 1
CLR  bit 直接寻址位清零 C2nn位 2 1
SETB  bit 直接寻址位置位 D2nn位 2 1
ANL  C, bit 直接寻址位内容与进位位内容 82nn位 2 2
ORL  C, bit 直接寻址位内容或进位位内容 72nn位 2 2
ANL  C, /bit 直接寻址位内容的反与进位位内容 B0nn位 2 2
ORL  C, /bit 直接寻址为内容的反或进位位内容 A0nn位 2 2
JC   rel 进位位为转移1 40nn相对 2 2
JNC  rel 进位位不为1转移 50nn相对 2 2
JB  bit, rel 直接寻址位为转移 20nn位nn相对 3 2
JNB  bit, rel 直接寻址位不为1转移 30nn位nn相对 3 2
JBC  bit, rel 直接寻址位为1转移且该位清零 10nn位nn相对 3 2