[求助] 大神们有MSP430跟SD卡进行SPI通信的例子吗??

jianping-sun   2015-1-9 16:53 楼主
我初始化SD卡那步就失败了。。。。,代码如下,求大神帮忙看看
  1. /**************SD卡控制端定义*******************/
  2. #define SD_CS_0 P4OUT&=~BIT5
  3. #define SD_CS_1 P4OUT|=BIT5
  4. /******SD_DI-->P3.1,SD_DO-->P3.2,SD_CLK-->P3.3****/


回复评论 (11)

  1. /**********SD卡控制端定义**************/
  2. #define SD_CS_0 P4OUT&=~BIT5
  3. #define SD_CS_1 P4OUT|=BIT5
  4. /******SD_DI-->P3.1,SD_DO-->P3.2,SD_CLK-->P3.3****/
  5. /**************************************/
  6. uchar CMD0[6]={0x40,0x00,0x00,0x00,0x00,0x95};//切换到SPI模式命令
  7. uchar CMD1[6]={0x41,0x00,0x00,0x00,0x00,0x01};//初始化命令
  8. uchar CMD16[6]={0x50,0x00,0x00,0x02,0x00,0x01};//设置扇区大小512BYTE
  9. uchar CMD17[6]={0xfe,0x00,0x00,0x00,0x00,0x01};//从SD卡中单个块读取数据命令,中间四个字节为地址
  10. uchar CMD24[6]={0x58,0x00,0x00,0x00,0x00,0xff};//向SD卡中单个块写入数据命令,中间四个字节为地址
点赞  2015-1-9 16:55

  1. /****************初始化spi***********************/
  2. void init_spi()
  3. {
  4.   P3SEL|=BIT1+BIT2+BIT3;
  5.   UCB0CTL1|=UCSWRST;
  6.   UCB0CTL1|=UCSSEL__SMCLK;
  7.   UCB0CTL0|=UCMST+UCCKPL+UCSYNC+UCMSB;
  8.   UCB0BR0=0x02;
  9.   UCB0BR1=0;
  10.   UCB0CTL1&=~UCSWRST;
  11.   UCB0IE|=UCRXIE;
  12. }
  13. /***********************************************/


  14. /**************SPI发送一个字节******************/
  15. void SPISEND_BYTE(uchar DATA)
  16. {
  17.   while(!(UCB0IFG&UCTXIFG));
  18.   UCB0TXBUF=DATA;
  19. }
  20. /***********************************************/

  21. /**************SPI接收一个字节******************/
  22. uchar SPIREAD_BYTE()
  23. {
  24.     while(!(UCB0IFG&UCRXIFG));
  25.     return UCB0RXBUF;
  26. }
  27. /***********************************************/
