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

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

STM32F4が世に出て早数年、いろんな情報やノウハウも出そろってきましたので
ここで基本に還ってF4中心にSTM32とSDカードを接続せしめる手法について今一度
考察していきたいと思います。まず予習としてChaN氏のFatFsMMCの解説のページ
は必ず目を通しておいてください。



●STM32F4との接続・ハードウエア編
STM32F4とSDカードを実用的に繋げるためにはSTM32F4の周辺機能であるSPI若しくは
SDIOを用いて接続可能です。SPIはデータ線が1bitのシリアルですがSDIOは4bit(8bitまで
可能だが8bitバスが利用できるカードは限られている)まで可能でSDIOの方が高速に
データをやり取り可能です。
その代りSDIOの場合はその機能を最大限に引き出すため使用するI/Oポートは固定化
されていてSDIOを使うときは重複する他の周辺機能は使用不可能になります。
一方でSPIは柔軟に割り当てが可能なためピン数がすくない品種で速度をそれほど
要しない場面でSDカードを使う際に重宝します。

おさらいですがSPIを使用するときはSD/MMCのSPI互換モード、SDIOを使用する
時はSD/MMCのネイティブモードとして接続します。当ぶろぐではSDIOを使用する
SD/MMCネイティブモードに特に焦点を当てていきます。


私のおきぱのSTM32F4向けのサンプルではSTM32F4Discovery,STM32F429IDiscovery
ではSPIを、その他のボードに関してはSDIOをそれぞれ使用するようにしております。

↑STM32F4Discoveryとの接続(SPI)

↑紅牛/ECH_BOARD改造基板との接続(SDIO 4bitmode)

SDIO,SPIのいずれの場合においてもSDカード/MMCの電源投入後の初期化時はオープン
コレクタで動作することが前提のため、CLKを除く全てのデータ線は必ずプルアップ
してください。プルアップ抵抗値についてはNxPさんのアプリケーションノートAN10911
極めて詳しい解説があります。私はそれらを吟味した上で10kohmよりちょっと上の
22kohmを常用しております。メーカ製評価ボードでは入手の容易なSDHCカードを想定
しているのか下限値の10kohmで吊っているのが非常に多かったです。また、今日びの
マイコンは内蔵プルアップを有する物が多いですがそれに絶対に頼ってはいけません。
面倒臭がらず必ず外付け抵抗を用いてプルアップしてください。

以前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カードの仕様と
 STM32F4で使用できる全てのSDカードのモードを考慮すると最大200mA必要とします。
 STM32F4Discoveryの3.3V(はショットキDi経由してるので3Vくらいに落ちる)から
 引っ張ってきても"何とか"動きますが高速で信号のやり取りをしていると特に書き
 込み動作の際に不安定になってきます。
 こんな場合は、フェライトビードを無暗に挟むよりもSDカード電源供給専用LDOを
 用意してあげると効果的です。このとき使うLDOはSDカードの高速アクセス時の大電流
 の吸い込み吐き出しに対応するためにセラミックコンデンサ対応の負荷の過渡応答
 性に優れたものを選んでください。
 STM32でSPI限定で使用する場合、仕様上最大で100mAあればよいので秋月さんの
 ラインナップでいうとXC6202P332PR-GTAR5SB33で十分です。勿論LDOの電圧
 供給源(ほとんどの場合はUSBの+5V)は評価ボートと同じ系統にしてください。

 
 ねむさいんは当然のごとく攻守ともに優れたLT1963Aです♥
 ↑秋月さんも私が指摘してた'A'付きにようやく気づいたようでMLCC対応と明記してます。

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

中華Bluetoothなアレを試す2号機


ルールに縛られて使いづらいくせに高価なものを使うよりかはこっそりと安価で有用な
ご禁制を使った方がいい時もあります。よくありません!
現在ではスマホ連動のBlueTooth地鶏棒が販売されていますが技適が取れたもの
よりもとれてない中華製のはかなり安くて海外のネット通販で日本国内で使用すれば
電波法に違反することに気付かず買ってしまう人もいるようです。
2020年の東京オリンピックに向けて海外の旅行客が日本国内では法律違反となる
機器の持ち込みをするケースが増加するため、現在法律面でそれを緩和する調整が
行われています。なおあくまでも外国人向けで日本人には関係なさそうですorz

日本国内ではこういった違法になる機器の販売はほぼ完全に野放し状態ですが使用に
関してはきっちり罰則規定がありますので今回も副業先にある電磁波と音波と振動が
完全遮断された連続稼働試験室(別名お仕置き部屋)で実験という形で行っていますので
間違っても野外や電波の漏れる窓辺では行っていませんのであしからず!
↑建前


前置きが長くなりましたが今回もそんな関係でアレ呼ばわりです。aitendoさんでも
堂々と販売
しておりますがきゅうる村氏のブログ記事の紹介にもある通り正式名称は
まったく別
で代わりにSPP3231とかいう超適当な名前が付けられておりブツどころか
販売側の姿勢にもチャイナクオリティが感じられる一品です。

さて、こちらのモジュールはBolutekというメーカが製造販売していてAliexpressでも
店舗を出して中国直販
しています。メーカー直販なので正規品とも言えますね。
しかしながら、日本で使用不可能なのは変わらないので聖闘士星矢ハーデス編に
例えると正規の冥闘士(スペクター)だろうが寝返ったやつだろうが聖闘士から見たら
同じなわけです。そいえばこのメーカー、ほかのページ見るとアレのそっくりそのまま
のぱちもんも作って名前も同じで堂々と売っていますよ…。



まぁそれは置いといて実験してみましょう。あくまで動作実験です実験!!!

表裏はこんな感じです

前回と同じくBEKENですが型番は違ってBK3231Qなるものが使用されています。

