XbeeモジュールXB24CシリーズでのUARTハードフロー制御の設定について

# UARTのハードフロー制御について
UARTではハードフロー制御を取り入れることでデータを確実に伝達することができます。
詳しくは以下の記事にまとめてあるのでそちらを参考にしてください。

https://qiita.com/me26003t/items/0e0722d093a6e9221b72

本記事ではXCTUを用いたXB24Cモジュールでのハードフロー制御の設定について記述します。

::: note info
**本記事の環境**
- IDE：DIGI XCTU Version: 6.5.13 @ Windows11
- Xbeeモジュール：XB24CZ7WIT-004
:::
**↓使用したモジュール**

https://akizukidenshi.com/catalog/g/g110072/

# XB24Cでのハードウェアフロー制御
無線通信においては、電波障害による無線不通等によってMCUから無線モジュールへ渡したデータが相手通信機へ送信されないままデータを逸失する蓋然性が非常に高いため、UART通信でのハードフロー制御の採用が強く推奨されます。
今回取り上げる無線モジュールであるXB24Cではハードフロー制御付きのUARTペリフェラルをサポートしています。しかしながら、**公式の設定用ソフトであるXCTUの挙動が ~~非常にクソな上にドキュメントが壊滅的にない~~ 大変独創的な振る舞いをなさる上に貴重な資料しかないので、苦行の果に突き止めたハードフロー制御の設定についての一連の作業を投稿しました。**

# XCTUでのハードウェアフロー制御の設定 
XB24Cでのハードフロー制御の有効化には以下の２つの手順が必要です。

**1. Serial Interfacing欄の設定**
**2. I/O Setting欄の設定**

::: note warn
DIGI公式リファレンスに従って設定を進めたにもかかわらず、まったく動作しなかった。
原因は、公式リファレンスには「手順1」しか記載されておらず、実際には「手順2」も必要だった点にあった。
この「手順2」に到達するためには様々なパラメータを総当りする必要があり、その結果として解決に丸一日を費やすこととなった。
この徒労感と、そこから生じた激しい~~怒り~~衝動にかられて本記事を執筆している。
さらに、XCTU特有のもっさりとした挙動がデバッグ作業に終始フラストレーションを加え続け、"衝動"をより一層燃え上がらせる結果となった。
:::

## 1. Serial Interfacing欄の設定
Serial Interfacing内の`D6`,`D7`にて各RTS/CTSの有効化`[1]`を設定します。
両方必要がない場合は`Disable[0]`を選択すれば大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/d4131ee0-228e-4dbd-9dfa-8a09afc41eab.png)

## 2. I/O Setting欄の設定
手順１を実行した後もI/O SettingにてPR,PDにて内部プルアップ抵抗の設定する必要があります。
**適切に設定を行わないとRTSが勝手にプルアップ（High）にされ永遠に送信許可が降りないという最悪な事態を引き起こします。**

| 名前 | 概要 | 説明 |
| ------ | --- | --- |
| **PR** | プルアップ有効化 | 対応するピンのビットを１にすると、対象ピンのプルアップが有効化されます。 |
| **PD** | プル方向 | 対応するピンのビットを１にするとプルアップ、0にするとプルダウンになります。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092604/84cef681-1e2c-4bc0-a5de-7f2751d8fc8b.png)

### PR（プルアップ有効）の設定
まずは`PR`にてRTS/CTSのプルアップを無効にします。**この作業を行わないと、せっかく手順１で有効にしたRTS/CTSピンが勝手にGPIOペリフェラルの接続に上書きされ、`RTS`が常にHighを出力するために永久に送信許可が降りないという大変素敵な事態に陥ります。**
PRの内容は以下の表の通りで、今回は`接続状態インジケータ`と`RSSI出力`のみプルアップを有効にしたいので`0x0900`を入力します。

| ビット番号 | ピン名                     | 備考（機能名）        |
| ----- | ----------------------- | -------------- |
| Bit 0 | DIO4                    |                |
| Bit 1 | DIO3 / AD3              | アナログ入力兼用       |
| Bit 2 | DIO2 / AD2              |                |
| Bit 3 | DIO1 / AD1              |                |
| Bit 4 | DIO0 / AD0              |                |
| Bit 5 | DIO6 / RTS              | UART RTS（送信許可） |
| Bit 6 | DIO8 / nDTR / Sleep\_Rq | スリープ制御端子       |
| Bit 7 | DIO14 / DIN / nConfig   | データ入力          |
| Bit 8 | DIO5 / Associate        | 接続状態インジケータ     |
| Bit 9 | DIO9 / nOn\_Sleep       | スリープ出力通知       |
| Bit10 | DIO12                   |                |
| Bit11 | DIO10 / PWM0 / RSSI     | PWMまたはRSSI出力   |
| Bit12 | DIO11 / PWM1            | PWM1出力         |
| Bit13 | DIO7 / CTS              | UART CTS（受信許可） |
| Bit14 | DIO13 / DOUT            | UART TX出力      |

### PD(プル方向）の設定
次に`PD`にてRTSのプルアップ方向をプルアップに設定します。
`PR`にてプルアップを無効化したにも関わらず、XB24CのUARTのハードフローペリフェラルはオープンドレインのTTL出力な上、内部プルアップ抵抗を必要とし、更にデフォルトの設定数値はCTSのみプルダウンという~~大変クソみたいに我儘な~~大変お茶目な仕様となっていまるので設定を変更します。
とりあえず全てのピンがプルアップ方向になる`0x7FFF`を設定しました。
**この作業を行わないとXB24CのCTSが常に不定 or Lowとなり、通信相手のUARTペリフェラルが全力で受信モードで待機しようとするために通信が止まります。**

## XB24Cへの書き込み
すべての設定が終わったらWriteボタンを押して書き込みましょう。
これで設定は完了です。

# おわりに
もともとSTM32マイコンとUART通信を行うために、この作業を執り行い無事沼りました。
下の二記事はその副産物であり、激しい~~怒り~~衝動の成果物です。
STM32マイコンとXB24C間のハードフロー制御付きUART通信は無事動作したので記念に執筆しました。

https://qiita.com/me26003t/items/0e0722d093a6e9221b72

https://qiita.com/me26003t/items/5c6f21b9e6b75c2aafe6

ともかく、Xbeeのような無線モジュールの通信を確実に行うにはハードフロー制御は必要不可欠です。
この記事によって私と同じような沼に沈む犠牲者が少なくなりましたら幸いです。