諸々、自分メモということで控えを。
MPLAB Harmony な USB ホストプログラム
- 自動生成されるソースファイルが app.c
- APP_Initialize に初期化を行う命令を記述
- APP_Tasks にメインループ内で実行を行いたい命令を記述
- appData.state の値ごとで条件分岐を行う部分は自動生成
- 状態は以下
- APP_STATE_INIT
- APP_STATE_WAIT_FOR_CONFIGURATION
- APP_STATE_SCHEDULE_READ
- APP_STATE_SCHEDULE_WRITE
- APP_STATE_WAIT_FOR_WRITE_COMPLETE
- APP_STATE_ERROR
APP_STATE_SCHEDULE_READ
- この状態で appData.isReadScheduled が真なら USB_DEVICE_CDC_Read を呼び出す
- この手続きは読み込みが完了したら appData.isReadComplete を真にする(はず)
- 読み込み完了したなら readBuffer よりデータの読み込みが可能になる
- このタイミングで内部バッファにデータをコピィする
- isReadScheduled は真に、state は APP_STATE_SCHEDULE_READ に設定する必要あり(リセット
- シリアルへの書き込みが可能なデータがあるかをチェック
- 存在する場合は appData.state を APP_STATE_SCHEDULE_WRITE にする
APP_STATE_SCHEDULE_WRITE
- 内部バッファからデータを取得し、USB_DEVICE_CDC_WRITE 手続き呼びだし
- appData.state は APP_STATE_WAIT_FOR_WRITE_COMPLETE に appData.isWriteComplete は偽に
APP_STATE_WAIT_FOR_WRITE_COMPLETE
- appData.isWriteComplete が真になったなら、appData.state を APP_STATE_SCHEDULE_READ に
FIFO によるバッファリング
-
リングバッファによる FIFO バッファの実装
-
送信用、受信用を用意
-
属性としては以下を保持
-
データ件数
-
読み込み用のインデクス
-
書き込み用のインデクス
-
バッファ
-
手続き
-
カウンタ件数により読みあるいは書きが可能かどうかが確認できる
-
FIFO から読み込み : 読み込みインデクスがバッファサイズを越えたらインデクスの値をリセットする必要がある (リングバッファのアレです
-
FIFO に書き込み : こちらもインデクスの設定処理が必要
-
処理の方針としては以下?
-
フロント側(?) のシリアルな i/f 層 : TxFIFO にデータがあれば読み込んでシリアルに出力
-
データ受信なイベントにて RxFIFO に出力
-
その次の層
-
RxFIFO にデータがあれば取り出して処理
-
必要なデータを TxFIFO に送信
-
FIFO を連結させる、というパターンもあります
状態遷移をつかったフレームの処理について
-
Start of Handler という制御文字で開始され、End of Transmission という制御文字で終端するフレーム
-
制御文字をエスケープするための Data link escape という制御文字
-
開始から終了までのデータの並びでかつ、そのセットが非同期で入力される場合の処理の方法
-
状態を内部で保持してデータ列を一文字づつ順に処理します
-
状態としては以下
-
アイドル状態(開始、な制御文字はまだ読み込んでいない)
-
処理中の状態 (終了、な制御文字がきたら終端、エスケープが入力される可能性もある
-
エスケープされた状態
アイドル状態
- SOH を読み込んだら処理中の状態に移行する必要があります
処理中の状態 (終了、な制御文字がきたら終端、エスケープが入力される可能性もある
- EOT を読み込んだらアイドル状態に移行
- フレームを何らかの形で処理する必要がある
- DLE であればエスケープされた状態に移行(その文字自体を処理する必要はありません
- そのどちらでもなければフレーム内のデータとして処理します
エスケープされた状態
- エスケープされた文字を処理する必要がある
- 処理中の状態に移行する必要があります