芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

stm32spi读写sd卡cmd41一直返回0x01的解决办法芯片解密

  1. 芯片解密#include "sys.h"
  2. 芯片解密#include "sd-spi.h"                           
  3. 芯片解密#include "spi2.h"
  4. 芯片解密#include "usart.h"        
  5. 芯片解密#include<oled.h>

  6. u8  SD_Type=0;//SD卡的类型

  7. u8 SD_SPI_ReadWriteByte(u8 data)
  8. {
  9.         return SPI2_ReadWriteByte(data);
  10. }         
  11. //SD卡初始化的时候,需要低速
  12. void SD_SPI_SpeedLow(void)
  13. {
  14.          SPI2_SetSpeed(SPI_BaudRatePrescaler_256);//设置到低速模式        
  15. }
  16. //SD卡正常工作的时候,可以高速了
  17. void SD_SPI_SpeedHigh(void)
  18. {
  19.          SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置到高速模式        
  20. }

  21. void SD_DisSelect(void)
  22. {
  23.         SD_CS=1;
  24.          SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟
  25. }
  26. //选择sd卡,并且等待卡准备OK
  27. //返回值:0,成功;1,失败;
  28. u8 SD_Select(void)
  29. {
  30.         SD_CS=0;
  31.         if(SD_WaitReady()==0)return 0;//等待成功
  32.         SD_DisSelect();
  33.         return 1;//等待失败
  34. }
  35. //等待卡准备好
  36. //返回值:0,准备好了;其他,错误代码
  37. u8 SD_WaitReady(void)
  38. {
  39.         u32 t=0;
  40.         do
  41.         {
  42.                 if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK
  43.                 t++;                          
  44.         }while(t<0XFFFFFF);//等待
  45.         return 1;
  46. }
  47. //等待SD卡回应
  48. //Response:要得到的回应值
  49. //返回值:0,成功得到了该回应值
  50. //    其他,得到回应值失败
  51. u8 SD_GetResponse(u8 Response)
  52. {
  53.         u16 Count=0xFFFF;//等待次数                                                            
  54.         while ((SD_SPI_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到准确的回应            
  55.         if (Count==0)return MSD_RESPONSE_FAILURE;//得到回应失败   
  56.         else return MSD_RESPONSE_NO_ERROR;//正确回应
  57. }
  58. //从sd卡读取一个数据包的内容
  59. //buf:数据缓存区
  60. //len:要读取的数据长度.
  61. //返回值:0,成功;其他,失败;        
  62. u8 SD_RecvData(u8*buf,u16 len)
  63. {                                    
  64.         if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
  65.     while(len--)//开始接收数据
  66.     {
  67.         *buf=SPI2_ReadWriteByte(0xFF);
  68.         buf++;
  69.     }
  70.     //下面是2个伪CRC(dummy CRC)
  71.     SD_SPI_ReadWriteByte(0xFF);
  72.     SD_SPI_ReadWriteByte(0xFF);                                                                                                                     
  73.     return 0;//读取成功
  74. }
  75. //向sd卡写入一个数据包的内容 512字节
  76. //buf:数据缓存区
  77. //cmd:指令
  78. //返回值:0,成功;其他,失败;        
  79. u8 SD_SendBlock(u8*buf,u8 cmd)
  80. {        
  81.         u16 t;                           
  82.         if(SD_WaitReady())return 1;//等待准备失效
  83.         SD_SPI_ReadWriteByte(cmd);
  84.         if(cmd!=0XFD)//不是结束指令
  85.         {
  86.                 for(t=0;t<512;t++)SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
  87.             SD_SPI_ReadWriteByte(0xFF);//忽略crc
  88.             SD_SPI_ReadWriteByte(0xFF);
  89.                 t=SD_SPI_ReadWriteByte(0xFF);//接收响应
  90.                 if((t&0x1F)!=0x05)return 2;//响应错误                                                                                                                     
  91.         }                                                  



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信