📄 sd.lst
字号:
C51 COMPILER V8.05a SD 06/15/2011 17:32:42 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN sd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sd.c BROWSE DEBUG OBJECTEXTEND TABS(5)
line level source
1 #include "STC12C5A60S2.H"
2 #include "sd.h"
3
4 void delay(unsigned int time)
5 {
6 1 while(time--);
7 1 }
8
9 //变量定义
10 //--------------------------------------------------------------
11 unsigned char is_init; //在初始化的时候设置此变量为1,
12 //同步数据传输(SPI)会放慢
13 //---------------------------------------------------------------
14
15 unsigned char bdata _dat;
16 sbit _dat7=_dat^7;
17 sbit _dat6=_dat^6;
18 sbit _dat5=_dat^5;
19 sbit _dat4=_dat^4;
20 sbit _dat3=_dat^3;
21 sbit _dat2=_dat^2;
22 sbit _dat1=_dat^1;
23 sbit _dat0=_dat^0;
24
25 /******************************************************************
26 - 功能描述:IO模拟SPI,发送一个字节
27 - 隶属模块:SD卡模块
28 - 函数属性:内部
29 - 参数说明:x是要发送的字节
30 - 返回说明:无返回
31 - 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高
32 ******************************************************************/
33
34 void SD_spi_write(unsigned char x)
35 {
36 1 _dat=x;
37 1
38 1 SD_SI=_dat7;
39 1 SD_SCL=0;
40 1 if(is_init) delay(DELAY_TIME);
41 1 SD_SCL=1;
42 1 if(is_init) delay(DELAY_TIME);
43 1
44 1 SD_SI=_dat6;
45 1 SD_SCL=0;
46 1 if(is_init) delay(DELAY_TIME);
47 1 SD_SCL=1;
48 1 if(is_init) delay(DELAY_TIME);
49 1
50 1 SD_SI=_dat5;
51 1 SD_SCL=0;
52 1 if(is_init) delay(DELAY_TIME);
53 1 SD_SCL=1;
54 1 if(is_init) delay(DELAY_TIME);
55 1
C51 COMPILER V8.05a SD 06/15/2011 17:32:42 PAGE 2
56 1 SD_SI=_dat4;
57 1 SD_SCL=0;
58 1 if(is_init) delay(DELAY_TIME);
59 1 SD_SCL=1;
60 1 if(is_init) delay(DELAY_TIME);
61 1
62 1 SD_SI=_dat3;
63 1 SD_SCL=0;
64 1 if(is_init) delay(DELAY_TIME);
65 1 SD_SCL=1;
66 1 if(is_init) delay(DELAY_TIME);
67 1
68 1 SD_SI=_dat2;
69 1 SD_SCL=0;
70 1 if(is_init) delay(DELAY_TIME);
71 1 SD_SCL=1;
72 1 if(is_init) delay(DELAY_TIME);
73 1
74 1 SD_SI=_dat1;
75 1 SD_SCL=0;
76 1 if(is_init) delay(DELAY_TIME);
77 1 SD_SCL=1;
78 1 if(is_init) delay(DELAY_TIME);
79 1
80 1 SD_SI=_dat0;
81 1 SD_SCL=0;
82 1 if(is_init) delay(DELAY_TIME);
83 1 SD_SCL=1;
84 1 if(is_init) delay(DELAY_TIME);
85 1 }
86
87 /******************************************************************
88 - 功能描述:IO模拟SPI,读取一个字节
89 - 隶属模块:SD卡模块
90 - 函数属性:内部
91 - 参数说明:无
92 - 返回说明:返回读到的字节
93 ******************************************************************/
94
95 unsigned char SD_spi_read() //SPI读一个字节
96 {
97 1 SD_SO=1;
98 1
99 1 SD_SCL=1;
100 1 if(is_init) delay(DELAY_TIME);
101 1 SD_SCL=0;
102 1 if(is_init) delay(DELAY_TIME);
103 1 _dat7=SD_SO;
104 1
105 1 SD_SCL=1;
106 1 if(is_init) delay(DELAY_TIME);
107 1 SD_SCL=0;
108 1 if(is_init) delay(DELAY_TIME);
109 1 _dat6=SD_SO;
110 1
111 1 SD_SCL=1;
112 1 if(is_init) delay(DELAY_TIME);
113 1 SD_SCL=0;
114 1 if(is_init) delay(DELAY_TIME);
115 1 _dat5=SD_SO;
116 1
117 1 SD_SCL=1;
C51 COMPILER V8.05a SD 06/15/2011 17:32:42 PAGE 3
118 1 if(is_init) delay(DELAY_TIME);
119 1 SD_SCL=0;
120 1 if(is_init) delay(DELAY_TIME);
121 1 _dat4=SD_SO;
122 1
123 1 SD_SCL=1;
124 1 if(is_init) delay(DELAY_TIME);
125 1 SD_SCL=0;
126 1 if(is_init) delay(DELAY_TIME);
127 1 _dat3=SD_SO;
128 1
129 1 SD_SCL=1;
130 1 if(is_init) delay(DELAY_TIME);
131 1 SD_SCL=0;
132 1 if(is_init) delay(DELAY_TIME);
133 1 _dat2=SD_SO;
134 1
135 1 SD_SCL=1;
136 1 if(is_init) delay(DELAY_TIME);
137 1 SD_SCL=0;
138 1 if(is_init) delay(DELAY_TIME);
139 1 _dat1=SD_SO;
140 1
141 1 SD_SCL=1;
142 1 if(is_init) delay(DELAY_TIME);
143 1 SD_SCL=0;
144 1 if(is_init) delay(DELAY_TIME);
145 1 _dat0=SD_SO;
146 1
147 1 return (_dat);
148 1 }
149
150 /******************************************************************
151 - 功能描述:向SD卡写命令
152 - 隶属模块:SD卡模块
153 - 函数属性:内部
154 - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
155 - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
156 ******************************************************************/
157
158 unsigned char SD_Write_Cmd(unsigned char *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
159 {
160 1 unsigned char temp,time=0;
161 1
162 1 SD_CS=1;
163 1 SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持
164 1 SD_CS=0;
165 1
166 1 SD_spi_write(pcmd[0]);
167 1 SD_spi_write(pcmd[1]);
168 1 SD_spi_write(pcmd[2]);
169 1 SD_spi_write(pcmd[3]);
170 1 SD_spi_write(pcmd[4]);
171 1 SD_spi_write(pcmd[5]);
172 1
173 1 do
174 1 {
175 2 temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
176 2 time++;
177 2 }while((temp==0xff)&&(time<TRY_TIME));
178 1
179 1 return(temp);
C51 COMPILER V8.05a SD 06/15/2011 17:32:42 PAGE 4
180 1 }
181
182 /******************************************************************
183 - 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
184 - 隶属模块:SD卡模块
185 - 函数属性:外部,供用户调用
186 - 参数说明:无
187 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义)
188 ******************************************************************/
189
190 unsigned char SD_Reset()//SD卡复位,进入SPI模式,使用CMD0(命令0)
191 {
192 1 unsigned char time,temp,i;
193 1 unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95}; //命令0的字节序列
194 1
195 1 is_init=1; //将is_init置为1
196 1
197 1 SD_CS=1; //关闭片选
198 1 for(i=0;i<0x0f;i++) //复位时,首先要发送最少74个时钟信号,这是必须的!!!
199 1 {
200 2 SD_spi_write(0xff); //120个时钟
201 2 }
202 1
203 1 SD_CS=0; //打开片选
204 1
205 1 time=0;
206 1 do
207 1 {
208 2 temp=SD_Write_Cmd(pcmd);//写入CMD0
209 2 time++;
210 2 if(time==TRY_TIME)
211 2 {
212 3 SD_CS=1; //关闭片选
213 3 return(INIT_CMD0_ERROR);//CMD0写入失败
214 3 }
215 2 }while(temp!=0x01);
216 1
217 1 SD_CS=1; //关闭片选
218 1
219 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
220 1 return 0;//返回0,说明复位操作成功
221 1 }
222
223 /******************************************************************
224 - 功能描述:初始化SD卡,使用CMD1
225 - 隶属模块:SD卡模块
226 - 函数属性:外部,供用户调用
227 - 参数说明:无
228 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
229 ******************************************************************/
230
231 unsigned char SD_Init() //初始化,使用CMD1(命令1)
232 {
233 1 unsigned char time,temp;
234 1 unsigned char pcmd[] = {0x41,0x00,0x00,0x00,0x00,0xff}; //命令1的字节序列
235 1
236 1 SD_CS=0; //打开片选
237 1
238 1 time=0;
239 1 do
240 1 {
241 2 temp=SD_Write_Cmd(pcmd);
C51 COMPILER V8.05a SD 06/15/2011 17:32:42 PAGE 5
242 2 time++;
243 2 if(time==TRY_TIME)
244 2 {
245 3 SD_CS=1; //关闭片选
246 3 return(INIT_CMD1_ERROR);//CMD1写入失败
247 3 }
248 2 }while(temp!=0);
249 1
250 1 is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度
251 1
252 1 SD_CS=1; //关闭片选
253 1
254 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
255 1 return(0); //返回0,说明初始化操作成功
256 1 }
257
258 /****************************************************************************
259 - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中
260 - 隶属模块:SD卡模块
261 - 函数属性:外部,供用户调用
262 - 参数说明:addr:扇区地址
263 buffer:指向数据缓冲区的指针
264 - 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
265 - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
266 ****************************************************************************/
267
268 unsigned char SD_Write_Sector(unsigned long addr,unsigned char *buffer) //向SD卡中的指定地址的扇区写入512
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -