1 概要
今回は1-Wireと言うことで CH32V203系では I2C の様なインターフェースが無いので、GPIOの内1個を1-Wireのマスター端子として使用します。
なお 1-Wire に接続するスレーブは DS18B20 と言う温度素子です。
プログラムで制御するものはGPIOとTIMEを使用しますので、先にそのテスト記事を確認ください。
プログラムの作り方はについては 1-Wire プロトコル、やDS18B20を確認すればわかります。
ページ右側に 1-Wire 関係以下にリンク先が有るので確認ください。
なお 1-Wire に接続するスレーブは DS18B20 と言う温度素子です。
プログラムで制御するものはGPIOとTIMEを使用しますので、先にそのテスト記事を確認ください。
プログラムの作り方はについては 1-Wire プロトコル、やDS18B20を確認すればわかります。
ページ右側に 1-Wire 関係以下にリンク先が有るので確認ください。
1.1 プログラム概要
作成したプログラム
1-Wireプロトコルで言う、
(1)初期化 RESET AND PRESENCE PULSES部
(2)コマンド送信 Write Time Slot
(3)データ受信 Read Time Slot
の部分を作成する。
ボタンを押すことにより 1-Wire の動作確認プログラムが動作するようにする。
データを受信したものをUSARTで送信する。
(1)初期化 RESET AND PRESENCE PULSES部
(2)コマンド送信 Write Time Slot
(3)データ受信 Read Time Slot
の部分を作成する。
ボタンを押すことにより 1-Wire の動作確認プログラムが動作するようにする。
データを受信したものをUSARTで送信する。
1.2 MPUと接続Pin
| 端子 | 接続相手 | 備考 |
|---|---|---|
| PB1 | DQ | 1-WireのBus |
| PB3 | PBSW | スイッチはGNDに接続 |
| PA9 (TX) | RX | PC側のシリアル RXに接続 |
2 プログラム
2.1 プログラム内容
2.2 補足説明
2.2.1 作成関数リスト
| No | 名前 | 備 考 |
|---|---|---|
| (1) | void GPIO_INIT (void) | GPIOの初期化 |
| (2) | void Timer_Init(void) | TIMEの初期化 |
| (3) | void Wire_out(void) | GPIOの1-Wire端子を出力に切り替え |
| (4) | void Wire_in(void) | GPIOの1-Wire端子を入力に切り替え |
| (5) | uint8_t Reset_Presence(void) | 1-Wire の初期化 |
| (6) | uint8_t Reset_WriteTimeSlot(uint8_t txdarr[], uint8_t size) | (3)(4)(5)を含めたデータ書き込み |
| (7) | uint8_t crc8_byte (uint8_t crc, uint8_t data) | 1Byte分のCRC |
| (8) | uint8_t crc8_calculate (uint8_t *data, int len) | (7)を含めた複数ByteのCRC |
| (9) | uint8_t *ReadTimeSlot(int RxDArrSize) | (3)(4)(8)を含んだデータ受信 |
2.2.2 メイン補足
プログラムはそのまま実行すると、1個のDS18B20を接続した場合の温度を取得します。
①の部分は書き込みだけのプログラム
使用しないのであれば、①の部分のコメントアウトを外しプログラムをコメントアウトする
使用するとすれば、下記の内容で、結果も確認するため、⑪部も使用して必要な設定をする。
//WRITE SCRATCHPAD {0xcc,0x4e,0x4B,0x46,0x7F}または{0xcc,0x4e,0x4B,0x46,0x5F}
//CONVERT T {0xcc,0x44}
//COPY SCRATCHPAD {0xcc,0x48}
//RECALL E2 {0xcc,0xB8}
で実験する{ }部分を②にコピーする
②の変数にコマンドや64bitROMコードなどを入れる
③タイマー値については必要な時間に変更すること
⑪の部分は書き込みおよび読み込みのプログラム
使用しないのであれば、⑪の部分のコメントアウトを外してプログラムをコメントアウトする
使用するとすれば、下記の内容で、結果も確認するため、①部も使用して必要な設定をする。
//READ ROM {0x33} RxDArrSize = 8;
//READ SCRATCHPAD {0xcc,0xbe} RxDArrSize = 9;
で実験する{ }部分を⑫、サイズ部分の値を⑬にコピーする
⑫の変数にコマンドや64bitROMコードなどを入れる
⑬の変数には読み込みバイト数を入れる。
①の部分は書き込みだけのプログラム
使用しないのであれば、①の部分のコメントアウトを外しプログラムをコメントアウトする
使用するとすれば、下記の内容で、結果も確認するため、⑪部も使用して必要な設定をする。
//WRITE SCRATCHPAD {0xcc,0x4e,0x4B,0x46,0x7F}または{0xcc,0x4e,0x4B,0x46,0x5F}
//CONVERT T {0xcc,0x44}
//COPY SCRATCHPAD {0xcc,0x48}
//RECALL E2 {0xcc,0xB8}
で実験する{ }部分を②にコピーする
②の変数にコマンドや64bitROMコードなどを入れる
③タイマー値については必要な時間に変更すること
⑪の部分は書き込みおよび読み込みのプログラム
使用しないのであれば、⑪の部分のコメントアウトを外してプログラムをコメントアウトする
使用するとすれば、下記の内容で、結果も確認するため、①部も使用して必要な設定をする。
//READ ROM {0x33} RxDArrSize = 8;
//READ SCRATCHPAD {0xcc,0xbe} RxDArrSize = 9;
で実験する{ }部分を⑫、サイズ部分の値を⑬にコピーする
⑫の変数にコマンドや64bitROMコードなどを入れる
⑬の変数には読み込みバイト数を入れる。
2.3 動作確認

実験状況
2.3.1 準備
温度の測定を実施する。
なお温度分解能は11bitで先に設定している。
①は使用
②はCONVERT T なので {0xcc,0x44} を代入する。
③は分解能が11bitなので 380(ms)を代入する。
⑪は使用
⑫READ SCRATCHPAD なので {0xcc,0xbe} を代入する。
⑬は READ SCRATCHPAD なので 9 を代入する。
①は使用
②はCONVERT T なので {0xcc,0x44} を代入する。
③は分解能が11bitなので 380(ms)を代入する。
⑪は使用
⑫READ SCRATCHPAD なので {0xcc,0xbe} を代入する。
⑬は READ SCRATCHPAD なので 9 を代入する。
2.3.2 確認データ
UART通信データ GTKTermにより受信

温度は0x13E なので 19.875℃
printfをコメントアウトした
温度測定受信

温度は0x168 なので 22.5℃

温度は0x13E なので 19.875℃
printfをコメントアウトした
温度測定受信

温度は0x168 なので 22.5℃
温度測定指示〜400(ms)〜温度測定結果受信

温度測定指示部の拡大(信号部 約4ms)
温度測定結果受信部の拡大(信号部 約9ms)
printfをコメントアウトした
温度測定結果受信部の拡大(信号部 約7ms)


温度測定指示部の拡大(信号部 約4ms)

温度測定結果受信部の拡大(信号部 約9ms)

printfをコメントアウトした
温度測定結果受信部の拡大(信号部 約7ms)

