STM32F4シリーズを使ってみる12 - FatFsとSDカード再考その1 -

このぶろぐを始めてから今に至るまで「FatFsがうごきません><」という漠然と
しすぎてすごく相手したくない内容の質問を定期的に頂くのですが
その99.9%が単なる配線ミスでしたと言うオチだったのですが、
残る0.1%にSTM32に潜んでいた未知のエラッタや評価ボードの設計不備、および
私の不備というクリチカルな問題が潜んでいたのが分かっています。

STM32F4が世に出て早数年、いろんな情報やノウハウも出そろってきましたので
ここで基本に還ってF4中心にSTM32とSDカードを接続せしめる手法について
今一度考察していきたいと思います。まず予習としてChaN氏のFatFsMMC/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あればよいので秋月さんの
 ラインナップでいうとNJM12877F33XC6202P502PRで十分です。勿論LDOの電圧
 供給源(ほとんどの場合はUSBの+5V)は評価ボートと同じ系統にしてください。

 
 ねむさいんは当然のごとく攻守ともに優れたLT1963Aです♥
 

全然考を察していない内容になっちゃいましたが次回は既存のライブラリを
駆使してSDIOでSD/MMCカードにアクセスするドライバを組んで実際に動かす
ソフト編をご紹介いたします!

Comments

Post a Comment








Go to top of page