PSoCでSDカードに書き込む

psoc_sd_01.gif
今回はPSoCにSDカードを接続して書き込んでみる。PSoC DesignerにはSDカードを利用するための「SDCard」モジュールが用意されている。今回はこれを利用した。このモジュールはFAT16とFAT32をサポートし、最大で2GBのメディアを扱える。
ただしこのユーザーモジュールは結論から書くと非常に遅く(今回は100バイト程度書き込んだが30秒かかった)、SDカードの内容が完全に消えてしまうこともある。ファイルの作成日時設定用のAPIも用意されていないなど、かなり中途半端なものだった。

_DSC9252.JPG
まずはSDカードのソケットを準備する。「SDカード」とは書いたがSDカードは持っていないのでminiSDカードを使うことにした。ソケットはこれ。以前携帯電話を買ったときに付属していたminiSDカード→SDカードの変換アダプター。

PSoCでSDカードを使うのに必要なものは...SDカード(最大2GB)、SDカードソケット、10KΩの抵抗×3、300Ωの抵抗×3、3.3V出力の3端子レギュレーター、10~100μF程度の電解コンデンサー×2、0.01μF程度の積層セラミックコンデンサー×2かな?。PSoCはCY8C29466など、CY8C29xxxのものが必要(データシートはCY7C29xxxとなっているがそれは誤植)。

_DSC9253.JPG
端子めんを見ると金メッキされた端子が見える。ここにリード線を直接ハンダ付けしてしまう。

_DSC9254.JPG
こんな感じ。せっかくだったのでプルアップ抵抗もつけた。SDカードモジュールのデータシートによると10KΩと300Ωの2通りのプルアップ抵抗だったのだが...間違えて全部10KΩでプルアップしてしまった。PSoCを3.3Vで動かす場合は10KΩの抵抗3つ、PSoCを5Vで動かす場合は10KΩを3つと300Ωを3つ利用するのが正しい。
写真上から緑黒の線をポート05、緑赤をポート04、ピンクを3.3V、灰をGND、橙黒をポート03、橙赤をポート02に接続した。

_DSC9256.JPG
SDカードに供給するための3.3Vは秋月電子で売られていた4端子レギュレーターを利用した。1ピンに5V、3ピンをGNDに接続すると2ピンから3.3Vが出力される。
5Vと3.3Vラインには10μFの電解コンデンサーを入れた。積層コンデンサーは面倒だったので入れていない。

psoc_sd_02.gif
PSoC Designerを起動したら「Digital Comm」にある「SDCard」を右クリックして現れるメニューから「Select」を選択してプロジェクトに追加する。

psoc_sd_03.gif
すると利用モードの選択画面が開く。今回はライトプロテクト端子などの制御は行わない(ソケットの形状から行なえない)ので「SDCard without Card Detect or Write Protect Inputs」を選択する。

psoc_sd_04.gif
そして「SDCard_1」が追加されたら、アイコンを右クリックして現れるメニューから「Rename」を選択して名前を「SDCard」に変更する。

psoc_sd_06.gif
名前を変更したら「Config」メニューの「Interconnect」を選択して配線設定画面に切り替える。

psoc_sd_07.gif
そして「SDCard」のアイコンを右クリックして現れるメニューから「Place」を選択して配置する。

psoc_sd_08.gif
「VC1=SysClk/N」を「6」に、
「VC2=VC1/N」を「8」に、
「Clock」を「VC2」に、
「SD_DO」を「Row_0_Input_1」に、
「SD_DI」を「Row_0_Output_3」に、
「SD_SClk」を「Row_0_Output_0」に、
「SD_CS_Port」を「Port_0」に、
「SD_CS_Pin」を「Port_0_2」にする。「SDCard」モジュールに供給するクロックは最大4MHzまで対応しているが、今回はその8分の1の500Hzを供給している。4MHzを供給した場合はSDカードの内容が消えてしまったからだ。

psoc_sd_09.gif
さらに内部配線をする。今回はSDカード関連の信号をポート0にまとめた。
ポート02にSD_CS、
ポート03にSD_DI、
ポート04にSD_SCLK、
ポート05にSD_DOを接続した。さらにポート02~04の「Drive」を「Strong」から「Open Drain Low」に変更する。PSoCを5Vで使う場合は変更を忘れないように。
なおポート0内で利用していないポートにLEDなどを接続してもきちんとコントロールできない。どうやらSDCardモジュール内で未使用ポートも書き換えているようだ。そのためポート0内の未使用端子は使わない方がいい。

psoc_sd_10.gif
かなり作業が多かったのでもう一度間違えていないか確認してから、「View」メニューの「Application Editor」を選択してソースコード編集画面に切り替える。

psoc_sd_11.gif
そして「Source Files」の「main.c」に処理を書く。今回は「SDCard」モジュール内のサンプルコードを流用して、「Hello Worldx」という文字を10行出力するようにした。また、ポート1にLEDを2つ用意してビジー信号が分かるようにした。PSoCのSDカードアクセスは非常に遅いので、ビジー状態を見るためのLEDは省略せずに用意した方がいい。


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

#include "stdlib.h"


char helloFile[] = "hello.txt";

void main()
{
char cardInfo; // Card information
char fp; // File Pointer
int i;
char pszBuff[10];

// make Port16 an Port18 to "strong" for LED
PRT1DM0 |= (0x40 | 0x80);
PRT1DM1 &= ~(0x40 | 0x80);
PRT1DM2 &= ~(0x40 | 0x80);

SDCard_Start( ); // initialize hardware and SDCard_lib buffers

PRT1DR |= 0x80; //nEnd LED On
for(i = 0; i < 10; i++)
{
PRT1DR |= 0x40; //Busy LED On

SDCard_Select(SDCard_ENABLE); // Select card
cardInfo = 0;
while ( ! cardInfo ) // Wait for card to communicate
{
// initialize card, determine card type and file system type
cardInfo = SDCard_InitCard();
}

fp = SDCard_fopen(helloFile,"a"); // Open file to append data
SDCard_fputcs("Hello World", fp); // Write string
itoa(pszBuff,i,10);
SDCard_fputs(pszBuff, fp); // Write string
SDCard_fputcs("\r\n", fp); // Write string
SDCard_fclose(fp); // Close file
SDCard_Select(SDCard_DISABLE); // Deselect card

PRT1DR &= ~0x40; //Busy LED Off
}
PRT1DR &= ~0x80; //nEnd LED Off
}





_DSC9255.JPG
これでPSoCへ書き込んで動かしてみた。10行書き込むのにおよそ30秒かかった。SDカード内にほかのファイルが多く入っている場合はさらに遅くなるようだ。遅いのはSDCard_InitCard();の部分のようなので、一度SDカードを捕まえたらPSoCの電源を切るまで離さないようにした方がいいのかもしれない。


psoc_sd_12.gif
SDカードの中を見てみると「hello.txt」というファイルができていた。

psoc_sd_13.gif
開いてみると確かに書き込まれていた。

しかしその後、1回ファイルを開いてから大量に書き込んだりバイナリ書き込みなどのテストをしてみると、まれに書き込み文字が化けていたり、fopenを使い追記モードでファイルを開いたとたんにそれまであったファイル内容がすべて文字化けしたり、ファイル名が「07071000.txt」のようにゼロから始まると(?)失敗したり...というトラブルが生じた。どうもPSoCのSDカードモジュールは使い物にならないようだ。簡単に使えて便利だと思ったのだが非常に残念。



カテゴリー「電子工作」 のエントリー