2012年1月10日火曜日

RX62N SDカード制御

購入したもの。
安い。

参考にさせてもらおうと思ってるサイト
http://mycom1.cocolog-nifty.com/blog/2008/11/sd-6fe4.html

http://arms22.blog91.fc2.com/blog-entry-294.html

-----------------------------------------------------------------------
やっと、はんだ付けしました。SDカードコネクタが2.54mm間隔じゃないので、ちょっと難しかった。。今回はライトプロテクト端子と、カード検出端子の接続はあきらめました。



ピンヘッダ、買っといてよかったです。12pinのうち、9pin使いました。

まずは、SPIモードで初期化を通すとこが目標!!

-----------------------------------------------------------------------
めちゃ苦労して、やっとキました。





つまづいた原因は、、「SPIの罠」ってサイトで気づきました。。ググッてください。

 ついでに動画も。ちょいデカイ。


さて、あとは、ゴリゴリ書くだけやなぁ。

-----------------------------------------------------------------------
追記:
初期化が通り、tranステート(data-transfer mode)に遷移しました!
Read/Writeは近い。



-----------------------------------------------------------------------
長い間、躓いてました。。

キタようにも見えますが、MBRのデータにしてはシンプルすぎるような。。しかし、末尾の55AAはちゃんとあるので、一応キてるような感じです。

何に躓いてたかというと、なんか不安定な感じで、動いたり動かなかったり。最初はデータラインをプルアップするために、ブレッドボードを介してたんだけど、それが悪いのかと思い、結局、ハンダ付けしました。



不安定さは無くなったものの、データ自体の確認が必要かな。

-----------------------------------------------------------------------
2011/12/12
FATを載せて、デバッグしてました。
ついにきました!


ようやくファイルを認識しました。
次は、SDカード制御最終目標のLCDに転送レート表示です。年内に間に合うか!?

-----------------------------------------------------------------------
2012/1/1
明けましておめでとうございます。

年越しは、鐘の音を聞きつつ、有意義にも半田付けとデバッグでした。
さて、FATに手間取っていながらも、年越しにSDカード検出とライトプロテクト検出ができました。
最初に、カード抜いた状態でポート確認(コマンドd) ⇒ カード無しを検出
次に、カードを挿入した状態でポート確認 ⇒ カード有りを検出
さらに、カードのライトプロテクトスイッチをONにしてカードを挿入 ⇒ カード有り&ライトプロテクト有りを検出

専用基板(このトピックの上のほうの画像)では、カード検出とライトプロテクト検出を諦めましたが、今回のオリジナル基板のSDカードスロットは大成功でした。

-----------------------------------------------------------------------
2012/1/4
ようやく、ファイルオープン、ファイルリードが出来るようになりました。
そこで目標の転送レート表示を7SEGでやってみました。


 動画だと見えにくいですが、
  1. 最初の水色のログ:SDカードをマウントしたときのFATパラメータのログ
  2. 次のファイルリード:初期化時のSDクロック制限である400KHz以下(実際には375KHzs)でMP3ファイルリード(28.7KB/s) ※512byte * 100(50KB)リードしてます
  3. 黄土色の1行のログはSPIのクロック(SDクロック)を上げたログ(375KHz → 1MHz)
  4. あとは3と2の繰り返し
 をやってます。測定結果としては、
  • 375KHz:28.7KB/s
  • 1MHz:58.9KB/s
  • 2MHz:83.3KB/s
  • 3MHz:93.3KB/s
  • 4MHz:99.8KB/s(ちょこちょこ100KB/s超え)
  • 6MHz:エラー。。。(バグと思われ)
  • 12MHz:測定未
  • 24MHz:測定未(RXのSPIとしてはこのクロックが最高)
となりました。

だんだん転送レートが上がらなくなってるのはソフトのどっかがボトルネックになってると思われます。よって、たとえ24MHzが動いたとしても1MB/sまでは遠いでしょう。
なんせ、まだシングルリード(CMD17)でやってます。。

今後の速度改善ですが、
  • マルチリード(CMD18)対応 ※2割増し程度と予測
  • SPIの転送単位を8bitから32bit転送へ ※3倍増しと予測
  • SPI転送完了を待っちゃってるところを非同期化 ※2割増しと予測
  • 測定中のUARTをストップ(7SEGのみ表示) ※1割増しと予測
ぐらいでしょうか。
ファイルライトは実装完了、デバッグ中です。

-----------------------------------------------------------------------
2012/1/4
マルチリードに対応しました。
結果は4MHzで152.2KB/sでした。思ったよか上がったなぁ。
あ、昨日は512byte単位で時間と転送レートがUARTで表示されてたけど、
今日は16KB単位でUART転送が入ったので、結果的にUARTの表示が大きく減ってるのも寄与してるかな。
なら、まぁまぁ妥当かなと。
黄土色の残りバイト数のログを消したところ、4MHzで244.1KB/sでした。。
UARTって遅いんやなぁ。。
32bit転送に対応。4MHzで336.5KB/s。意外と早くならなかったかな。
あとは非同期化くらいしか。。。

よく考えてみると、8bit転送なので、理論値でも500KB/sか。非同期化で400KB/s超えたら十分なとこですね。

-----------------------------------------------------------------------
2012/1/8
ファイルライトに対応しました。
RX62にはCRC演算回路が付いてるので、それも使うようにしました。
CRC演算で少し遅くなったけど、24MHzまで動くようになりました。

結果:
  • Read
    • 4MHz:321.8KB/s
    • 6MHz:407.3KB/s
    • 8MHz:475.5KB/s
    • 12MHz:566.3KB/s
    • 24MHz:689.8KB/s
  • Write
    • 4MHz:318.4KB/s
    • 6MHz:405.4KB/s
    • 8MHz:472.1KB/s
    • 12MHz:565.9KB/s
    • 24MHz:684.9KB/s
ライトは、ほぼリードと同じパフォーマンスに見えますが、同じファイルに追記していく書込み方法で、ディレクトリエントリとFATをキャッシュしてるので実際のパフォーマンスはもう少し遅くなります。(書込み量に依存するので、SpeedClassに準拠した計測方法じゃないと本来はダメ)

-----------------------------------------------------------------------
2012/1/8 追記
簡単な非同期化をやってみました。(送信部と受信部を分割)

Readの24MHzが822.9KB/sまで改善しました。
理論値は3MB/sなので、ちょっと遅いですねぇ。。。

シリアルの表示を全て止めると、1.36MB/sでした!
Writeの24MHzも1.19MB/s!

-----------------------------------------------------------------------
2012/1/10
この更新でSDカード制御についての投稿は〆たいと思います。
Readで2MB/s突破です!!
パフォーマンスは1000byte換算なのでギリ突破です。
Writeも1.7、1.8MB/s程度出てますので、上々です。

次は別のことをやってみようと思います。