📄 sdcard.lst
字号:
C51 COMPILER V7.10 SDCARD 09/18/2007 10:28:29 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE SDCARD
OBJECT MODULE PLACED IN SDCard.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE SDCard.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //创建日期:2007/5/5
2 //作者:龚志
3
4
5 //
6 #include "SDCard.h"
7
8 //int1 HaveActSd = 0;
9
10 void delay8ms()
11 {
12 1 unsigned char i,j;
13 1 for(i=0;i<100;i++)
14 1 for(j=0;j<30;j++)
15 1 ;
16 1 }
17
18
19 //函数说明
20 //参数
21 //返回
22 void Assert_SPI_CS(char value)
23 {
24 1 SD_CS = value?1:0;
25 1 }
26
27
28
29 //函数说明 写一个字节到spi
30 //参数 写数据
31 //返回 成功返回NO_ERROR 失败返回超时
32 char WriteToSPI(unsigned char databyte)
33 {
34 1 unsigned char i;
35 1 unsigned char temp;
36 1 temp = databyte;
37 1 for(i=0;i<8;i++)
38 1 {
39 2 SD_SCK = 0; //SCK为低的时候准备传输的数据,为高的时候发送数据
40 2 if((temp & 0x80) != 0)
41 2 SD_MOSI = 1;
42 2 else
43 2 SD_MOSI = 0;
44 2 temp = temp << 1;
45 2 SD_SCK = 1;
46 2 }
47 1 SD_MOSI = 1;
48 1 return NO_ERROR;
49 1
50 1 }
51
52 //函数说明 从spi读一个数据
53 //参数 接受数据的指针
54 //返回 成功返回NO_ERROR 失败返回超时
55 char RdFromSPI(unsigned char *pdatabyte)
C51 COMPILER V7.10 SDCARD 09/18/2007 10:28:29 PAGE 2
56 {
57 1 int i;
58 1 bit bt;
59 1 unsigned char temp = 0;
60 1 for(i=0;i<8;i++)
61 1 {
62 2 SD_MISO = 1; //上跳沿读数据
63 2 SD_SCK = 0;
64 2 SD_SCK = 1;
65 2 temp = temp << 1;
66 2 bt = SD_MISO;
67 2 if(bt == 1) temp = temp | 0x1;
68 2 else temp = temp & 0xfe;
69 2 }
70 1 *pdatabyte = temp;
71 1 return NO_ERROR;
72 1 }
73
74
75
76 void ConvertInt4ToChar4(unsigned long length,unsigned char *para)
77 {
78 1 *para = (unsigned char)length;
79 1 *(para+1) = (unsigned char)(length>>8);
80 1 *(para+2) = (unsigned char)(length>>16);
81 1 *(para+3) = (unsigned char)(length>>24);
82 1 }
83
84 //函数说明 设置块长度
85 //参数 块长度
86 //返回 统一
87 char SetBlockLen(unsigned int length)
88 {
89 1 char ret;
90 1 unsigned char para[4];
91 1 unsigned char respond;
92 1 SD_CS = 0 ; // 置CS低
93 1 ConvertInt4ToChar4(length,para); //把长度转化为四字节参数
94 1 ret = SendCmd(16,para,R1,&respond); //发送CMD16即设置块长度命令
95 1 if(ret != NO_ERROR) //出错处理
96 1 {
97 2 SD_CS = 1;
98 2 return ERROR;
99 2 }
100 1 if(respond != 0) {SD_CS = 1;return ERROR;} //命令响应不为0表示有错误
101 1 SD_CS = 1;
102 1 return NO_ERROR;
103 1 }
104
105
106
107
108 //函数说明 读数据块
109 //参数
110 //返回值正确返回NO_ERROR ,不正确返回ERROR
111 char RDBlock(unsigned long addr, unsigned char *rbuf)
112 {
113 1 char ret;
114 1 unsigned char temp;
115 1
116 1 int i;
117 1 char respond, para[4];
C51 COMPILER V7.10 SDCARD 09/18/2007 10:28:29 PAGE 3
118 1 Assert_SPI_CS(0);
119 1 ConvertInt4ToChar4(addr,para); //参数转化
120 1 ret = SendCmd(17,para,R1,&respond); //发送读命令
121 1 if(ret != NO_ERROR) {Assert_SPI_CS(1);return ERROR;} //出错处理
122 1 if(respond != 0) {Assert_SPI_CS(1);return ERROR;} //响应错误
123 1 ret = RdFromSPI(&temp); //从spi读同步字节
124 1 while(temp == 0xff) //为FF表示SD忙
125 1 {
126 2 RdFromSPI(&temp);
127 2 }
128 1 if(temp != 0xfe) //同步字节错误后就重启SD卡
129 1 {
130 2 delay8ms();
131 2 Assert_SPI_CS(1);
132 2
133 2 InitialSD();
134 2 return ERROR;
135 2 }
136 1 for(i=0; i<=512-1; i++) //读512字节数据,数据出来的顺序 注意数据的顺序(应该是先低位后高位)
137 1 {
138 2 RdFromSPI(&rbuf[i]);
139 2 }
140 1 RdFromSPI(&temp); //读两字节的校验
141 1 RdFromSPI(&temp);
142 1 Assert_SPI_CS(1);
143 1 return NO_ERROR;
144 1
145 1 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 //函数说明 写一512字节到sd卡
161 //返回值 统一
162 //参数说明 addr地址 wbuf数据指针
163 char WriteBlock(unsigned long addr, unsigned char *wbuf)
164 {
165 1 char temp;
166 1 unsigned int j=0 ;
167 1 char ret;
168 1 int i;
169 1 char respond;
170 1 unsigned char para[4];
171 1 //print("addr:");
172 1 // printhex(addr);
173 1 //print("\r\n");
174 1 delay8ms();
175 1 Assert_SPI_CS(0);
176 1 ConvertInt4ToChar4(addr,para); //参数转化
177 1 ret = SendCmd(24,para,R1,&respond); //发送写命令
178 1 if(ret != NO_ERROR) {delay8ms();delay8ms();Assert_SPI_CS(1);InitialSD();return ERROR;} //注意:这两个时
-间延迟是需要的
C51 COMPILER V7.10 SDCARD 09/18/2007 10:28:29 PAGE 4
179 1 if(respond != 0x0 ) {Assert_SPI_CS(1);InitialSD();return ERROR;}
180 1
181 1 WriteToSPI(0xff); //写8个高脉冲
182 1
183 1 WriteToSPI(0xfe); //写同步字节
184 1
185 1 for(i=0; i<512; i++) //写512字节数据 注意写数据的顺序(应该是先低后高)
186 1 {
187 2 ret = WriteToSPI(wbuf[i]);
188 2
189 2 }
190 1 ret = WriteToSPI(0xff);
191 1 ret = WriteToSPI(0xff);
192 1
193 1 RdFromSPI(&temp); //数据回应正确值为OX1F
194 1
195 1
196 1 if((temp & 0x1f) == 0xb) //后面都为错处处理
197 1 {
198 2 delay8ms();
199 2 WriteToSPI(0xff);
200 2 Assert_SPI_CS(1);
201 2 InitialSD();
202 2 return ERROR;
203 2 }
204 1
205 1 else if((temp & 0x1f) == 0xd)
206 1 {
207 2 delay8ms();
208 2 WriteToSPI(0xff);
209 2 Assert_SPI_CS(1);
210 2 InitialSD();
211 2 return ERROR;
212 2 }
213 1
214 1 else if((temp & 0x1f) != 0x5)
215 1 {
216 2 delay8ms();
217 2 WriteToSPI(0xff);
218 2
219 2 Assert_SPI_CS(1);
220 2 InitialSD();
221 2 return ERROR;
222 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -