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