mbedの使い方|SDメモリーカードを使う|マイコン入門

当サイトにはアフィリエイト広告が表示されます。

mbedの基本的なI/O方法と実例。
この記事ではSDメモリーカードへのアクセスを行います。

興味があるところを読む

SDメモリーカードを使う

 ライブラリが有るんで使うのは簡単(mbed以外のCPUで使うならELMさんのFatFsが便利です)。
 OSを入れるまでもなくFATファイルシステムをチョー簡単に使用可能・・・素晴らしい。
 でもUART受信を落とす。
 でっかいデータをUARTで115200bpsで受信しながらSDカードに(ファイルとして)書き込むと受信データを落とす。
 まだライブラリを良く見てないけど、カードへのアクセス時に割込みを禁止してる?UART側の受信バッファオーバーとか?不明。
 で、対症療法としてCTSを上げ下げして、相手(パソコン)の送信を時々停めてやるハードウエアフロー制御を追加。
 試しに2Mbyteのデータを受信&File書き込みしてみたけどOK・・・実用的にはこれで十分だ。

// mbed側 C++

DigitalOut    dbL1(LED1);
SDFileSystem  sd(p5, p6, p7, p22, "sd");     // mosi, miso, sclk, ss(p22)

void main(void)
{
    //---------------------------------
    // SDカードR/Wテスト
    //---------------------------------
    dbL1 = 0; // デバッグ用LEDをOFF
    char *fname = "/sd/test.txt";    // ここに/sd/が必須
    byte s1[50], s2[50];
    strcpy((char*)s1, "1234567890");
    if (TRUE == WrFile_Pkt(fname, s1, 10)) {
        if (TRUE == RdFile_Pkt(fname, s2, 50)) dbL1 = 1;    // 成功ならデバッグ用LEDをON
    }
}
//========================================================================================
// GLOBAL 指定fileから読む
//========================================================================================
bool RdFile_Pkt(char *fname, byte *ptr, int size)
{
    FILE *fp;
    if (NULL == (fp=fopen(fname, "rb" ))) return FALSE;
    fread(ptr, 1, size, fp);
    fclose(fp);
    return TRUE;
}
//========================================================================================
// GLOBAL 指定fileに書く
//========================================================================================
bool WrFile_Pkt(char *fname, byte *ptr, int size)
{
    FILE *fp;
    if (NULL == (fp=fopen(fname, "wb" ))) return FALSE;
    fwrite(ptr, 1, size, fp);
    fclose(fp);
    return TRUE;
}
// パソコン側のC#のプログラム 
 	
const int sz = 0x200000;
byte[] buf = new byte[2];
byte csum = 0;
for (int i = 0; i < sz; ++i) {
    buf[0] = (byte)i;
    csum += buf[0];
    serialPort1.Write(buf, 0, 1);
    while (false == serialPort1.CtsHolding) Thread.Sleep(1);    // targetでLにするとTrueになる
}
buf[0] = (byte)(0xff - csum);
serialPort1.Write(buf, 0, 1);
 	 
// mbed側のプログラム 
 	DigitalOut CTS(p26);  // 秋月のL023_FT232RLのCTS(CN2-10)とp26を接続
define _BFSZ 64       // このサイズを変えても通信時間に大差はない
bool func(char*fname)
{
    byte buf[_BFSZ+1];
    FILE *fp;
    if (NULL == (fp=fopen(fname, "wb" ))) return FALSE;
    while (1) {
        CTS=0; // CTS enable(PCは送信して寄こせ)
        // ここで受信データをバッファへ溜め込み・・・
        CTS=1; // CTS disable(PCは送信待て)
        if (fwrite(buf, 1, _BFSZ, fp) < _BFSZ) break; // write error
        ;
スポンサーリンク
スポンサーリンク
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


興味があるところを読む