[STM32G0] STM32G051F8P6通过 SPI 模式读取并写入 Micro‑SD 卡

[复制链接]
5|0
jerry尧 发表于 2026-9-18 18:13 | 显示全部楼层 |阅读模式
SD 卡初始化是按照 CMD0、CMD8、CMD55、ACMD41、CMD58 的顺序执行的,可以正常完成。但是之后使用 CMD17 读取第一个扇区时,读到的数据是错误的。

下表截取了第 446‑461 字节,这部分存放第一个分区的相关信息;这里的扇区读取结果首字节已经置 0。
表格第一行是 FTK 读取到的、写入 Micro‑SD 卡上的正确数据;第二行是通过 CMD17 实际读出的值。两种情况下,第 510‑511 字节均为 0x55 和 0xAA,满足首扇区的数据特征。

表格

| 字节 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 正确数据 | 0x00 | 0x82 | 0x03 | 0x00 | 0x0C | 0xFE | 0xFF | 0xFF | 0x00 | 0x20 | 0x00 | 0x00 | 0x00 | 0xDC | 0xD1 | 0x01 |
| CMD17 读出结果 | 0x00 | 0x02 | 0x04 | 0x00 | 0x06 | 0x18 | 0xD8 | 0xC8 | 0x81 | 0x00 | 0x00 | 0x00 | 0x7F | 0x93 | 0x3B | 0x00 |


下面是 FATFS/Target/fatfs_sd.c 中发送 CMD17 的代码片段:

SD_Status SD_disk_read_blocks(BYTE* buff, DWORD sector, UINT count)
{
if (!count)
{
return SD_ERROR;
}
if (count == 1)
{
if (!sdhc)
{
sector *= 512;
}
SPI_cs_select();
// todo: The retrieved data is corrupted
BYTE cmd17_res = SD_send_cmd(CMD17, sector);
if (cmd17_res != 0x00)
{
SPI_cs_deselect();
return SD_ERROR;
}
uint8_t token;
uint32_t timeout = HAL_GetTick() + 200;
do
{
token = SPI_rx_byte();
if (token == 0xFE)

SD 卡规格书上规定 SPI 应当使用模式 0;但实际调试时,如果不配置为模式 3,CMD0 通信就直接失败。另外 SPI 时钟必须设置到 1 MHz 以上才能通信。当前单片机主频 32 MHz,八分频得到 4 MHz 的 SPI 时钟。




您需要登录后才可以回帖 登录 | 注册

本版积分规则

217

主题

241

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0