STM32F4シリーズを使ってみる12 - FatFsとSDカード再考その1 -
このぶろぐを始めてから今に至るまで「FatFsがうごきません><」という漠然と
しすぎてすごく相手したくない内容の質問を定期的に頂くのですが
その99.9%が単なる配線ミスでしたと言うオチだったのですが、
残る0.1%にSTM32に潜んでいた未知のエラッタや評価ボードの設計不備、および
私の不備というクリチカルな問題が潜んでいたのが分かっています。
STM32F4が世に出て早数年、いろんな情報やノウハウも出そろってきましたので
ここで基本に還ってF4中心にSTM32とSDカードを接続せしめる手法について
今一度考察していきたいと思います。まず予習としてChaN氏のFatFsとMMC/SDCの
解説のページは必ず目を通しておいてください。最後までじっくりとね…。
●STM32F4との接続・ハードウエア編
おさらいですがSPIを使用するときはSD/MMCのSPI互換モード、SDIOを
使用する時はSD/MMCのネイティブモードとして接続します。
今回以降のぶろぐエントリではSDIOを使ったSD/MMCネイティブモードに
特に焦点を当てていきます。
ぁーちなみに…かつてはSDカードのネイティブモードのことをMMCモードと
呼んでいた時期がありましたが現在ではSDネイティブモード(もしくは
SDバスモード)に対してMMCモードと呼ぶのは完全に間違いです。
SDネイティブモードもしくはSDバスモードと呼びましょ。
STM32F4とSDカードを実用的に繋げるためにはSTM32F4の周辺機能
であるSPIもしくはSDIOインターフェースを用いて接続可能です。
SPIはデータ線が1bitのシリアルですがSDIOは最大8bitまで可能です。
ですのでSDIOの方が断然高速にデータをやり取り可能です。
その代りSDIOではその機能を最大限に引き出すためI/Oポートが
ほぼ固定化されており、SDIOを使うときは重複する他の周辺機能は
使用不可能になります。
一方でSPIは柔軟に割り当てが可能なため、ピン数がすくない品種で
速度をそれほど要しない場面でSDカードを使う際に重宝します。
私のおきぱのSTM32F4向けのサンプルではSTM32F4Discovery及び
STM32F429I-DiscoveryではSPIを、その他のボードに関してはSDIOを
インターフェースとして使用しております。
以下に最低限必要な接続例を示します。
↑STM32F4Discoveryとの接続(SPIを使ったSPI互換モード)
↑紅牛/ECH_BOARD改造基板との接続(SDIOを使ったSD/MMCネイティブモード)
ここで超重要な事柄ですが、SDIO,SPIのいずれの場合においてもCLKを除く
全ての信号線は必ず外付け抵抗でプルアップしてください!!!
SPI互換モードでは使用しないはずのDAT1,DAT2も必ずプルアップしてください。
SDカードの仕様ではたとえ使用しなくても↑をプルアップしろと指示しています!!
プルアップ抵抗値にはNexperia(元NxP)のアプリケーションノートAN10911に
極めて詳しい解説があります。私はそれらを吟味した上で10kohmより少し大きい
22kohmを常用しております。メーカ製評価ボードでは入手の容易なSDHCカードを
想定しているのか下限ぎりぎりの10kohmで吊っているのが非常に多かったです。
また、昨今のマイコンはGPIOに内蔵プルアップを有する物が多いですがそれを
信号線のプルアップとして絶対に使ってはいけません!!!
内蔵プルアップはそれが有効に働くまで信号ラインがフローティングになります。
そして抵抗値のばらつきも極めて大きくさらに一般的に30~100kohmと高抵抗
なので外来ノイズを拾いやすくなり誤動作を招きます。
内蔵プルアップはマイコンのデフォルトで入力になっている未使用ピンの
レベル固定目的に使う程度にしてください!!!
面倒臭がらず必ず外付け抵抗でプルアップしてください!!
上記の措置を怠ると"動いたり動かなかったり突然エラーになったり"する
不安定な動作となります。
CMD,DAT0〜3(〜7)のプルアップはSD/MMC/eMMCの規格で必須です。
省略は絶対にできません!!絶対に付けてください!!!
↑ここまで言ってもそれを無視してノーガードのHi-Zで挑んだり
内蔵プルアップで胡麻化そうとしてうまく動作できない人が出てきて
私にその事実を隠して相談してくる事例が絶えないので分ってくれるまで
何度でも、何度でも、な・ん・ど・で・も 書かせていただきます!!
以前MCIを動作させるのに難儀していた中華LPC1788基板ですがEA互換のはずなのに
EA向けのFatFsのサンプルがそのままでは動かないもんで回路図をよく見たら…
SDIOの信号線にプルアップが無かったorzちゃんとつけましょう!
ほらね、動かないでしょ!?
このブログ記事を書く際に久しぶりに動かしてようやく気づいたorz
CLKは基本宙ぶらりんです。リセット直後のI/Oの挙動が不安な場合は100kohm程度で
Loレベルに弱く固定すれば良いです。私が見た限りではEAのボードは「宙ぶらりん
(ダンピング抵抗有)」、ST系のボードも「宙ぶらりん」、中華系のは適当で他のI/Oと
一緒にまとめてCLKもプルアップしてたりそもそも基板の設計不良でCLK以外の必須
の信号線すらプルアップしてなかったりしますがCLKに関しては基本「宙ぶらりん」で
良いと思います。と言いたいところですが!!
STM32のSDIO_CLKは非常に高速なクロックが走り、パタンの引き回しによっては
信号の反射によって猛烈なリンギングを発生させるため信号の信頼性が著しく低下して
しまいます。よってSDIO_CLKの出力端のごくごく近くに純抵抗成分を配置して
伝送経路のインピーダンスのマッチングを図り信号の反射を抑える必要があります。
最適な抵抗値は回路構成や回路パタンの引き回しに大きく左右されるため0~47ohmを
目安にオシロとにらめっこしながら切った貼ったをして決めましょう。繰り返しますが
直列終端は信号源のすぐ近くに配置しないと後で述べるフェライトビードの配置と
同じく全く効果がないどころか最悪パワーアップさせてしまいますので基板設計の
段階から考慮しておくべきです。
20160110追:
直列抵抗入れてもダメならフェライトビーズも足してください。
プルアップの他に注意すべき点は3つあります。
1.ブレッドボードの使用はダメ!ゼッタイ!
ブレッドボードの使用は「SDカードが動かない」の諸悪の根源です。結線ミスが
原因のトラブルでブレッドボードで実験していたという証言が非常に多かったです。
で、その事実を隠してうまく動かないと訴えてくる人が極めて多いです…
ブレッドボードは確かに便利ですが、SDカードに限らず接触不良や接点抵抗の増大
によるさまざまなトラブルのもとに繋がります。面倒でも半田付けを行う癖をつけ
ましょう。
とは言え何でもかんでも半田付けもだめです。丸端を圧着せず半田付け
とかもってのほかです#
同じ理由でSDカードソケットに接触圧が弱く金メッキの薄い中華製の安物を使うと
接触不良につながります。注意しましょう。接触不良の問題は状態が変わりやすく
不具合を特定しずらいので厄介です。
ぇ?お前ブレッドボードより酷いやっけつな使い方してるじゃんですって!?
わ…ゎたしは理解した上でやってるからいいんですよぅ!
2.結線はとにかく短く!ジャンパワイヤわさわさダメ!
これもSDカードに限らず基本中の基本ですね。SDIOの場合はMAX52MHz、通常使い
でも25MHzもの高速クロックが走ります。クロストークが起こらないような配線を
考慮しなければなりません。
とはいえ利便性も考えないといけません。私の場合はSTM32F4Discoveryで使う
場合はトレードオフでカードコネクタに対してこんな配置にしております。
配線長が10cmを超えてしまうとTCK=21MHzでも"あうち"です。
なるべく太く短くを目指しましょう!
ちなみにパワーグリッド基板を使うと配線も楽でGNDも安定していろいろ
お得なので超オススメです♥
3.電源も大事!SDカード専用電源を!
電源は出来合いのボードを使う際の意外な落とし穴になります。
SDカードの仕様とSTM32F4で使用できる全てのSDカードのモードを考慮すると
SDカード単体でも最大200mA必要となります。
STM32F4Discoveryの3.3V(はショットキDi経由してるので3Vくらいに落ちる)
から無理に引っ張ってきても"何とか"動きますが高速で信号のやり取りを
していると途端に書き込み動作の際に不安定になってきます。
こんな場合は、フェライトビードを無暗に挟む前にSDカード電源供給専用LDOを
用意してあげるのが筋です。このとき使うLDOはSDカードの高速アクセス時の
大電流の吸い込み吐き出しに対応するためにセラミックコンデンサ対応の負荷の
過渡応答性に優れたものを選んでください。
STM32でSPI限定で使用する場合、仕様上最大で100mAあればよいので秋月さんの
ラインナップでいうとNJM12877F33やXC6202P502PRで十分です。勿論LDOの電圧
供給源(ほとんどの場合はUSBの+5V)は評価ボートと同じ系統にしてください。
ねむさいんは当然のごとく攻守ともに優れたLT1963Aです♥
全然考を察していない内容になっちゃいましたが次回は既存のライブラリを
駆使してSDIOでSD/MMCカードにアクセスするドライバを組んで実際に動かす
ソフト編をご紹介いたします!
免責・連絡先は↑のリンクを
↓SNSもやってます↓
powered by まめわざ- ARM/STM32 (119)
- OpenOCD (27)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- ARM/Raspi (1)
- AVR (13)
- FPGA (4)
- GPS/GNSS (20)
- MISC (86)
- STM8 (2)
- Wirelessなアレ (16)
- おきぱ (1)
- ブラウザベンチマーク (29)
- 日本の自然歩道 (27)
- GNSSモジュールを試用する21 -SAM-M10Qが壊れた…!?と思ったら直せた(おまけあり)-
⇒ Kenji Arai (05/29) - GNSSモジュールを試用する21 -SAM-M10Qが壊れた…!?と思ったら直せた(おまけあり)-
⇒ ねむい (05/26) - GNSSモジュールを試用する21 -SAM-M10Qが壊れた…!?と思ったら直せた(おまけあり)-
⇒ Kenji Arai (05/24) - 中部北陸自然歩道を往く -砺波平野の県境を駆け抜ける!-
⇒ ねむい (12/18) - 中部北陸自然歩道を往く -砺波平野の県境を駆け抜ける!-
⇒ ひかわ (12/15) - STM32U0はぢめました
⇒ ねむい (08/07) - STM32U0はぢめました
⇒ ひかわ (07/28) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ねむい (05/17) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16)
- September 2025 (1)
- August 2025 (1)
- July 2025 (1)
- June 2025 (1)
- May 2025 (1)
- April 2025 (1)
- March 2025 (1)
- February 2025 (1)
- January 2025 (1)
- December 2024 (2)
- November 2024 (1)
- October 2024 (1)
- September 2024 (1)
- August 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (1)
- April 2024 (1)
- March 2024 (1)
- February 2024 (2)
- January 2024 (1)
- December 2023 (4)
- November 2023 (2)
- October 2023 (2)
- September 2023 (1)
- August 2023 (2)
- July 2023 (1)
- June 2023 (2)
- May 2023 (3)
- April 2023 (1)
- March 2023 (1)
- February 2023 (1)
- January 2023 (1)
- December 2022 (2)
- November 2022 (1)
- October 2022 (1)
- September 2022 (1)
- August 2022 (1)
- July 2022 (1)
- June 2022 (1)
- May 2022 (1)
- April 2022 (1)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- December 2021 (2)
- November 2021 (2)
- October 2021 (1)
- September 2021 (1)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- April 2021 (1)
- March 2021 (1)
- February 2021 (1)
- January 2021 (1)
- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (6)
- May 2009 (14)
- January 1970 (1)
Copyright(C) B-Blog project All rights reserved.
Comments
Post a Comment