向 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;
}
|