点赞  2015-1-9 16:56
  1. /**********发送命令到SD卡************/
  2. uchar SDSEND_COM(uchar CMD[])
  3. {
  4.   uchar res;
  5.   SD_CS_0;
  6.   SPISEND_BYTE(CMD[0]);
  7.   SPISEND_BYTE(CMD[1]);
  8.   SPISEND_BYTE(CMD[2]);
  9.   SPISEND_BYTE(CMD[3]);
  10.   SPISEND_BYTE(CMD[4]);
  11.   SPISEND_BYTE(CMD[5]);
  12.   res=SPIREAD_BYTE();
  13.   SD_CS_1;
  14.   return res;
  15. }
  16. /*************************************/

  17. /*********初始化SD卡*****************/
  18. uchar SD_INIT()
  19. {
  20.   uchar i ,res;
  21.   for(i=0;i<=12;i++)
  22.   {
  23.     SPISEND_BYTE(0xff);
  24.   }
  25.   SD_CS_0;
  26.   delayus(10);
  27.   do
  28.   {
  29.     res=SDSEND_COM(CMD0);
  30.     i++;
  31.   }while(i<100);
  32.   if(res!=0x01)
  33.   {
  34.     return 0;
  35.   }
  36.   else
  37.   {
  38.     i=0;
  39.     SD_CS_1;
  40.     SPISEND_BYTE(0xff);
  41.     SD_CS_0;
  42.     do
  43.     {
  44.       res=SDSEND_COM(CMD1);
  45.       i++;
  46.     }while(i<100);
  47.     i=0;
  48.     if(res!=0x01)
  49.     {
  50.       SD_CS_1;
  51.       return 0;
  52.     }
  53.     else
  54.     {
  55.       SD_CS_1;
  56.       SPISEND_BYTE(0xff);
  57.       SD_CS_0;
  58.       do
  59.       {
  60.         res=SDSEND_COM(CMD16);
  61.         i++;
  62.       }while(i<100);
  63.       if(res!=0x00)
  64.         return 0;
  65.       else
  66.       {
  67.         SD_CS_1;
  68.         return 1;
  69.       }
  70.     }
  71.   }
  72. }
  73. /************************************/


  74. /*********往SD卡写数据***************/
  75. uchar SDWRITE_BLOCK(uchar* BLOCK,int32 add)
  76. {
  77.   uint i,res;
  78.   add<<=9;
  79.   CMD24[1]=((add&0xff000000)>>24);
  80.   CMD24[2]=((add&0x00ff0000)>>16);
  81.   CMD24[3]=((add&0x0000ff00)>>8);
  82.   CMD24[4]=add;
  83.   SD_CS_0;
  84.   do
  85.   {
  86.     res=SDSEND_COM(CMD24);
  87.     i++;
  88.   }while(i<100);
  89.   if(res!=0x05)
  90.   {
  91.     SD_CS_1;
  92.     return res;
  93.   }
  94.   else
  95.   {
  96.     for(i=0;i<=12;i++)
  97.     {
  98.       SPISEND_BYTE(0xff);
  99.     }
  100.     SPISEND_BYTE(0xfe);
  101.     for(i=0;i<512;i++)
  102.     {
  103.       SPISEND_BYTE(*BLOCK++);
  104.     }
  105.     SPISEND_BYTE(0xff);
  106.     SPISEND_BYTE(0xff);
  107.     res=SPIREAD_BYTE();
  108.     if(res!=0x05)
  109.       return 0;
  110.     else
  111.     {
  112.       delayus(10);
  113.       SD_CS_1;
  114.       return 1;
  115.     }
  116.    
  117.   }

  118. }
  119. /**********SD卡读数据*****************/
  120. uchar SDREAD_BLOCK(uchar* BLOCK,int32 add)
  121. {
  122.   uint i,res;
  123.   add<<=9;
  124.   CMD17[1]=((add&0xff000000)>>24);
  125.   CMD17[2]=((add&0x00ff0000)>>16);
  126.   CMD17[3]=((add&0x0000ff00)>>8);
  127.   CMD17[4]=add;
  128.   SD_CS_0;
  129.   do
  130.   {
  131.     res=SDSEND_COM(CMD17);
  132.     i++;
  133.   }while(i<100);
  134.   if(res!=0xfe)
  135.   {
  136.     SD_CS_1;
  137.     return res;
  138.   }
  139.   else
  140.   {
  141.     for(i=0;i<512;i++)
  142.     {
  143.       *BLOCK++=SPIREAD_BYTE();
  144.     }
  145.     SPIREAD_BYTE();
  146.     SPIREAD_BYTE();
  147.     SD_CS_1;
  148.     return 1;
  149.    
  150.   }

  151. }

点赞  2015-1-9 16:56
刚才出了点问题,代码补发在下面
点赞  2015-1-9 16:57
请参考我发过的一个帖子,5529显示汉子的那个帖子,里面有官网提供的例程,spi操作sd卡的,我手机不上网不方便找
点赞  2015-1-9 20:23
最简单的想法,你的卡兼容不?
有一次用toshiba的卡,调了一个星期都不好
换上sandisk的,秒好
So TM what......?
点赞  2015-1-9 20:42
引用: lcofjp 发表于 2015-1-9 20:23
请参考我发过的一个帖子,5529显示汉子的那个帖子,里面有官网提供的例程,spi操作sd卡的,我手机不上网不方便找


工程量有点大。。。待我慢慢消化。。。。。

点赞  2015-1-9 22:23
引用: ljj3166 发表于 2015-1-9 20:42
最简单的想法,你的卡兼容不?
有一次用toshiba的卡,调了一个星期都不好
换上sandisk的,秒好


现在就1个SD卡。。。

点赞  2015-1-9 22:24
先试试看其他的卡,不一定是程序的问题。DEBUG先从简单的开始。
点赞  2015-1-10 00:53
文件系统对吗?
点赞  2015-1-13 08:01
引用: 平行电 发表于 2015-1-13 08:01
文件系统对吗?


格式化为FAT32啦

点赞  2015-1-13 11:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复