⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd_rw2.lst

📁 PIC18读取sd卡的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
   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 + -