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を除く全てのデータ線は必ず
外付け抵抗でプルアップしてください。
プルアップ抵抗値についてはNexperia(元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