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