Arduino勉強会
2015/02/15からのアクセス回数
SDカードシールドを作ってから、LBEDにはまだSDカードライブラリがないことに気づきました。
通常なら、LBEDは完全を目指す物では無いのでまぁいいや的になるのですが、 lbeDuinoではシールドを作成したガジェットを外に持ち運ぶことが想定されます。
このような状況で記録手段がないことは大きな問題と考え、思い腰を持ち上げてArduinoのSDライブラリの 移植に取り掛かりました。
この記事のみどころ?は、どうやって移植したかでは無く、どうやって動くようにしたかです。
移植の元にしたのは、Arduinoアプリケーション配下の(MacOSX版で説明します)Contents/Resources/Java/libraries/SDです。
このソースはとても良くできていて、SDカードのSPIの処理に関連する部分は、utility/Sd2Card.cpp, SdCard.hに凝縮されています。
lbedへの移植は、Sd2Cardクラスのメンバ変数にSPIクラスの_spi変数とDigitalOutクラスのchipSelect_を追加し、初期化とspiSend, spiRec関数をlbedのSPI用に書き替えるだけです。
Sd2Card.hの変更点
}} ここでは、SDカードシールドに合わせchipSelectをD4に固定としています。
最初は、SPIのSCKLのピンをD10に割り当てており、SDカードの初期化に失敗していました。
ここでもLabToolのプロトコルアナライザーが役に立ちました。
LabToolとlbeDuinoとの接続は、以下の通りです。
LabToolピン | ケーブルの色 | 機能 | lbeDuino |
---|---|---|---|
DIO_3 | Orange | SPI-SSEL | D4 |
DIO_4 | Yellow | SPI-MOSI | D11 |
DIO_5 | Green | SPI-MISO | D12 |
DIO_6 | Blue | SPI_SCK | D13 |
SDカードの処理手順は、ChaNさんの http://elm-chan.org/docs/mmc/mmc.html を参考にさせて頂きました。
初期化のchipSelectがHightでSCKLを74クロック以上入れるとある部分では、80回のクロックを入れた後初期化コマンドを送っています。
初期化でSDカードの情報のタイプはきちんと読み込んでいるのですが、SDカードのMBRを読み込んだ後にエラーとなってしまいます。
ここでもLabToolが役立ちました。以下の画面では、0x0が続いて読み込まれており、デバッガでもその値が正しく読み取れました。
このような状態ではSPIの読込が原因では無いことが明らかです。
そこで、FAT関連の構造体をよく見てみると原因が隠れていました。
FatStructs.hを見てみると、fat32BootSectorの構造体が以下の様に定義されています。
struct fat32BootSector {
}__attribute__
}}
volumeSerialNumberの後に、char型でvolumeLabel[11], fileSystemType[8]と定義されています。
32bitマイコンのLPC1114では、構造体のアライメントが32bit単位となるので、volumeLabelとfileSystemTypeは連続した領域に割り当てられません。そこで、FatStructs.h内の構造体の終わりに__attribute__
Arduino勉強会/0G-lbeDuinoシールドを作るの結果を再度掲載します。
皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。
スパム防止に画像の文字列も入力してください。