STM32L476RG SDMMC

使用ピン

  • CN7 3: PC12: CLK
  • CN7 4: PD2: CMD
  • CN10 2: PC8: D0
  • CN10 1: PC9: D1 (4bit以上のモードのみ)
  • CN7 1: PC10: D2 (4bit以上のモードのみ)
  • CN7 2: PC11: D3 (4bit以上のモードのみ)
  • CN10 3: PB8: D4 (8bitモードのみ)
  • CN10 5: PB9: D5 (8bitモードのみ)
  • CN10 4: PC6: D6 (8bitモードのみ)
  • CN10 19: PC7: D7 (8bitモードのみ)

「Resolve Clock Issues」で割り当てられるクロック

SDMMC1 には 32MHz が供給され、システムクロックには 80MHz が供給された。

Modeで選択できる種類

  • SD 1 bit
  • SD 4 bits Wide bus
  • MMC 1 bit
  • MMC 4 bits Wide bus
  • MMC 8 bits Wide bus

注意すべきポイント

SDMMCを有効にした際の デフォルトの ParameterSettings だと、「SDMMC Hardware flow control」が 「The hardware control flow is disabled」になっていて wide bus だと、ほぼ 100% タイムアウトしてしまい使いものにならないので「The hardware control flow is enabled」に変更する事を強く推奨する。

また、Modeで選択した内容に応じてGPIOの初期化処理なども生成されるので、小手先のプロパティ変更では失敗する場合がある。

具体例) 1bitでコード生成したけど、HAL_MMC_ConfigWideBusOperation の引数を SDMMC_BUS_WIDE_8B に 変える等は、初期化処理が処理が不足してしまい、結果的に期待通りの結果にならない。なお、逆(8bitで生成して SDMMC_BUS_WIDE_1B に下げる)はOKだったりする。

根拠不明のTips

SDMMC_CmdSwitch を使って eMMC のカレントパーティションを切り替えた直後は、HAL_Delay で 最低 1ms のウェイトを入れると良い。このウェイトが無いと HAL_MMC_GetCardExtCSD や HAL_MMC_ReadBlocks を呼び出しても HAL_ERROR ( ErrorCode は HAL_MMC_ERROR_CMD_RSP_TIMEOUT や HAL_MMC_ERROR_ILLEGAL_CMD )になってしまった。なお、一度この状態になってしまうと、リトライしてもダメ・・・。全く原因がわからない。 ※2022/07/23 時点におけるシステムクロック80MHz / SDMMC1クロック48MHz 時の実績より。

コメントを残す

メールアドレスが公開されることはありません。