📄 sdx.lst
字号:
164 - 功能描述:向SD卡写命令
165 - 隶属模块:SD/SDHC模块
166 - 函数属性:内部
167 - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
168 - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
169 ******************************************************************/
170
171 unsigned char SD_Write_Cmd(unsigned char *pcmd)
172 {
173 1 unsigned char temp,time=0;
174 1
175 1 SD_CS=1;
176 1 SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持
177 1 SD_CS=0;
178 1
179 1 SD_spi_write(pcmd[0]);
C51 COMPILER V8.05a SDX 11/03/2010 20:37:00 PAGE 4
180 1 SD_spi_write(pcmd[1]);
181 1 SD_spi_write(pcmd[2]);
182 1 SD_spi_write(pcmd[3]);
183 1 SD_spi_write(pcmd[4]);
184 1 SD_spi_write(pcmd[5]);
185 1
186 1 do
187 1 {
188 2 temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
189 2 time++;
190 2 }while((temp==0xff)&&(time<TRY_TIME));
191 1
192 1 return(temp);
193 1 }
194
195 /******************************************************************
196 - 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
197 - 隶属模块:SD/SDHC模块
198 - 函数属性:内部
199 - 参数说明:无
200 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sdx.h中有定义)
201 ******************************************************************/
202
203 unsigned char SD_Reset()
204 {
205 1 unsigned char time,temp,i;
206 1 unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};
207 1
208 1 is_init=1; //is_init置为1,让SPI速度慢下来
209 1
210 1 SD_CS=1;
211 1 for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
212 1 {
213 2 SD_spi_write(0xff); //120个时钟
214 2 }
215 1
216 1 SD_CS=0;
217 1 time=0;
218 1 do
219 1 {
220 2 temp=SD_Write_Cmd(pcmd);//写入CMD0
221 2 time++;
222 2 if(time==TRY_TIME)
223 2 {
224 3 return(INIT_CMD0_ERROR);//CMD0写入失败
225 3 }
226 2 }while(temp!=0x01);
227 1
228 1 SD_CS=1;
229 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
230 1 return 0;//返回0,说明复位操作成功
231 1 }
232
233 /******************************************************************
234 - 功能描述:检测SD卡版本,SD卡分为SD与SDHC,通过CMD8进行判断,SD与
235 SDHC的初始化以及寻址方法都不尽相同
236 - 隶属模块:SD/SDHC模块
237 - 函数属性:内部
238 - 参数说明:无
239 - 返回说明:SD卡的版本号,0x05为SD1.0 0x01为SD2.0
240 ******************************************************************/
241
C51 COMPILER V8.05a SDX 11/03/2010 20:37:00 PAGE 5
242 unsigned char SD_Check_Version()
243 {
244 1 unsigned char pcmd[]={0x48,0x00,0x00,0x01,0xaa,0x87}; //CMD8
245 1 SD_CS=0;
246 1 sd_ver=SD_Write_Cmd(pcmd);
247 1 SD_CS=1; //关闭片选
248 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
249 1 return sd_ver; //返回版本值
250 1 }
251
252 /******************************************************************
253 - 功能描述:初始化SD卡,使用CMD1
254 - 隶属模块:SD/SDHC模块
255 - 函数属性:内部
256 - 参数说明:无
257 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
258 ******************************************************************/
259
260 unsigned char SD_Init()
261 {
262 1 unsigned char time,temp;
263 1 unsigned char pcmd[] = {0x41,0x40,0x00,0x00,0x00,0xff};//第2个字节为0x40 HCS置位,说明主机支持高容量卡
264 1
265 1 SD_CS=0;
266 1
267 1 time=0;
268 1 do
269 1 {
270 2 temp=SD_Write_Cmd(pcmd);
271 2 time++;
272 2 if(time==TRY_TIME)
273 2 {
274 3 return(INIT_CMD1_ERROR);//CMD1写入失败
275 3 }
276 2 }while(temp!=0);
277 1
278 1 is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度
279 1
280 1 SD_CS=1; //关闭SD卡的片选
281 1
282 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
283 1
284 1 return(0); //返回0,说明初始化操作成功
285 1 }
286
287 /******************************************************************
288 - 功能描述:获取SD卡的寻址方式
289 - 隶属模块:SD/SDHC模块
290 - 函数属性:内部
291 - 参数说明:无
292 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
293 ******************************************************************/
294
295 unsigned char SD_Get_Addr_Mode() //获取SD卡的寻址方式,是字节寻址,还是块寻址
296 {
297 1 unsigned char pcmd[]={0x7a,0x00,0x00,0x00,0x00,0x00}; //CMD58 读取OCR的命令
298 1 SD_CS=0;
299 1 SD_Write_Cmd(pcmd); //写入CMD58
300 1 addr_mode=SD_spi_read();SD_spi_read();SD_spi_read();SD_spi_read(); //后三次读取空读
301 1 SD_CS=1;
302 1 SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
303 1 return addr_mode&0x40; //返回版本值
C51 COMPILER V8.05a SDX 11/03/2010 20:37:00 PAGE 6
304 1 }
305
306 /******************************************************************
307 - 功能描述:让SD卡就绪,调用成功后,我们就可以对SD卡进行随心所欲的读写了
308 - 隶属模块:SD/SDHC模块
309 - 函数属性:内部
310 - 参数说明:无
311 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
312 ******************************************************************/
313
314 unsigned char SD_Ready_Go()
315 {
316 1 SD_Reset(); //复位SD卡,使其进入SPI接口模式
317 1 SD_Check_Version(); //检查SD卡版本,是SD还是SDHC
318 1 SD_Get_Addr_Mode();
319 1 return SD_Init(); //初始化SD卡
320 1 }
321
322 /****************************************************************************
323 - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中
324 - 隶属模块:SD/SDHC模块
325 - 函数属性:内部
326 - 参数说明:addr:扇区地址
327 buffer:指向数据缓冲区的指针
328 - 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
329 - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
330 ****************************************************************************/
331
332 unsigned char SD_Write_Sector(unsigned long addr,unsigned char *buffer) //向SD卡中的指定地址的扇区写入512
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -