空闲之余研究 手头有两张SD卡插上电脑能识别到 提示格式化 但格式化失败
用DiskGenius 打开显示扇区错误 经研究应该是 某些设备上的加密卡
根据下面资料 编写的代码 不能清除 请有经验的前辈 给与指导 万分感谢
资料1
卡擦除
使用CMD16设置Block长度为1;
发送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
发送命令数据:0x08,0xFF,0xFF;
使用CMD16恢复原Block长度。
资料2
加密并上锁 给SD卡加密并上锁后,SD卡在没有解锁的情况下将不能被读写4:根据图2要上锁的命令为Bit2=1,设置密码的命令为Bit0-1,其它的位设置为O,即命令码为Ox05。在SD卡接受CMD42命令字前需要降低SPI的通信速度,这样才能更好的接受加密指令,SD卡在读写数据时块长度(block)为512Byte,但在写入密码前应通过CMD16命令字设置block长度为密码长度(PWD LEN)加上两个Byte即PWD LEN+2,在加密操作完成后恢复数据块长度512Byte。以设置密码为“123456”为例,加密并加锁的关键代码如下: SPI_SetSpeed (Low)://设置SPI为低速通信模式 SD_SendCmd(CMD16, Ox08, Oxff);//设置blcok为8 SD_SendCmd (CMD42, Oxffffff, Ox95):11写入命令 SD;SPI_WriteByte (Oxfe)://数据命令盾牌 SD SPI_ WriteByte(Ox05)://设置密码,并给卡加锁 SD_SPI_WriteByte (Ox06);//密码长度 SD_SPI_WriteByte (Ox31);//写入密码123456 SD_SPI_ Wri'teByte (Ox32); SD_SPI:WriteByte (Ox33); SD_SPI-WriteByte( Ox34); SD SPI_ WriteByte(Ox35); SD SPI- WriteByte(Ox36); SD SPI_WriteByte(Oxff)://写两字节的CRC校验 SD SPI WriteByte(Oxff) SD SendCmd (CMD16, Ox200, Oxff)://恢复block SPI_SetSpeed (High);//恢复SPI为高速通信模式
这里是根据参考资料编写的代码 unsigned char SD_cmd42()
{
unsigned char time,temp;
unsigned char cmd16[] = {0x50,0x00,0x00,0x00,0x01,0x01};
unsigned char cmd42[] = {0x6a,0x00,0x00,0x00,0x00,0x95};
SD_CS=0;
time=0;
do
{
temp=SD_Write_Cmd(cmd16);//写入CMD16
temp=SD_Write_Cmd(cmd42);//写入CMD42
SD_spi_write(0xfe); //起始令牌
SD_spi_write(0x08); //解除锁命令码
SD_spi_write(0xff); //crc
SD_spi_write(0xff); //crc
time++;
delay(5000); //延时便于观察循环次数
LED_4 = ~LED_4;//
if(time==200) //循环200次
{
LED_R = 0; //错误点亮红led 和第四个led
LED_4 = 0;
return 1; //结束程序并返回1 写入失败
}
}while(temp!=0x00);//响应r1 这里不确定是不是0x00 知道的请告知下
LED_4 = 0;//正常点亮第四个led
SD_CS=1;
SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
return 0;//返回0,
}
|