if( State == 0)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"SD Card OK\n", 11, 500);
if(HAL_SD_ReadBlocks(&hsd, pReadBuffer, 0x00000000, 512, 1) == 0)
HAL_UART_Transmit(&huart1, (uint8_t *)"Sector read is OK\n", 18, 500);
else
{
HAL_UART_Transmit(&huart1, (uint8_t *)"ERROR\n", 6, 500);
break;
}
for(int i = 0;i < 128;i++)
{
for(int j = 0;j < 4;j++)
{
SendBuffer = pReadBuffer[i];
pReadBuffer[i] >>= 8;
sprintf((char*)&Char, "%X", SendBuffer);
HAL_UART_Transmit(&huart1, &Char, 1, 500);
}
}
while(1);
}
2、SD卡处于繁忙的状态
这个时候我们就发送一个Busy的消息就可以了,等待1S钟进行下一次SD卡状态的读取。else if(State == 1)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"Busy\n", 5, 500);
}
3、SD卡状态读取错误
SD状态返回为错误,这基本上就是SD卡没有插入,要么就是卡坏掉了。这个时候如果我们不进行任何操作就进行下一次判断的话,就算是在插入SD卡不管怎么读取都是返回ERROR。所以我们在读取到这个状态的时候,调用一次HAL_SD_Init(&hsd, &SDCardInfo);这个函数来清除之前的状态(这个是我自己想的,不知道有没有卵用)。这样子操作的话,在下一次插入SD卡的时候就可以返回为OK的值并且可以读写。
最后用了一个延时函数来限制扫描SD卡的速度。else {
HAL_UART_Transmit(&huart1, (uint8_t *)"Error\n", 6, 500);
HAL_SD_Init(&hsd, &SDCardInfo);
}
HAL_Delay(1000);
实际工作效果
我预先拔掉了SD卡,过了一会我在插上去,所以在串口上看到的就是这样的效果。
写在后面的话
注意!注意!注意!本人不是什么工程师,只不过是爱好嵌入式开发的学生一枚,如果你发现在这个帖子中的错误请及时提醒我。如果对本帖的内容有什么疑问请在下方留言,我会经常过来逛论坛的。
|