| 向 SD 卡发送一个命令.SD 卡一个命令格式包括 8 位 命令,32 位命令参数和 7 位 CRC 效验位,最后一位为 1 static uint8_t SD_WriteCmd(uint8_t cmd, uint32_t dat, uint8_t crc)
 {
 uint8_t r1 = 0;
 uint16_t i = 0;
 //--复位 SD 卡,取消上次片选--//
 SD_CS_SET;
 SPI2_WriteReadData(0xFF); //额外提供 8 个时钟
 SD_CS_CLR;
 while(SPI2_WriteReadData(0xFF) != 0xFF) //等待卡是否准备好
 {
 i++;
 if(i > 100)
 {
 return 0xFF; //等待失败返回
 }
 }
 //--发送数据--//
 SPI2_WriteReadData(cmd | 0x40);
 SPI2_WriteReadData(dat >> 24); //发送 Dat 的最高 8 位
 SPI2_WriteReadData(dat >> 16);
 SPI2_WriteReadData(dat >> 8);
 SPI2_WriteReadData(dat & 0x00FF);
 SPI2_WriteReadData(crc & 0x01);
 if(cmd == SD_CMD12) //如果是停止数据传输命令,额外多发
 一个时钟
 {
 SPI2_WriteReadData(0xFF);
 }
 i = 0;
 do
 {
 r1 = SPI2_WriteReadData(0xFF);
 i++;
 if(i > 100)
 {
 return 0xFF;
 }
 }
 while((r1 & 0x80) != 0); //发送成功的最高位是 0
 return r1;
 
 }
 
 
 |