スキータイム計測機 開発日誌

とある大学生の競技スキー用タイム計測機の開発日誌です。とかいいつつ関係ないことも書きます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PIC18FでSDカードを扱う その3

昨日のPIC18FでSDカードを扱う その2の続きです。
昨日まででソフトウェア関連の準備はできました。あとは回路を用意してテストするだけです。
今回はあくまでテストなので全てブレッドボード上でテストします。


SDカードをハードウェア的に扱う上で重要なのはSDカードの電源は3V前後でなければならないことです。
確か定格が2.7~3.3Vだったかと思います。
それを多少超えても大丈夫だとは思いますが、今回は三端子レギュレータを使って3.3VでSDカードを動かすことにしてみます。
一番簡単なのはPIC含めシステム全体を3.3Vで動かせればいいのですが、私は諸事情によってPICは5Vで動かさなければなりませんでした。
なので、今回は「PIC5V、SDカード3.3V」でテストしようと思います。


使用したSDカードソケットは、秋月電子で売っていたソケットです。1個150円。
SDカードも秋月で8M100円のものを買いました。8Mっすよ8M。PICのRAMに比べると夢のような大きさですね。


まずは回路図から。
MicrochipのSDカードライブラリは流石しっかりしたもので、SDカードの全てのピンをフル活用しないと動いてくれません。
SDカードテスト回路図


別の回路図からいらない部分をとっぱらったものなので番号などはずれていますが気にせずに。
EAGLEで描きました。
真ん中したがSDカードソケットですね。
VDDが5Vで、SDカード用に三端子レギュレータで3.3VをつくってSDカードソケットのVDDピンに流しています。
GNDは1-4までありますが、全てソケット自体でショートしているのでどれかひとつGNDに落とせばOKです。
なぜソケットをGNDに落とすかという理由は後ほど。


右上のピンから行くと、
CLK/SCLKは信号のクロック入力、CMD/DIはSPIデータ入力、CD/DAT3はチップセレクト入力です。
これら3ピンは入力なので、5V駆動のPINと3.3V駆動のSDカード間でレベル変換をしてやる必要があります。
今回は簡単に抵抗2つで分圧するだけにしました。これでも十分通信は可能です。
恐らくデータリード時に使うのであろうDAT0ピンは、レベル変換せずに直接PICのピンにつないでしまいます。
今回はデータリードはしていないので、これでも問題なく動いています。
しかし、もしデータリードする場合はSDカードの出力電圧によっては正常にできない場合があります。その場合はトランジスタ等でレベル変換をしてあげてください。


そして、ひっかかりやすいのがCDI#・WPピンです。
まず、これらのピンはそれぞれカード挿入検知、書き込みプロテクト検知のためのピンです。
しかし、これらのピンは直接SDカードのピンと接続されているわけではなく、ただソケット自身と接触しているか否かなのです。

結果から言うと、これら2つのピンの入力をするPICのピンが、両方ともL、0Vと認識すればSDカードの初期化ができます。
というのは、Microchipのライブラリの初期化過程を1行ずつ追っていくと、そうなっているからです。
SDカードの扱い方の参考文献で昨日後閑哲也氏の「LCD&タッチセンサ活用の素」を挙げましたが、正誤表にあるとおり、実はこの点が間違って書かれています。
なので、カード挿入やプロテクト検知などをする必要がなければ、2つの入力ピンは直接グランドに落としてしまっても構わないわけです。
(私はこの点で丸2日悩み続けました)


しかしやっぱりせっかくそれ用のピンがSDカードソケットにあるわけですから使ってやりたいですね。
その場合、
CDI#(カード挿入検知):「挿入時L、非挿入時Hを出力」
WP(書き込みプロテクト):「非プロテクト時L、プロテクト時Hを出力」

されているようにすればOKです。
つまり、SDカードを正常に挿入したとき、両方ともLが出力されていればいいわけです。そうすればきちんとライブラリは初期化をしてくれます。


