求大神支招,SD卡可以初始化但是无法读写

2019-03-24 18:06发布

初始化是成功的,但是发送读命令一直返回0x7f,写命令一
  1. void SEND_BYTE(uchar DATA)
  2. {
  3.         uchar i,temp;
  4.         temp=DATA;
  5.         CS=0;
  6.         for(i=0;i<8;i++)
  7.         {
  8.                 CLK=0;
  9.                 if(temp&0x80)
  10.                         MOSI=1;
  11.                 else
  12.                         MOSI=0;
  13.                 temp<<=1;
  14.                 CLK=1;
  15.         }
  16. }


  17. uchar READ_BYTE()
  18. {
  19.   uchar  i,temp=0;
  20.         CS=1;
  21.         SEND_BYTE(0xff);
  22.         CS=0;
  23.   for(i=0;i<8;i++)
  24.   {
  25.                         temp<<=1;  
  26.       CLK=0;
  27.       CLK=1;
  28.       if(MISO==1)
  29.         temp|=1;
  30.       else
  31.         temp|=0;   
  32.   }
  33.   return temp;
  34. }

  35. /***********发送命令*************/
  36. uchar SEND_COM(uchar CMD[])
  37. {
  38.   uchar i,temp;
  39.         CS=1;
  40.         SEND_BYTE(0xff);
  41.         CS=0;
  42.   for(i=0;i<6;i++)
  43.   {
  44.     SEND_BYTE(CMD[i]);
  45.   }
  46.         i=0;
  47.         do
  48.         {
  49.                 temp=READ_BYTE();
  50.                 i++;
  51.         }while((temp==0xff)&&(i<200));
  52.   CS=1;
  53.         SEND_BYTE(0xff);
  54.   return temp;
  55. }

  56. /*************初始化函数***************/
  57. uchar SD_INIT()
  58. {
  59.   uchar i,j=0,res;
  60.         for(i=0;i<=10;i++)
  61.     {
  62.       SEND_BYTE(0xff);
  63.     }
  64.         CS=0;
  65.   do
  66.   {
  67.     res=SEND_COM(CMD0);
  68.     j++;
  69.                 if(j==200)
  70.                 {
  71.                         return 0xff;
  72.                 }
  73.   }while(res!=0x01);
  74.         i=0;
  75.         CS=1;
  76.         SEND_BYTE(0xff);
  77.         CS=0;
  78.   do
  79.   {
  80.     res=SEND_COM(CMD8);
  81.     j++;
  82.                 if(j==200)
  83.                 {
  84.                         return 0xff;
  85.                 }
  86.   }while(res!=0x01);
  87.         do
  88.   {
  89.                 SEND_COM(CMD55);
  90.     res=SEND_COM(CMD41);
  91.     i++;
  92.                 if(i==200)
  93.                 {
  94.                         return 0xff;
  95.                 }
  96.   }while(res!=0x00);
  97.         i=0;
  98.         CS=1;
  99.         SEND_BYTE(0xff);
  100.         CS=0;
  101.         do
  102.   {
  103.     res=SEND_COM(CMD16);
  104.     i++;
  105.                 if(i==200)
  106.                 {
  107.                         return 0xff;
  108.                 }
  109.   }while(res!=0x00);
  110.         return res;       
  111. }
复制代码
直返回0xff,怎么回事??我把初始化跟读写函数贴出来给大家看看。。。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jianping-sun
1楼-- · 2019-03-24 22:53
这边是读写的函数
  1. uchar SD_ReadSector(uchar *buf,long int sector)
  2. {
  3.         uchar response,i=0;
  4.         sector*=512;
  5.         CMD17[1]=((sector)>>24);
  6.         CMD17[2]=((sector)>>16);
  7.         CMD17[3]=((sector)>>8);
  8.         CMD17[4]=sector;
  9.         CS=1;
  10.         SEND_BYTE(0xff);
  11.         CS=0;
  12.         do
  13.         {
  14.                 response=SEND_COM(CMD17);
  15.                 i++;
  16.                 if(i==200)
  17.                 {
  18.                         return response;
  19.                 }
  20.         }while(response!=0);
  21.         i=0;
  22.         while(READ_BYTE()!=0xfe);
  23.         for(i=0;i<512;i++)
  24.         {
  25.                 *buf++=READ_BYTE();
  26.         }
  27.         CS=1;
  28.         SEND_BYTE(0xff);
  29.         return 0;
  30.        
  31. }


  32. uchar SD_WriteSector(uchar *buf,long int sector)
  33. {
  34.         uchar response,i=0;
  35.         sector*=512;
  36.         CMD24[1]=((sector&0xff000000)>>24);
  37.         CMD24[2]=((sector&0x00ff0000)>>16);
  38.         CMD24[3]=((sector&0x0000ff00)>>8);
  39.         CMD24[4]=sector&0x000000ff;
  40.         CS=1;
  41.         SEND_BYTE(0xff);
  42.         CS=0;
  43.         do
  44.         {
  45.                 response=SEND_COM(CMD24);
  46.                 i++;
  47.                 if(i==200)
  48.                 {
  49.                         return response;
  50.                 }
  51.         }while(response!=0);
  52.         SEND_BYTE(0xfe);
  53.         i=0;
  54.         for(i=0;i<512;i++)
  55.         {
  56.                 SEND_BYTE(*buf++);
  57.         }
  58.         SEND_BYTE(0xff);
  59.         SEND_BYTE(0xff);
  60.         response=READ_BYTE();
  61.         if(response&0x1f!=0x05)
  62.                 return response;
  63.         while(READ_BYTE()!=0xff);
  64.         CS=1;
  65.         SEND_BYTE(0xff);
  66.         return 0;
  67. }
复制代码
jianping-sun
2楼-- · 2019-03-25 01:23
 精彩回答 2  元偷偷看……
chunyang
3楼-- · 2019-03-25 04:17
列出详细的程序流程,再跟SD卡的读写时序比较,这样更容易发现问题。直接贴代码,简单是简单了,结果呢?
jianping-sun
4楼-- · 2019-03-25 06:30
chunyang 发表于 2015-2-9 19:08
列出详细的程序流程,再跟SD卡的读写时序比较,这样更容易发现问题。直接贴代码,简单是简单了,结果呢?


是按照时序来的,还参考了好几个别人的程序。。。

bobde163
5楼-- · 2019-03-25 08:59
 精彩回答 2  元偷偷看……
人民币的幻想
6楼-- · 2019-03-25 14:24
你直接用振南电子的sd驱动函数吧,还有视频讲解。

一周热门 更多>