RX72N Envision KitでRL78を介したシリアル通信をする

今回の内容
---
RX72N Envision KitにはRL78/G1Cというマイコンも搭載されています。
このRL78/G1CはPCからmicroUSBケーブル経由で

* 仮想COMポートとして使用
* ESP32の書き込みに使用

することができます。
Kitのマニュアル5.7章に説明があります。

RL78を介したシリアル通信を行ったことがなかったのですが、試してみるとTeratermで送受信が行えました。
USB-RS232-UART変換やUSB-UART変換なしでシリアル通信ができるのは便利です。

COMポートでのデータの送受信はたまに必要になりますが、毎度忘れていますので手順を残しておくことにしました。

PCとボードの接続
---

ボードにmictroUSBケーブルを下図の通り2本接続します。

![2020-04-22 23-02-49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/916e50f2-db34-67d8-c398-cd49e21347db.jpeg)

下のUSBコネクタはボードの電源供給兼ファーム書き換え用です。
左上のUSBコネクタが仮想COMポートの接続用です。コネクタの右に黒い四角のチップがありますが、これがRL78です。

Kitのマニュアルp19にはドライバが必要と書かれていますので、念のためインストールしました。
https://www.renesas.com/ja-jp/software/D6000699.html

デバイスマネージャーを見ると"RSK USB Serial Port"としてCOM5が割り当てられていました。このCOM番号をTeratermで使用します。
![DeviceM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/88c45dcf-457b-f559-197e-f2605185b600.png)


通信制御プログラム
---

e2studioでプログラムを書き、チップに書き込みます。
動作確認のできたソースが下記になります。

```test.c(名前は任意)
int main(void) {

	int i;
	int j;
	int rxd_scom;
	unsigned long txd_data[7], tend_data;
	unsigned long rxd_data[15], rend_data;

	//Serial Test
	SYSTEM.PRCR.WORD = 0xA503;        //PRC1,0 Write Enable
	SYSTEM.MSTPCRB.BIT.MSTPB29 = 0;   //SCI2

	SYSTEM.MOSCCR.BYTE = 0x00;
	for (i=0;i<1000;i++) {}
	do {j = (SYSTEM.OSCOVFSR.BYTE) & 0x01;
	} while(j == 0x00);

	SYSTEM.SCKCR3.WORD = 0x0200; //MOSC
	SYSTEM.SCKCR.LONG = 0x00001111; //PCKA,B,C,D 1/2 (16/2=8MHz)

	MPC.PWPR.BYTE = 0x00;             //B0WI=0
	MPC.PWPR.BYTE = 0x40;             //PFS Write Enable
	PORT1.PMR.BYTE = 0x0C;            //P12,13:peripheral
	MPC.P12PFS.BYTE = 0x0A;           //P12:RXD2
	MPC.P13PFS.BYTE = 0x0A;           //P13:TXD2

	SCI2.SCR.BYTE = 0x00;             //TE=0,RE=0
	SCI2.SMR.BYTE = 0x00;             //async,8bit,no parity,1stop,Phi/1
	SCI2.SCMR.BYTE = 0xF2;            //LSB first,no invert,no smart card I/F
	SCI2.SEMR.BYTE = 0x00;
	SCI2.BRR = 0x0c;                  //N=((8*10^6)/(64*2^(-1)*19200))-1 = 12(dec)

	for (i=0;i<1000;i++) {}           //wait

	SCI2.SSR.BYTE = 0x00;             //status clear
	SCI2.SCR.BYTE = 0x30;             //TIE=0,RIE=0,TE=1,RE=1

	for (i=0;i<5;i++) {
		txd_data[i] = 0x55;
		SCI2.TDR = txd_data[i];
		do {tend_data = (SCI2.SSR.BYTE) & 0x04;
		} while(tend_data == 0x00);
	}

	do {rend_data = SCI2.SSR.BYTE & 0x40;
	} while(rend_data == 0x00);
	rxd_scom = SCI2.RDR;

	if (rxd_scom == 0x10) {

		SCI2.TDR = 0xAA;
		do {tend_data = (SCI2.SSR.BYTE) & 0x04;
		} while(tend_data == 0x00);

		//set P40 "H"or"L"
		//PORT4.PODR.BYTE = 0x01; //P40:"H" (LED off)
		PORT4.PODR.BYTE = 0x00; //P40:"L" (LED on)
		PORT4.PDR.BYTE = 0x01;  //P40:output
	}

    while(1) {
	// TODO: add application code here
    }
return 0;
}
```

* RL78を介した仮想COMポートはSCI2の端子に割り当てられている
* P12がRXD2、P13がTXD2
* SCI2のモジュールストップビットを解除してレジスタ設定を有効化する
* 起動時のシステムクロックはLOCOが選択されており、シリアル通信をするには遅い → MOSC(水晶16MHz)を起動し、安定待ち後にシステムクロックに選択
* SCI2用の周辺クロックPCLKBはシステムクロックの2分周とする(8MHz)
* P12,P13をSCI2の端子として使えるよう設定。RXマイコンはPMRレジスタで周辺機能用端子として設定する必要あり
(これを忘れていて何時間か詰まっていました)
* SCI2を調歩同期で設定。ボーレートはBRRハードウェアマニュアルのレジスタBRRの説明にある計算式から算出する
* 設定が完了したら"55h"を5回送信する
* 送信後受信待ちにする。"10h"が受信出来たら青LEDを光らせ、"AAh"を返す

TeraTermの設定
---

TeraTermでhexのデータを表示させられるよう前準備をします。
ProgramFilesの下に置かれているTeraTermのフォルダからTeraTerm.iniを開き、下記をoffからonに変更します。

```TeraTerm.ini
; Display all characters (debug mode)
Debug=on
```
TeraTermを起動し、"設定">"端末"は下記の通り改行コードを修正、ローカルエコーは無効化します。

![Term設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/04034cec-275c-ecd0-26c6-223d871b533d.png)

続いて"設定">"シリアルポート"の"スピード"をプログラムに合わせて19200とします。

![シリアルP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/cec38101-6d9a-9f7e-054f-c24936638f21.png)

準備はここまでです。

通信動作確認
---
TeraTermを起動し、"Shift"と"ESC"を同時に2回入力します。これで送受信のデータがhex(16進)で表示されます。

e2studioでプログラムを実行すると、TeraTermの画面に"55"が5回表示されました。RX72NからRL78を介した送信動作が確認できました。
![受信OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/416df3d8-6eb8-7047-5d6f-c2294e3c138b.png)

次にマイコンの受信動作を確認します。TeraTermからの送信は下記のマクロファイルを作成し送る形式をとります。

```test10.ttl(ファイル名は任意)
send $10%54
```
この例では文字列"10"(hex)を送信します。

ファイルができたら"コントロール">"マクロ"から上記のファイルを選択します。
![マクロ開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/4559886d-80d1-6c54-da3c-2bd1e62cf477.png)

するとTeraTermからKitに文字列がシリアル通信で送信されます。
RX72Nは送信後に受信待ちの状態となっていますが、TeraTermからの送信後hexデータ"10"が正常に受信できたことを示す"AA"を送信してきました。

![送信OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624954/54d8871d-d759-af48-a003-7254e6cd0dfa.png)

ボードの青LEDも光り(最初の写真のとおり)、送受信動作が確認できました。
安定していますし、RL78/G1Cを使用した変換子ボードを沢山欲しくなりました。


補足
---
SCIのライブラリを使用せずレジスタを直で書き換えているのは特に理由はなく、開発に慣れている方はコード生成機能等を活用してサクサクとプログラム頂ければと思います。