stm32spi读写sd卡cmd41一直返回0x01的解决办法芯片解密
- 芯片解密#include "sys.h"
- 芯片解密#include "sd-spi.h"
- 芯片解密#include "spi2.h"
- 芯片解密#include "usart.h"
- 芯片解密#include<oled.h>
- u8 SD_Type=0;//SD卡的类型
- u8 SD_SPI_ReadWriteByte(u8 data)
- {
- return SPI2_ReadWriteByte(data);
- }
- //SD卡初始化的时候,需要低速
- void SD_SPI_SpeedLow(void)
- {
- SPI2_SetSpeed(SPI_BaudRatePrescaler_256);//设置到低速模式
- }
- //SD卡正常工作的时候,可以高速了
- void SD_SPI_SpeedHigh(void)
- {
- SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置到高速模式
- }
- void SD_DisSelect(void)
- {
- SD_CS=1;
- SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟
- }
- //选择sd卡,并且等待卡准备OK
- //返回值:0,成功;1,失败;
- u8 SD_Select(void)
- {
- SD_CS=0;
- if(SD_WaitReady()==0)return 0;//等待成功
- SD_DisSelect();
- return 1;//等待失败
- }
- //等待卡准备好
- //返回值:0,准备好了;其他,错误代码
- u8 SD_WaitReady(void)
- {
- u32 t=0;
- do
- {
- if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK
- t++;
- }while(t<0XFFFFFF);//等待
- return 1;
- }
- //等待SD卡回应
- //Response:要得到的回应值
- //返回值:0,成功得到了该回应值
- // 其他,得到回应值失败
- u8 SD_GetResponse(u8 Response)
- {
- u16 Count=0xFFFF;//等待次数
- while ((SD_SPI_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到准确的回应
- if (Count==0)return MSD_RESPONSE_FAILURE;//得到回应失败
- else return MSD_RESPONSE_NO_ERROR;//正确回应
- }
- //从sd卡读取一个数据包的内容
- //buf:数据缓存区
- //len:要读取的数据长度.
- //返回值:0,成功;其他,失败;
- u8 SD_RecvData(u8*buf,u16 len)
- {
- if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
- while(len--)//开始接收数据
- {
- *buf=SPI2_ReadWriteByte(0xFF);
- buf++;
- }
- //下面是2个伪CRC(dummy CRC)
- SD_SPI_ReadWriteByte(0xFF);
- SD_SPI_ReadWriteByte(0xFF);
- return 0;//读取成功
- }
- //向sd卡写入一个数据包的内容 512字节
- //buf:数据缓存区
- //cmd:指令
- //返回值:0,成功;其他,失败;
- u8 SD_SendBlock(u8*buf,u8 cmd)
- {
- u16 t;
- if(SD_WaitReady())return 1;//等待准备失效
- SD_SPI_ReadWriteByte(cmd);
- if(cmd!=0XFD)//不是结束指令
- {
- for(t=0;t<512;t++)SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
- SD_SPI_ReadWriteByte(0xFF);//忽略crc
- SD_SPI_ReadWriteByte(0xFF);
- t=SD_SPI_ReadWriteByte(0xFF);//接收响应
- if((t&0x1F)!=0x05)return 2;//响应错误
- }

芯片解密