症状
該当のコードはこんな感じ。
fatfsのsd_card.cで定義されてるf_mount()でコケて返ってくる
// ドライブのマウント
while (true) {
fr = f_mount(&fs, "0:", 1);
if (fr == FR_OK) {
printf("ドライブのマウントに成功しました。\r\n");
break;
} else {
printf("ドライブのマウントに失敗しました。エラーコード: %d\r\n", fr);
sleep_ms(1000); // 1秒待機して再試行
}
}
V2-Version Card
R3/R7: 0x1ff
CMD8 Pattern mismatch 0x1aa : 0x1ff
Failed to initialize card
ドライブのマウントに失敗しました。エラーコード: 3
原因
fatfsのsd_spi.cで設定してるボーレートが速すぎた。
void sd_spi_go_low_frequency(sd_card_t *pSD) {
// uint actual = spi_set_baudrate(pSD->spi->hw_inst, 400 * 1000); // Actual frequency: 398089
uint actual = spi_set_baudrate(pSD->spi->hw_inst, 15 * 1000 * 1000); // 速すぎ
TRACE_PRINTF("%s: Actual frequency: %lu\n", __FUNCTION__, (long)actual);
}
対処
ボーレートをめっちゃ下げたら一発でマウント成功するようになった
void sd_spi_go_low_frequency(sd_card_t *pSD) {
uint actual = spi_set_baudrate(pSD->spi->hw_inst, 400 * 1000); // Actual frequency: 398089
// uint actual = spi_set_baudrate(pSD->spi->hw_inst, 15 * 1000 * 1000); // 速すぎ
TRACE_PRINTF("%s: Actual frequency: %lu\n", __FUNCTION__, (long)actual);
}
コメント解除した行(2行目)の400kHzがたしかデフォルトだったんじゃないかな。
だから一旦そっちに戻しただけ。
・
・
・
他の実装済んだら最後に少しずつ上げていっていい塩梅に調整しようかな。