📄 sd_rw2.lst
字号:
197: if(tncr == 8) { b_cmdnr = 1 ; break;}
198: else tncr++;
199: }
200: if( *cmd_r1 != 0x00)
201: b_cmdr_er = 1;
202: }
203:
204:
205:
206: /************************************************************/
207: /* SD卡软件复位
208: /************************************************************/
209:
210: void SD_Rst ( ) //SD卡软复位
211: {
212: unsigned int tncr;
213: char * cmd_r1;
214: PIC_W( SW_rst , 6 ); //发送软件复位控制命令
215: SPICtrl = 0; //复位命令发送过程中片选信号有下降沿SPICtrl
216: while(1)
217: {
218: PIC_R ( cmd_r1 , 1);
219: if( * cmd_r1 != 0xff )
220: break;
221: else
222: if(tncr == 8) { b_cmdnr = 1 ; break;}
223: else tncr++;
224: }
225: if( *cmd_r1 != 0x00)
226: b_cmdr_er = 1;
227: }
228:
229: /************************************************************/
230: /* SD卡初始化
231: /************************************************************/
232:
233: void SD_Init() //SD卡初始化
234: {
235: do
236: {
237: SPI_wt(1); //NRC,两次命令间隔
238: SD_CMD( CMD1 , NOARG ); //CMD1,等待SM卡初始化完毕
239: }
240: while( b_cmdr_er | b_cmdnr); //当无响应或者响应有错时继续发送
241: }
242:
243: /************************************************************/
244: /* PIC->SD卡 写入数据块 */
245: /************************************************************/
246: void PIC_BL_W ( char * w_ad ) //pic写入single block数据块
247: {
248: char * crc_tmp;
249: *wr_crc = crcCompute( w_ad, BL_LEN ); //调用CRC校验码
250: crc_tmp = (char * )wr_crc;
251: PIC_W ( w_ad, BL_LEN ); //发送启示数据块
252: PIC_W ( crc_tmp, 2); //发送CRC校验码
253: }
254:
255: /************************************************************/
256: /* PIC<-SD卡 读取数据块 */
257: /************************************************************/
258: void PIC_BL_R ( char * r_ad ) //pic读出single block数据块
259: {
260: PIC_R ( r_ad, BL_LEN -1 ); //接收数据块,起始块已经接收
261: }
262:
263:
264: /************************************************************/
265: // 完整的PIC-SD写入数据,返回值为1表示发送完毕正确写入
266: /************************************************************/
267:
268:
269: bit SD_WR ( long SDADR, char * WBUF) //写入单块数据
270: {
271: WB_re = 0x00; //清空寄存器
272: wr_crc = 0x0000;
273: SPI_wt(1); //NRC,两次命令间隔
274: SD_CMD ( CMD24, SDADR ); //写命令
275: if((!b_cmdr_er) & (!b_cmdnr)) //命令响应正确,开始写数据
276: {
277: SPI_wt(1); //NWR,插入一个周期
278: PIC_BL_W ( WBUF ); //写入一个数据块
279: PIC_R ( WB_re, 1); //接收数据响应
280:
281: // SD_busy (); //等待SD卡BUSY信号结束,完成本次发送
282: return 1;
283: }
284: else
285: return 0;
286: }
287:
288: /************************************************************/
289: /* 完整的PIC-SD读取数据,返回值为1表示读取完毕
290: /************************************************************/
291: bit SD_RD (long SDADR, char * RBUF)
292: {
293: unsigned i ;
294: wr_crc = 0x0000;
295: SPI_wt(1); //NRC,两次命令间隔
296: SD_CMD ( CMD17, SDADR ); //读命令
297: if(!b_cmdr_er & !b_cmdnr) //命令响应正确,开始写数据
298: {
299: SPI_wt(1); //NAC,插入一个周期
300: while(1)
301: {
302: SPI_R( RBUF, 1); //将接收到的数存入RBUF[0]的位置
303: if( RBUF[0] == 0xfe)
304: { RBUF++;
305: break;
306: }
307: else
308: if(i == NSAC -1) //NSAC表示最大数据响应时间,在CSD中定义
309: { b_dnr = 1 ; //超出最大数据响应时间
310: break;
311: }
312: else
313: i++;
314: }
315: if(!b_dnr) //未超过最大响应时间
316: {
317: PIC_BL_R( RBUF); //继续接收数据及CRC区
318: return 1;
319: }
320: }
321: return 0;
322: }
323:
324: /************************************************************/
325: /* 读CSD寄存器操作
326: /************************************************************/
327: void SD_CSD (char * csd)
328: {
329: unsigned int i;
330: SPI_wt(1);
331: SD_CMD( CMD9 , NOARG ); //发送复位命令CMD9
332: if(!b_cmdr_er & !b_cmdnr) //命令响应正确,开始写数据
333: {
334: SPI_wt(1); //NAC,插入一个周期
335: while(1)
336: { SPI_R( csd, 1); //将接收到的数存入RBUF[0]的位置
337: if( csd[0] != 0xff)
338: { csd++;
339: break;
340: }
341: else
342: if(i == 7) //NCR表示最大数据响应时间,在CSD中定义
343: { b_dnr = 1 ; //超出最大数据响应时间
344: break;
345: }
346: else
347: i++;
348: }
349: if(!b_dnr) //未超过最大响应时间
350: {
351: PIC_BL_R( csd); //继续接收数据及CRC区
352: }
353: }
354: }
355:
356: /************************************************************/
357: /* 主程序
358: /************************************************************/
359:
360:
361: void main()
362: {
363: static bit w1; //写成功标志位
364: static bit r2; //读成功标志位
365:
366: Sys_Init(); //系统初始化
367: Int_Init(); //中断初始化
368:
369: SPICtrl=1; //spi片选无效
370: crcInit(); //生成CRC查询表
371:
372: SD_Rst(); //SD卡软件初始化,进入SPI模式
373:
374: SD_Init(); //CMD1,SM卡初始化完毕
375:
376: // #ifdef SD_TEST
377: // char csd[16]; //存储128bit的CSD寄存器信息
378: // SD_CSD (csd); //读取SD卡的CSD信息
379: // #endif
380:
381: w1 = SD_WR ( W_ADDR, w_buf); //写数据块
382:
383: r2 = SD_RD ( R_ADDR, r_buf); //读数据块
384:
385: //当w1和r2返回值均为1时,表示读写操作正确,如发生错误,可读写内部控制字
386: //本例中没有对读取的数据块进行CRC校验比较
387:
388:
389: }
390:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -