Open10
Nucleo STM32L476RGでSDMMCを使ってSDカードと通信する
- STM32CubeMX: ver 6.11.1
ピンアサイン
PC8,PD2は10kΩでプルアップ
PC7も同様(SDカード挿入時にLOWになるよう配線する)
- DMA有効だと、f_openでSDカードの最初の512byteを読み出したとき、何故か途中で4bit詰められ、末尾の0x55AAがずれてしまう
- SDMMCのモードが
SD 4 bits Wide bus
だと(4bit用の配線をしても)512byteの後半が読み出せていない(?) -
SD 1 bit
モードでDMA無効のときだけ動く
いずれもデバッガでff.c内 fs->winを見て確認
- SDカードのパーティションを切ると上記先頭512バイトがFatFsの期待するものにならない
- パーティション指定でマウントできると良いのだろうけどよくわからない
- パーティションを削除してから
sudo mkfs.vfat /dev/sdX
すると良い -
sudo hexdump -n 512 /dev/sdX
とかで確認できる
SDMMCのDMAは、RX,TXで別チャンネルにするのではなく、同じチャンネルにする必要がありそう
DMAの送信(BSP_SD_WriteBlocks_DMA)はHAL_SD_ERROR_TX_UNDERRUNになってしまう
sd_diskio.c内SD_write()のBSP_SD_WriteBlocks_DMAのブロックを
if (BSP_SD_WriteBlocks((uint32_t*)buff,
(uint32_t)(sector),
count, 1000) == MSD_OK)
{
res = RES_OK;
}
に置き換えたら動いた
FreeRTOS(CMSIS v2)を併用するときも↑で良さそう
clock divide factorは、2MHzを超えないように設定すると安定した