メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |

お問い合わせメールフォームが開きます。
2016年10月13日
SDカードへ保存(FatFs)

マイコンを使用した小型の組込みシステムで各種データをSDカードやUSBメモリへ保存したい場合があります。
以前、定番の「FatFs 汎用FATファイルシステム モジュール」とPIC24FJ64GA002を使用してSDカードへのデータアクセスの動作検証したものをアップしておきます。
はじめに「ぷちFatFs」の動作を確認した後「FatFs」を確認した際にSDカードからの応答がありませんでした。
それぞれの回路図を見ると、「FatFs」は”Card Detect” と ”Write Protect” の接続が必要でした。(「ぷちFatFs」は不要)

使用したカードソケットは「ヒロセ製 DM1B-DSF-PEJ」
http://akizukidenshi.com/catalog/g/gC-01865/
「FatFs」用に下記の赤枠端子を接続しました。(CommonはPin3のVssに接続)

PCとのシリアル通信はFT232RLを使用してUSB接続しました。
(電圧は3.3Vに設定)
FatFs修正個所
ダウンロードしたサンプル回路は外部発振子を使用していますが、本検証では内蔵発振回路を使用したため下記ソースのように修正を行っています。 (内部8MHz+x4・PLL→32MHz)
pic24f.h
//#define FCY 14745600UL
#define FCY 16000000UL
――――――――――――――
main.c
・・・ 中略 ・・・・
//_CONFIG2(IESO_OFF & FNOSC_PRIPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_HS)
_CONFIG2(IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE)
・・・ 中略 ・・・・
static void IoInit (void)
{
// Clock指定追加
_DOZE = 0x00;
_RCDIV = 0x00;
・・・ 中略 ・・・・
// クロック誤差でシリアル通信のデータ化けするため速度を落とします
//uart_init(115200); /* Initialize UART driver */
uart_init(9600); /* Initialize UART driver */
・・・ 中略 ・・・・
提供されている「ぷちFatFs」と「FatFs」のサンプルを実行した場合のシリアルコマンド応答例を載せておきます。
「ぷちFatFs」実行時のターミナル画面例
Petit FatFs test monitor
>fi
rc=0 FR_OK
>fl
<DIR> DCIM
<DIR> MISC
10 TEXT1.TXT
<DIR> XYZ
<DIR> SYSTEM~1
9 TEST1.TXT
28 TEST2.TXT
7 item(s)
>di
rc=0
>dd 0 0
00000000
00000010
00000020
00000030
00000040
00000050
00000060
00000070
>fo test1.txt
rc=0 FR_OK
>fd
00000000 41 42 43 44 45 46 47 0D 0A ABCDEFG..
「FatFs」実行時のターミナル画面例
FatFs module test monitor for PIC24F
LFN Enabled, Code page: 437
>di 0
rc=0
>ds 0
Drive size: 4019200 sectors
Erase block: 256 sectors
MMC/SDC type: 2
CSD:
00000000: 00 5E 00 32 57 5A 83 D5 2D B7 FF BF 96 80 00 69 .^.2WZ ..-......i
CID:
00000000: 1D 41 44 53 44 20 20 20 10 00 00 66 A3 00 66 1F .ADSD ...f..f.
OCR:
00000000: 80 FF 80 00 ....
>dd 0 0
PD#:0, Sector:0
00000000: FA 33 C0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC .3.....|..P.P...
00000010: BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07 ................
00000020: B3 04 80 3C 80 74 0E 80 3C 00 75 1C 83 C6 10 FE ...<.t..<.u.....
00000030: CB 75 EF CD 18 8B 14 8B 4C 02 8B EE 83 C6 10 FE .u......L.......
00000040: CB 74 1A 80 3C 00 74 F4 BE 8B 06 AC 3C 00 74 0B .t..<.t.....<.t.
00000050: 56 BB 07 00 B4 0E CD 10 5E EB F0 EB FE BF 05 00 V.......^.......
00000060: BB 00 7C B8 01 02 57 CD 13 5F 73 0C 33 C0 CD 13 ..|...W.._s.3...
00000070: 4F 75 ED BE A3 06 EB D3 BE C2 06 BF FE 7D 81 3D Ou...........}.=
00000080: 55 AA 75 C7 8B F5 EA 00 7C 00 00 49 6E 76 61 6C U.u.....|..Inval
00000090: 69 64 20 70 61 72 74 69 74 69 6F 6E 20 74 61 62 id partition tab
000000A0: 6C 65 00 45 72 72 6F 72 20 6C 6F 61 64 69 6E 67 le.Error loading
000000B0: 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 operating syste
000000C0: 6D 00 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 m.Missing operat
000000D0: 69 6E 67 20 73 79 73 74 65 6D 00 00 00 00 00 00 ing system......
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................
000001C0: 37 00 06 34 F4 E4 F3 00 00 00 0D 53 3D 00 00 00 7..4.......S=...
000001D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.
>bd 0
00000000: 80 FF 80 00 44 20 20 20 10 00 00 66 A3 00 66 1F ....D ...f..f.
00000010: BF 00 06 B9 00 01 F2 A5 EA 1D 06 00 00 BE BE 07 ................
00000020: B3 04 80 3C 80 74 0E 80 3C 00 75 1C 83 C6 10 FE ...<.t..<.u.....
00000030: CB 75 EF CD 18 8B 14 8B 4C 02 8B EE 83 C6 10 FE .u......L.......
00000040: CB 74 1A 80 3C 00 74 F4 BE 8B 06 AC 3C 00 74 0B .t..<.t.....<.t.
00000050: 56 BB 07 00 B4 0E CD 10 5E EB F0 EB FE BF 05 00 V.......^.......
00000060: BB 00 7C B8 01 02 57 CD 13 5F 73 0C 33 C0 CD 13 ..|...W.._s.3...
00000070: 4F 75 ED BE A3 06 EB D3 BE C2 06 BF FE 7D 81 3D Ou...........}.=
00000080: 55 AA 75 C7 8B F5 EA 00 7C 00 00 49 6E 76 61 6C U.u.....|..Inval
00000090: 69 64 20 70 61 72 74 69 74 69 6F 6E 20 74 61 62 id partition tab
000000A0: 6C 65 00 45 72 72 6F 72 20 6C 6F 61 64 69 6E 67 le.Error loading
000000B0: 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 operating syste
000000C0: 6D 00 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 m.Missing operat
000000D0: 69 6E 67 20 73 79 73 74 65 6D 00 00 00 00 00 00 ing system......
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................
000001C0: 37 00 06 34 F4 E4 F3 00 00 00 0D 53 3D 00 00 00 7..4.......S=...
000001D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.
>fi
rc=0 FR_OK
>fl
D---- 2013/11/08 11:40 0 DCIM
D---- 2013/11/11 19:40 0 MISC
D-HS- 2014/09/27 17:07 0 System Volume Information
----A 2016/10/07 20:40 9 test1.txt
----A 2016/10/07 20:41 28 test2.txt
2 File(s), 37 bytes total
3 Dir(s), 2056388608 bytes free
>fs
FAT type = FAT16
Bytes/Cluster = 32768
Number of FATs = 2
Root DIR entries = 512
Sectors/FAT = 246
Number of clusters = 62788
Volume start (lba) = 243
FAT start (lba) = 244
DIR start (lba,clustor) = 736
Data start (lba) = 768
6 files, 781401 bytes.
4 folders.
2009216 KiB total disk space.
2008192 KiB available.
>t
3914/5/6 00:01:07
>fo 4 text1.txt
rc=0 FR_OK
>fc
rc=0 FR_OK
>fl
D---- 2013/11/08 11:40 0 DCIM
D---- 2013/11/11 19:40 0 MISC
----A 2014/04/06 00:14 0 text1.txt
D-HS- 2014/09/27 17:07 0 System Volume Information
----A 2016/10/07 20:40 9 test1.txt
----A 2016/10/07 20:41 28 test2.txt
3 File(s), 37 bytes total
3 Dir(s), 2056388608 bytes free
>fo 1 test1.txt
rc=0 FR_OK
>fd 100
00000000: 41 42 43 44 45 46 47 0D 0A ABCDEFG..
>fc
rc=0 FR_OK
>fe 0
rc=0 FR_OK
fptr = 0(0x0)
>fk XYZ
rc=0 FR_OK
>fl
D---- 2013/11/08 11:40 0 DCIM
D---- 2013/11/11 19:40 0 MISC
----A 2014/04/06 00:14 0 text1.txt
D---- 2014/04/06 00:22 0 XYZ
D-HS- 2014/09/27 17:07 0 System Volume Information
----A 2016/10/07 20:40 9 test1.txt
----A 2016/10/07 20:41 28 test2.txt
3 File(s), 37 bytes total
4 Dir(s), 2056355840 bytes free
>fo 2 text1.txt
rc=0 FR_OK
>fw 1 3
1 bytes written with 0 kB/sec.
>fw 2 33
2 bytes written with 0 kB/sec.
>fc
rc=0 FR_OK
>fo 1 text1.txt
rc=0 FR_OK
>fd 10
00000000: 03 21 21 .!!
>fo 2 text1.txt
rc=0 FR_OK
>fw 10 15
10 bytes written with 10 kB/sec.
>fc
rc=0 FR_OK
>fo 1 text1.txt
rc=0 FR_OK
>fd 50
00000000: 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F ..........
>fl
D---- 2013/11/08 11:40 0 DCIM
D---- 2013/11/11 19:40 0 MISC
----A 2014/04/06 00:46 10 text1.txt
D---- 2014/04/06 00:22 0 XYZ
D-HS- 2014/09/27 17:07 0 System Volume Information
----A 2016/10/07 20:40 9 test1.txt
----A 2016/10/07 20:41 28 test2.txt
3 File(s), 47 bytes total
4 Dir(s), 2056323072 bytes free
>fk ABC
rc=10 FR_WRITE_PROTECTED ← 「Write Protect On時」
>fk ABC ← 「Write Protect Off時」
rc=0 FR_OK
>fl
D---- 2013/11/08 11:40 0 DCIM
D---- 2013/11/11 19:40 0 MISC
----A 2014/04/06 00:46 10 text1.txt
D---- 2014/04/06 00:22 0 XYZ
D---- 2014/04/06 00:02 0 ABC
D-HS- 2014/09/27 17:07 0 System Volume Information
----A 2016/10/07 20:40 9 test1.txt
----A 2016/10/07 20:41 28 test2.txt
3 File(s), 47 bytes total
5 Dir(s), 2056290304 bytes free
ROM/RAMサイズの確認
データロガーであればファイルの新規作成、書込みができれば良いので、未使用処理やメモリバッファサイズを削ってみました。
オリジナルでのビルド

シュリンク後のビルド

CQ出版社Interface 2010年9月号に「FatFs」の記事がありました。とっかかりですが比較的わかりやすく説明されていました。
