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/
Num | SD Card pin | Module pin | Pin Name | Port Name | SPI |
---|---|---|---|---|---|
1 | CD/DAT3 | CS | D10 | PB6 | - |
2 | CMD/DI | SDI | D11 | PA_7 | MOSI |
3 | VSS1 | GND | GND | - | - |
4 | VDD | 3.3V | 3V3 | - | - |
5 | CLK | CLK | D13 | PA_5 | SCLK |
6 | VSS2 | GND | GND | - | - |
7 | DAT0/DO | SDO | D12 | PA_6 | MISO |
8 | DAT1 | - | - | - | - |
9 | DAT2 | - | - | - | - |
電源+/-を含め合計6本の結線で接続します。
Nucleoシリーズは、ボード上のLED(プログラムでLED1)がD13に接続されSPIモード設定時にSCLKとなる構成が多いので、注意が必要です。
PCからの操作
ボード上のユーザーボタンを押すか、ターミナルソフトウェアをPC側で立ち上げて動作中に何らかのキーをたたけば、ChaNさんのプログラムを拝借してきて改造したモニタープログラムが動き出します。
コマンドは、下記のようになります。
コマンド | 説明 |
---|---|
dir | そのDirectory内のファイルや Sub Directoryを表示 |
type [file_name] | ファイル内容を画面表示 |
vol | Disk定義された基本情報を表示 |
q | モニタープログラムの終了 |
t | 時間設定 |
? | ヘルプ |
ren [org] [new] | リネーム |
copy [org] [new] | コピー |
mkdir [dir_name] | Directoryの作成 |
cd [dir] | Directoryへの移動 |
x | ChaNさん作成の各種コマンドへの移動 |
利用頻度の高いものと思われる順で並べてみました。
時間設定をすれば、ファイルのタイムスタンプも正しく設定されます。
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):
Please log in to post comments.
こんにちは。 質問させていただいてよろしいでしょうか? 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 フォルダがありません。 お時間ありましたら教えていただけるとなによりです。