では、そのように出力されるためにはどうすればいいか。
SDカードソケットにおけるそれら2つのピンは、CDI#ピンは挿入時、WPは非プロテクト時ソケット自体とショートしますので、ソケット自体をGNDに落としてやります。(回路図でGND1-4をGNDに落としてやっているのはそのためです)
また、非挿入時、非プロテクト時はそれぞれのピンはオープンになりますので、そのままだと不安定です。
なのでそういう時の場合のために回路図のように10kでプルアップします。
こうすることでライブラリの期待する入出力がされるようになります。



もし、プログラムを動かしてみてSDカードをPCで見て、ファイルはできてるのに壊れている、などという場合はこの入出力が間違っている場合があります。確認してみてください。



さて、最後の問題はSDカードソケットをどうやってブレッドボードで使うか、という問題です。
というのはSDカードソケットの8,11,10ピンが非常に狭いので・・・。


私はこんな感じにしました。
SDカードブレッドボード


余ったユニバーサル基板に10,11ピン以外をランドにはんだづけし(ソケット自体も)、あとの2ピンは狭いので、ランドに接触しないように直接ケーブルをハンダ付けしました。
ショートしやすいので気をつけてください。



これで全部準備完了です。
16F2620にプログラムを流しこんで電源を入れてみてください。
うまくいけば、0.5秒ほどで初期化から書き込みからクローズまで全て完了します。



※電源を入れたあと、もともとSDカードにあったファイルをアペンドモードで開くことができませんでした。原因は不明。ただファイルを作ったあと、電源を付けている間であれば、ファイルを閉じ、アペンドモードで開いて追加書き込みし、閉じて、ということは可能です。
スポンサーサイト

コメント

大変参考になりました

ホームページ拝見させていただきました。
このHPへ来る前に、FATFSを用いて、PIC18でSDカード書き込み等を検討していたのですが、うまくいきませんでした。
microchipのMMDはRAMがたくさんないと動かせないので、私の使いたいPIC18F2580では難しいと判断して、逃げておりました。(別でdspic30f4013等では動作を確認。安定してます)
さて、もしお願いができましたらメモリ使用状況を教えていただけませんでしょうか。
http://www.mars.dti.ne.jp/~m7030/pic_room/fatfs/index.html

あわせてソースをアップいただくことはできませんでしょうか。
厚かましいお願いですみません。
以上、ご検討よろしくお願いします。

  • 2011/12/21(水) 00:54:35 |
  • URL |
  • estima #dWnOXZAI
  • [ 編集 ]

Re: 大変参考になりました

ご返事遅れました。
確かにmicrochipのMMDはROMRAM共にかなり使いますね。16F2580ではROMが32KB(16KW)なのでキツイかと思います。
私は18F2620(64KB,32KW)を使い、この記事のその1にあるようにかなりの機能を制限しましたが、それでも32KW中約28KWは使用しています。(これはSD以外のアプリケーションも含めなので実際にはもう少し小さい)
18FでMMDを組み込む場合は64kB以上ROMがあるPICでないと難しいのではないかと思います。

ソースについてですが、デフォルトのMMDからの変更部分は記事のその1やその2にございます。変更済みのソースはこちらです。(disp1.cにはこの記事以降に書いたアプリケーション部分が色々ありますが気にしないでください)
おそらくこの3つがデフォルトから変更したものだと思います。
https://docs.google.com/open?id=0B4gkcvL5KfnsM2Y4NWNjOTMtNGFhMC00M2U4LTg0NjAtYjExODJmMjhmZTUz
(googledocを使ってアップするのは初めてなので見られない場合は教えてください)

  • 2011/12/26(月) 20:28:41 |
  • URL |
  • 水田かなめ #1tF0Ygio
  • [ 編集 ]

返答いただきありがとうございました

お忙しいところ回答ありがとうございました。
年末年始没頭していろいろやってみましたが、MMDは難しいことがわかりましたので、FATFS、PetitFATなど取り組んでみましたが、いまだにできていません。
Googledocをみることができました。重ねてありがとうございました。

  • 2012/01/09(月) 12:19:45 |
  • URL |
  • estima #fuxrM8QI
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://elecski.blog106.fc2.com/tb.php/30-de337d51
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。