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カードにアクセスするドライバを組んで実際に動かす
ソフト編をご紹介いたします!
中華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並みに魅力的なのですが
何度も言いますが日本の技術適合証明なんてあるわけないのでクリーンな
コンテンツを目指すねむいさんのぶろぐとしましては…おや?なんだこんな時間に…
年 始 早 々 こ ん な 内 容 で す み ま せ ん ! !
免責・連絡先は↑のリンクを
↓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.