SD Card Control (New)

May 2nd, 2020
プログラムサンプル全て更新(mbed-os5.15.3)。

Dec. 27th, 2019
Disk関連のプログラムサンプル全て更新。
ポイント
1)os5.15.0に更新(但しF769に関しては、エラー発生頻度が多くなり断念)
2) ファイルサイズ情報の表示
3)確認したMbedボードの追加
4)不具合解決 → エラー時のfclose()がシステム停止につながっていたので、修正

July 26th, 2019
DISCO-F769NIのプログラム修正。
BlockDeviceのアップデートの影響で、virtual関数追加。
DISCO-F469NI追加。

June 4th, 2019
os2及びos5の最新版で動作確認済。
os5では、sd-driverが不要になり、SDカード制御ではos5のみで全ての制御が成立するようになった。
mbed_app.jsonが重要!!

始めに

2010年4月にSDカードのプログラムをmbed上で作成して公開し、その後2014年にアップデートしたのですが、本日(2018/4/7)久しぶりにアップデートしました(最新May 2nd,'20)。
Mbedがos2とos5の2系統あることから、今回は同じmain.cppを両方で動作する形にしてみました。
os5では、ChaNさんのFatFsがos内部に取り込まれていますので、使用するライブラリーがos2と違います。
更に、RAM Diskの構築も追加ライブラリーなしでos5では可能になっていますので、そのサンプルプログラムも作成しています。
プログラムデバッグ中に、Roy KrikkeさんがDISCO-F746NGボードに実装されているmicroSDを利用するプログラムを公開してくれたので、DISCO-F769NI用に書き換えて公開しました。
これら4つのサンプルプログラムは、同じ機能を実現していますので、main.cppは殆ど同じになっています。
追加機能として、ChaNさんのサンプルプログラムをお借りしてきて、PCからVCOMを利用してファイルやディスクの状況確認が出来るようにしてみました。

プログラム

os2での動作で、下記結線準備が必要。
FatFs並びにSD用ライブラリーが必要。

Import programSD_Card_Control

SD-Card Control Program / Using Micro-SD / based on SDCardTest Program (http://mbed.org/users/simon/programs/SDCardTest/gpdz4x/)

os5での動作で、下記結線準備が必要。
FatFsは、os5内に取り込まれているので、SD用のドライバーのみ必要。
os5内で全ての制御が完結するようになった。

Import programSD_Card_Control_on_OS5

SD Card control on Mbed os5

ハードウェアの準備は不要で、簡単に動作確認出来る。
os5内の機能だけで動作し、外部ライブラリーは不要(もちろんFatFsを利用している)。
Mbedの各種ボードで動作させる場合には、RAMサイズに注意のこと。
SDカード(含むmicroSD)では、ファイルサイズを気にせずに無限ループで書き込んでいるが、RAMディスクではディスクサイズを気にしていて、エラーとなる前に停止させている。

Import programRAM_Disk_Control

RAM Disk function using Mbed os5 standard library

DISCO-F769NI専用で、microSDカードを挿入するだけで動作確認可能。
DISCO-F746NGをお持ちの方は、オリジナルの下記ライブラリーを持ってくれば、動作させることが出来る。出来なくなったので、virtual関数を追加する必要あり。
/users/roykrikke/code/BD_SD_DISCO_F746NG/
下記は、mbed-os5.13.0 5.15.3(May 2nd, '20)にて動作確認済。

Import programDISCO-F769NI_BD_SD_Card_Control

microSD Card control function for DISCO-F769NI based on BD_SD_DISCO_F746NG library by Roy Krikke

F469NIも同様に修正。

Import programDISCO-F469NI_BD_SD_Card_Control

microSD Card control function for DISCO-F469NI based on BD_SD_DISCO_F746NG library by Roy Krikke


Dec. 27th, 2019追記 fclose()に伴う不具合
<従来のシーケンス>
ファイルオープン時にエラーが発生しても、fclose()を実行していた。
そのためにOSが例外判断し、停止してしまった。

    FILE* fp = fopen("/fs/mydata.txt", "a");
    if (fp != 0) {
        printf("ERROR\r\n");
        fprintf(fp,"start\r\n");
    } else {
        printf("ERROR\r\n");
    }
    fclose(fp);

<修正シーケンス>
エラー発生時には、fclose()しない。

    FILE* fp = fopen("/fs/mydata.txt", "a");
    if (fp != 0) {
        printf("ERROR\r\n");
        fprintf(fp,"start\r\n");
        fclose(fp);
    } else {
        printf("ERROR\r\n");
    }

結線

Nucleo-F446REボードで下記のような結線で確認しました。
使用したカードモジュールは、下記のものです。
http://akizukidenshi.com/catalog/g/gK-05818/

NumSD Card pinModule pinPin NamePort NameSPI
1CD/DAT3CSD10PB6-
2CMD/DISDID11PA_7MOSI
3VSS1GNDGND--
4VDD3.3V3V3--
5CLKCLKD13PA_5SCLK
6VSS2GNDGND--
7DAT0/DOSDOD12PA_6MISO
8DAT1----
9DAT2----

電源+/-を含め合計6本の結線で接続します。
Nucleoシリーズは、ボード上のLED(プログラムでLED1)がD13に接続されSPIモード設定時にSCLKとなる構成が多いので、注意が必要です。

PCからの操作

ボード上のユーザーボタンを押すか、ターミナルソフトウェアをPC側で立ち上げて動作中に何らかのキーをたたけば、ChaNさんのプログラムを拝借してきて改造したモニタープログラムが動き出します。
コマンドは、下記のようになります。

コマンド説明
dirそのDirectory内のファイルや Sub Directoryを表示
type [file_name]ファイル内容を画面表示
volDisk定義された基本情報を表示
qモニタープログラムの終了
t時間設定
?ヘルプ
ren [org] [new]リネーム
copy [org] [new]コピー
mkdir [dir_name]Directoryの作成
cd [dir]Directoryへの移動
xChaNさん作成の各種コマンドへの移動

利用頻度の高いものと思われる順で並べてみました。
時間設定をすれば、ファイルのタイムスタンプも正しく設定されます。
NucleoシリーズのRTC機能は、以前は時間設定を正しくしてもリセットすると初期化されてしまっていましたが、現在はリセットしても値は保たたれます。
更に、バッテリーバックアップをすれば、電源OFFでも日時が保持されています。
詳しくは、ここを参照してみてください。
/users/kenjiArai/notebook/nucleo-series-rtc-control-under-power-onoff-and-re/
時間設定は、
.>t 18 4 7 13 20 30
というように、tの後に数字とスペースで入力して時計に同時してEnterを押せば設定できます。
上記例では、2018年4月7日午後1時20分30秒となります。
時刻確認は、tだけでEnterすれば表示されます。
xでの拡張コマンドは、ChaNさんのところから拝借してエラーを無くしただけで確認作業は行っていませんので、あしからず。


4 comments on SD Card Control (New):

25 Mar 2020

こんにちは。 質問させていただいてよろしいでしょうか? Nucleo-F401REを使っています。 ここに以下のサイトからmbedOS5のソースを移植してみました。 (mbed-dev)

https://os.mbed.com/users/mbed_official/code/mbed-dev/

SDカードを動かしてみようと思ったのですが、うまく動きません。 そしてこちらのサイトにたどり着きました。 SD_Card_Control_on_OS5のプロジェクトを拝見させていただきました。 同じOS5であるのにもかかわらずファイルの構成が違うのはなぜなのでしょうか? 例えば新井さんのプロジェクトのmbedフォルダは mbed-os になっていますが上のサイトから持ってきたものは mbed-dev です。 また mbed-dev 以下には SDBlockDevice.cpp, h がありません。 mbed-devの下に components フォルダがありません。 お時間ありましたら教えていただけるとなによりです。

01 May 2020

miki naさん
返信遅れて申し訳ありませんでした。
Mbedは、revision更新が頻発し安定して使用できるrevisionが使用するCPUで異なるために大変です。
私の公開しているサンプルプログラムも、10年前の古いものもあるので利用する際には、os2かos5なのか、更にrevision確認が重要です(もうすぐos6も出るらしいので更に注意要)。

先ずご質問の上記リンク先ですが、mbed-devはmbed-os5ではありません。
mbed-os5の最新版は下記でソースファイルを見ることが出来ます。
https://github.com/ARMmbed/mbed-os
歴史的には、os2のソースファイル群をmbed-srcとして紹介し、その後mbed-devとして公開しました。
更にRTOS機能拡張でos5がリリースされましたが、そのソースファイル群は上記GitHubで公開されています。

さて本題のSDカードの件ですが、これもos2の時代から多くの変更が加わっており、最近ではご指摘の通りSDBlockDeviceを使用しています。
os5最新版では、SDカードの制御ライブラリはすべてos5内で完結する形となり追加ライブラリなしで使用できるようになっています。
https://github.com/ARMmbed/mbed-os/tree/master/components/storage/blockdevice/COMPONENT_SD
更に、このSPI使用の上記BlockDeviceにChaNさんのFatFsを組み合わせることで(FATFileSystem)でSDカードの管理がなされています。
http://elm-chan.org/fsw/ff/00index_e.html
https://github.com/ARMmbed/mbed-os/tree/master/features/storage/filesystem/fat
os2当初からFatFsが使われていましたが、その後littlefsというものも登場しており、これもos5に包括されています。
https://github.com/ARMmbed/mbed-os/tree/master/features/storage/filesystem/littlefs
従って、現時点ではSDカード制御には、①BlockDevice+FATFileSystemと、②BlockDevice+LittleFileSystemが選択できるようですが、②は使用経験がありませんので内容を承知していません。
このあたりの情報は英文ですが、下記にos5.15のドキュメントとしてまとめられています。
https://os.mbed.com/docs/mbed-os/v5.15/apis/filesystem.html

SDカードの動作が上手く出来ていないとの事ですが、先ずは症状の切り分けをしてみてください。
下記プログラムは、F401REで動作します。
https://os.mbed.com/users/kenjiArai/code/SD_Card_Control_on_OS5/
1)SDカードをPCで動作確認する(FAT32でフォーマットしたもので使用できます)
2)ハードウェア結線の確認(電源は+3.3Vで)
3)ターミナルでの動作状況確認
状況をお知らせいただければ、またお答えします。

27 May 2020

Kenji Araiさま

返信ありがとうございます。 こちらも返信が遅くなり、すみません。 OS2の方なのですが、いろいろ調べて試して何とか動かすことができました。

お手数おかけしました。

21 Jul 2020

LPC1768には対応していますでしょうか?

Please log in to post comments.