いつものモジュールのモジュール化。
これはデータシートもATコマンド表もメーカーから配布されているので助かります♥
ATコマンドモードに入るKEYは存在せず、ペアリング前にATコマンドを発行して各種
設定を行います。購入直後のUARTは9600N81に設定されていました。HC-06やRN4xXV
では電源投入時に特定のポートのレベルを固定するとボーレートが固定値になります。
このアレでもできるかどうか試してみると固定化出来ませんでした・・・orz
HC-06と一部だけポート互換のようです。変換基板は流用できますのでこちらでも問題ない
と思います。しかしながらコマンド体系はHC-06と違ってATコマンドの末尾にCRLFを必要とし、
HC-05に近いものになっています。データシートやコマンド表見るとHC-05からのこぴぺも
あってまさにぱちm…互換品にしておいてあげましょう(上から目線で
ちなみにSlave固定だそうなのですがROLEコマンドも効くっぽくみえてMasterにできる
のかなと思ったら電源再投入でSlaveに強制的に戻されます。結局Slave専用です。


バージョンストリングはこんなのです。同じ会社のHC-05の丸パクリ品と同じバージョン
ストリングですがホントにこれが正しいのかよくわかりません。チャイナクオリティですね…。


電源投入時やペアリング時・解除時は補助メッセージが出ます。


Bluetooth SPPデバイスとしてはレスポンスもサクサク軽快で230400bpsでもばっちり使用可能
です。安さを求めるならばHC-05やHC-06よりもこちらをお勧めsh

ゲフンゲフフン・・・日本国内では電波が外部に絶対に漏れないような環境で実験目的のみで
使用しないと駄目ですよ!!!!!!!
↑しつこいようですが建前




20151125追:
poke様よりコメントを頂いたのでQが付かない方のモジュールも紹介します。
こいつの正式名称は"SPP-C"です


BK3231Qから小さくなって機能もシュリンクされた感じでしょうか。
尤も私たちが触ることができる周辺機器はUARTだけですけど。


ちなみに中身(ファームウェア)はSPP-CAと全く同一でした。

中華Bluetoothなアレを試す

みなさまあけましておめでとうございます。
今年も当ぶろぐと私たち虹裏メイドをよろしくお願いいたします。

ぶろぐのメインコンテンツが自然歩道/低山ハイクにシフトして電子工作関連で訪れる
人もほとんどいなくなって久しくなりましたが、過去に提供した情報につきましては
後から見に来てくれた方を困らせたりすることがない様に正確性を保ちつつ整備を
続けていく所存ですのでご安心ください。

さらに、これから発信していく情報に関しても去年末の地図の件のようにルール違反
ならないようにしっかり精査をしたうえで提供していくよう心がけたいと思います。
ルールは守ってクリーン行きますよぅ!

●中華Bluetoothなアレ一号機

そうだね
いきなりルール無視のダーティファイトだね。
勿論日本国内の技術基準適合証明なぞ取れてないので型名すら言うことができずアレ
呼ばわりです。使用に関しては副業先にある電磁波と音波と振動が完全遮断された
連続稼働試験室(別名お仕置き部屋)で実験の形で行っていますので間違っても野外や
窓際とかで使うようなルール違反なんかしてませんよぅオホホホ♥
↑建前

このアレはBluetoothのSPPが使える、つまりUARTを手軽に無線化できる便利な代物です。
しかも値段もいずれ紹介するアレよりも安いです。

しかしピン配置くらいしか情報がわからず最初は四苦八苦しました…が何とか使い方を
見出しました。



Bluetoothで有名なのはCSRのチップですがこれはBEKENなる大陸の中華製無線チップ
のようです。さらにそのチップから私のぶろぐでおなじみの台湾製cortex-M0,NuvotonM051
シリーズが繋がっています。UARTの信号はこちらからやり取りを行っています。


裏返すとご丁寧に信号名を振ってくれています。
実際に操作できると思われる信号はKEY/LEDとTxD/RxDくらいでした。しかも他のSPP
モジュールと違いI/O電圧が厳格でRxDにVCC(MAX3.3V)を超える電圧をかけると動作が
即座に停止しやがります###
M051自身はは5V駆動可能ですが5VトレラントI/Oではないのでこうなるようです。


モジュールから脚を引き出して汎用コネクタで差し替え可能にしておきます。



ねむいさん以前から少しずつ自作のワイヤレスモジュール接続用ハブを作ってきました。
中心部にはFTDIのFT232R基板がありこれはVCCIOとして5Vを突っ込んでいます。


てわけでTxDからは抵抗を介していますが5VCMOSレベルの信号が出ているので上記モジュ
ールを使うことが出来ず泣く泣く5VCMOS->3.3VLVCMOSへの電圧変換を挟みました。
(って抵抗でお茶濁してた今までがルール違反ですが)。


また、KEYをHIにして電源を投入するとATコマンドモードになるそうですがデータシート
がどこにも見当たらなかったのでコマンド探しの旅から始めました…。
ひとまず9600N81,CRLFありで基本の"AT"に反応しました。


"AT+VER"
"AT+BAUD"
も見つけました。ボーレートさえ変えられれば何とか使い物になります。ボーレートの
設定に関してはHC-06と似たような感じですね。しかしデバイス名やペアリングキーの
設定は一切できない男らしい仕様のようです。


PCからはこんな感じに認識されました。同じ奴何個も使う時名前変えられないので
混乱必須ですね。


ペアリングキーがないものの追加されたSPP-COMポートを開こうとするとこんなダイアログが
出てきます。もしかして隠しで設定コマンドあるのかしら・・・。


それはさておき230400bpsでも余裕で使用できます。スレーブ専用・フロー制御無しUART
として使うと割り切れば十分に実用可能でしょう。マイコンの工作ではTxD,RxDさえあれば
問題ないですし。

そうやって格闘していたらひょんなことから同じモジュールを使用していると思われる
ピン間隔変換基板に半田付けされたモジュールのモジュールを販売してるところを
見つけました。そこのデータシートを見る限りではやはりATコマンドはボーレートくらい
しかいじる項目がないと言う極めて男らしいブツでしたこれ。


・・・というわけで去年夏前くらいからBluetoothのSPPデバイスをはじめBLEにも手を出して
いろいろためしてきてますのでこのような形で順次紹介していきたいと思います。
中華Bluetoothモジュールは中華TFT-LCD並みに魅力的なのですが何度も言いますが
日本の技術適合証明なんてあるわけないのでクリーンなコンテンツを目指すねむいさんの
ぶろぐとしましては…おや?なんだこんな時間に…



年 始 早 々 こ ん な 内 容 で す み ま せ ん ! !

Go to top of page