2014年7月25日金曜日

SDカード対応

DO夢で32GBのSDカードを購入。
2,000円以下で32GBが買えるとは、良い時代になった。。

MRAMが64KB×2なので、より大容量のデータが扱えるようにSDカード対応を考える。
使ったのは秋月のSDカードスロットDIP化モジュール
10kΩのプルアップ抵抗と3.3Vレギュレータが付いているので便利

電源はMRAMを使うときに用意した3.3Vをそのまま使うことにする。
AVRの近くにソケットを用意して、SDカードスロットDIP化モジュールを接続できるようにしておく

SDカードの読み書きは、ぷちFatFsを使わせてもらう
ディレクトリの操作(_USE_DIR)と、ファイル書き込み(_USE_WRITE)を有効にしたので、バイナリサイズが大きくなってしまった。。

SDカードのファイル内容をMRAMに保存したり、MRAMのデータをSDカードに書き込めるようにする。
ATmega1284のSRAMは16KBあるので、4KBをバッファエリアとしてSDカードの読み書きを高速化する。
バッファ領域はスロット7に割り当て(OUT &H1B, 7)、PASOPIA側からコマンドを入力できるようにする。

コマンドは、以下の4種類を用意
sv [slot] [file name] : MRAMのメモリ内容をSDカードのファイルへセーブ
 [slot] : コピー元
  5 : RAMPAC1: SLOT4: デフォルト装置番号5
  6 : RAMPAC2: SLOT3: デフォルト装置番号6
  7 : BUFFER: SLOT7
 [file name] : SDカードコピー先ファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : セーブが成功した場合
  (エラー文字列) : エラーが発生した場合
ld [slot] [file name] : SDカードのファイルをMRAMへロード
 [slot] : コピー先
  5 : RAMPAC1: SLOT4: デフォルト装置番号5
  6 : RAMPAC2: SLOT3: デフォルト装置番号6
  7 : BUFFER: SLOT7
 [file name] : SDカードコピー元ファイル名
  "/"から始まった場合、絶対パス
 [戻り値]
  Ok : ロードが成功した場合
  (エラー文字列) : エラーが発生した場合
ls [path] : フォルダとファイルのリストを表示
 [path] : 読込元のSDカードのパスとファイル名
 [戻り値]
  (ファイル名 or フォルダ名)の一覧 : フォルダの場合は名称の最後に"/"が付く
  (エラー文字列) : エラーが発生した場合
cd [path] : カレントディレクトリの変更
 [path] : パス名 [戻り値]
 [戻り値]
  (フォルダ名) : カレントフォルダ
  (エラー文字列) : エラーが発生した場合
SDカードの処理が終わったら、バッファ領域に[戻り値]が書き込まれる。

バッファへのコマンド入出力をBASICのINPUT命令で組んでみた。
100 INPUT A$
110 B$=LEFT$(A$,1)
120 IF B$="e" OR B$="E" THEN OUT &H1B,4:END
130 OUT &H1B,7:OUT &H19,0
140 FOR I=0 TO &HFF
150   OUT &H18,I
160   B$=MID$(A$,I+1,1)
170   IF B$="" GOTO 200
180   OUT &H1A,ASC(B$)
190 NEXT I
200 OUT &H1A,0:OUT &H18,0:OUT &H1B,15
210 C=INP(&H1A):IF C>=254 GOTO 210
220 FOR I=1 TO &HFF
230   OUT &H18,I:D=INP(&H1A)
240   IF C=0 AND D=0 GOTO 280
250   IF C=0 THEN PRINT CHR$(13);CHR$(10); ELSE PRINT CHR$(C);
260   C=D
270 NEXT I
280 PRINT"":GOTO 100

こんな感じで、SDカードのファイルからMRAMにデータを読み込む

MRAMは64KB単位で読み書きするようにしたため、SDカードには65,536 bytesのファイルを置いておく必要がある。(スロット7の場合は、4,096 bytes)
セーブ命令も、既にあるファイルに上書きする。

これで、以前エミュレータで作成したRAM PACイメージを、MRAMに保存できるようになった。

0 件のコメント:

コメントを投稿