トップページ PIC SDCard

SDカードの読み書き                        2010/6/11更新
 今度はPIC48F4520を使ってSDカードの読み書きができました。
とりあえず、PICとSDカードおよびRS232Cのインターフェースを実装しただけです。
PICとSDカードの接続は、Mikro Cのヘルプにある回路図でやってみました。


実際は抵抗を買い忘れたので、SDカードの電圧が3.3Vになるように回路図とは違っています。
回路図にない発信回路は10MHzクリスタルと15pFのコンデンサを使っています。そして、それを40MHzで動作させています。本当は回路図を書けばいいのですが.....面倒!

最初に実験したときは、PIC18F4550でやっていました。
しかし、PC4550などではSDカードのインターフェースはRS232CとRC7がバッティングしています。これは不都合なのでヘルプにあるPIC18F4520を使うことにしました。

今まで悩まされてきたMikro Cの不具合と思っていたことが、原因が判明しブートローダー対応できたので快適です。
試してみると、
2.4KBの書き込みに1秒くらいかかる
2.4KBの書き込みに0.2くらいかかる
ということで書き込みに時間がかかりすぎるようです。
もう少し検証してみたいと思っています。
使う関数は少なくてすむ!
カードが未挿入などのエラーは省略。必要な関数のみを書きます。

SDカード、マルチメディアカードの初期化
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_LOW_2_HIGH);
Mmc_Init();
(Mmc_Fat_Init() ;
{

ファイルの読み込み
Mmc_Fat_Assign(g_szReadFileName, 0x00);
Mmc_Fat_Reset(&size);
sizeにファイルの大きさを取得します。

for(i = 0; i < size; i++)
{
  Mmc_Fat_Read(&g_chSDdata);
  g_szTextBuf[i] = g_chSDdata;
}
Mmc_Fat_Read()でファイルから1バイト読み込んで配列に書き込みます。
配列にファイルのデータが読み込まれます。

ファイルへ書き込み
Mmc_Fat_Assign(g_szWriteFileName, 0xA0);
Mmc_Fat_Rewrite();
Mmc_Fat_Write(g_szTextBuf, size);

これだけです。
前回と同じくこの方法でできます。
前回は途中で読み書きできなくなり、PICが壊れたか、カードが壊れたか、ブートローダーのバグか、Mikro Cのバグかわからない状態でしたが、問題が解決したので今回は安定しています。

この開発の最中にPICが動作しなくなるという不具合を検証していたので、ソースファイルがグチャグチャです。ソースが見たい人がいれば公開も可能ですので、メールでお願いいたします。
結論として
とりあえずはじめてのPIC18F4520を動かすことができました。
SDカードを読み書きができるようになったので、いろいろ応用ができそうです。

それからPIC18F4520は品薄のようです。(2010年6月現在)購入するときは壊れたときのことを考えて複数買っておいはほうがいいかもしれません。