2024/04/30(火)CH376でUSBメモリの読み書きをする。
チップ単体では秋月電子でも取り扱いがあって入手性も問題ない。
USBメモリ&SDカード ファイル管理制御IC CH376S
実験用にモジュールキットはAliexpressで入手した。
概要
- ボーレートは9600で動かせる。9600bps, 8N1
- SD制御を行わない場合、5V電源の5VIO単一の回路構成にできる。
- そのためモジュールキットのLDOを除去してバイパス、V3pinはデータシート通りで10nF接続した。
- USBシリアル側も5VIOで実験できる。秋月のType-C USBシリアルがソレ。
- D4,5,6ピンをVccに接続することで、電源投入時に9600buadとなるはず。
UART制御時の仕様
UART通信仕様として、通信キャリブレーションとして常に先頭に 0x57, 0xAB を付加してからコマンドを送信する。
送受信の表記はすべて16進数。
例1
送信:57 AB 06 01
57 AB=コマンド接頭語(固定)
06=CHECK_EXIST
01=テストバイト引数
受信:FE(テストバイトの反転バイト)
送信57 AB 06 55 → 受信AA
送信57 AB 06 AA → 受信55
例2
送信:57 AB 01
57 AB=コマンド接頭語(固定)
01=GET_IC_VER
受信=41など、バージョン番号が返る
初期化手順
- CHECK_EXIST 06 通信確認
- 送信 57 AB 06 55
- 受信 AA
- RESET_ALL 05 リセット
- 送信 57 AB 05
- 受信 (なし)
- CHECK_EXIST 06 通信確認
- 送信 57 AB 06 AA
- 受信 55
- GET_IC_VER 01 チップバージョン
- 送信 57 AB 01
- 受信 41(など)
- SET_USB_MODE 15 USBモードを設定(USBメモリ接続の場合は06)
- 送信 57 AB 15 06
- 受信 51(CMD_RET_SUCCESS)
以降、現在の状態でUSBデバイスが挿されると15,抜かれると16(USB_INT_DISCONNECT)が返る
- DISK_CONNECT 30 DISK接続
- 送信 57 AB 30
- 受信 14(USB_INT_SUCCESS)が返れば、ディスク接続完了。
- DISK_MOUNT 31 DISKマウント
- 送信 57 AB 31
- 受信 14(USB_INT_SUCCESS)が返れば、ディスクをマウント完了。
接続されたディスクの容量を確認
- DISK_CAPACITY 3E DISK容量取得
- 送信 57 AB 3E
- 受信 14(USB_INT_SUCCESS)が返れば、でディスク容量を取得完了。内部バッファにデータが格納される。
- RD_USB_DATA0 27 バッファ読み出し
- 送信 57 AB 27
- 受信 04 FF FF EF 00(など) バッファ内容が返る。
- 04(バッファデータバイト長)、00EFFFFF(ディスクセクタ数)
- →1セクタ512byte(標準)なので0x00EFFFFF * 512 = 8,053,063,168 bytesとなり8GBのUSBメモリであることがわかる。
読み込みテスト
ルートディレクトに「1234.TXT」があり、内容は「1234567890ABCDEF」であるとする。- SET_FILE_NAME 2F 操作ファイル名を設定
- 送信 57 AB 2F 2F 31 32 33 34 2E 54 58 54 00
- 2F 31 32 33 34 2E 54 58 54 00 がファイル名(ファイルパス)"/1234.TXT\0"
- 受信 (なし)
- 送信 57 AB 2F 2F 31 32 33 34 2E 54 58 54 00
- FILE_OPEN 32 ファイルオープン
- 送信 57 AB 32
- 受信 14(USB_INT_SUCCESS)が返れば成功
- BYTE_READ 3A ファイルから内部バッファへ読み込み
- 送信 57 AB 3A 08 00
- 08 00 (読み出しバイト数、0008(8byte))
- 受信 1D(USB_INT_DISK_READ)が返れば成功
- 送信 57 AB 3A 08 00
- RD_USB_DATA0 27 バッファ内容を取得
- 送信 57 AB 27
- 受信 08 31 32 33 34 35 36 37 38(など)が返る。
- 08(バッファデータ長)、31 32 33 34 35 36 37 38(バッファ内容="12345678")
- RD_USB_DATA0 27 バッファ内容を取得
- 送信 57 AB 27
- 受信 00
- 00(バッファデータ長)が返れば、それはファイル末尾まで読み出し完了し、読み込めたバイト数が0(なし)であることを示す。
- FILE_CLOSE 36 ファイルクローズ
- 送信 57 AB 36 00
- 00(ファイルサイズの自動更新をしない)
- 受信 14(USB_INT_SUCCESS)が返れば成功
- 送信 57 AB 36 00
書込みテスト
- SET_FILE_NAME 2F 操作ファイル名を設定
- 送信 57 AB 2F 2F 57 52 49 54 45 2E 54 58 54 00
- 2F 57 52 49 54 45 2E 54 58 54 00 がファイル名(ファイルパス)"/WRITE.TXT\0"
- 送信 57 AB 2F 2F 57 52 49 54 45 2E 54 58 54 00
- FILE_CREATE 34 ファイル作成/オープン
- 送信 57 AB 34
- 受信 14(USB_INT_SUCCESS)が返れば成功。
- すでに存在するファイル名の場合、その内容は削除される
- BYTE_WRITE 3C 書き込みバッファ領域確保
- 送信 57 AB 3C 05 00
- 05 00(データバイト長0005(5byte))
- 受信 1E(USB_INT_DISK_WRITE)が返れば成功
- 送信 57 AB 3C 05 00
- WR_REQ_DATA 2D 書き込みデータ送信
- 送信 57 AB 2D 31 32 33 34 00
- 31 32 33 34 00 が"1234\0"
- 受信 05(など)が返る。
- 05(書き込みできたバイト数05(5byte))
- 送信 57 AB 2D 31 32 33 34 00
- BYTE_WR_GO 3D 書き込みを完了させる(?)(Flush?)
- 送信 57 AB 3D
- 次の書き込み要求待ちにする(?) これについては詳細不明だが、このコマンドがないと実際にデータが書き込みされない。
- 送信 57 AB 3D
- FILE_CLOSE 36 ファイルクローズ
- 送信 57 AB 36 01
- 01(ファイルサイズの自動更新をする)
- 受信 14(USB_INT_SUCCESS)が返れば成功
- 送信 57 AB 36 01