fvIOサンプルプログラムの実行手順(開発環境のインストール～実行まで)

fvIO(functions-virtualized Input/OutPut)と呼ばれる、いろんなセンサを高帯域で同期制御できる技術が利用できるようになったので、とりあえず開発環境の構築からサンプルプログラム動作までの手順をメモっときます。

## 1.用意するモノ

#### ターゲットボード
以下のボードを組み合わせたスタックボードを使用。
- [SEMB1401](http://www.shimafuji.co.jp/products/941)(IoT-Engine RZ/T1)
- SEMB1311(IoT-Engine RZ/T1ベースボード)
- SEMB1311-1(Grove拡張ボード)

#### センサ
- [Grove - OLED Display 0.96 inch](http://wiki.seeedstudio.com/Grove-OLED_Display_0.96inch/)(有機ELディスプレイ)
- [Grove - 3 Axis Digital Accelerometer(±16g)](http://wiki.seeedstudio.com/Grove-3-Axis_Digital_Accelerometer-16g/)(3軸加速度センサ)

#### デバッグツール
- [J-Link LITE ARM](https://www.embitek.co.jp/product/jlink-lite.html)(デバッガ)

#### 開発環境（アカウント登録が必要）
- [e2studio ver.7.1.0](https://www.renesas.com/jp/ja/products/software-tools/tools/ide/e2studio.html)(統合開発環境)
- [KPIT GNUARM-NONE v16.01](https://gcc-renesas.com/ja/rz/rz-download-toolchains/)(ARMツールチェーン）


#### サンプルプログラム
- [fvio_rzt1_i2c_cmn](https://github.com/shimafuji-fvio/fvio_rzt1_i2c_cmn)(RZ/T1専用fvIO I2C汎用プラグイン)
- [an-r01an2554jj0141-rzt1-initial-settings.zip](https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rz/rzt/rzt1.html#sampleCodes)(RZ/T1初期設定サンプル)
- [an-r01an3569jj0200-rzt1-encoder.zip](https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rz/rzt/rzt1.html#sampleCode)(RZ/T1 Encoder I/Fライブラリ)

## 2.開発環境のインストール
手間が増えるので、先にARMツールチェーンからインストールしときます。

#### ARMツールチェーンのインストール
[gcc-renesas.com](https://gcc-renesas.com/ja/rz/rz-download-toolchains/)から取得したインストーラを実行し、「Default」設定でインストール。

![gnu_inst1.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/e56f5ba6-3c5a-62bf-667c-8f5c4771be47.jpeg)

#### e2studioのインストール
[ルネサスエレクトロ二クスのHP](https://www.renesas.com/jp/ja/products/software-tools/tools/ide/e2studio.html)から取得したインストーラを使う。
このとき、以下のように「デバイス・ファミリー」の設定でRZデバイスサポートにチェックを入れて、
![e2_inst3.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/2af6ebcc-2043-7ef7-f469-f2f69dad0d10.jpeg)

e2studioを日本語で使えるように「追加コンポーネント」で日本語言語パックにチェックを入れます。他はデフォルト設定でOK。

![e2_inst4.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/1b206320-8a44-8c46-f5d1-330352b3b2f1.jpeg)

インストール後、初めてe2studioを起動する時にツールチェーン登録画面が出るので登録する。（ツールチェーンの登録はARMツールチェーンをインストールした後でしかできないので注意）

![e2_inst11.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/fd62b844-6503-246c-3ff2-7c198f9a4b52.jpeg)

## 3.サンプルプログラムのマージ
各サンプルプログラムを解凍し、「an-r01an2554jj0141-rzt1-initial-settings」をベースにして以下のようにファイルを追加する。（「RZ_T_ram_sample」も同様）

★:fvio_rzt1_i2c_cmnから取得
◎:an-r01an3569jj0200-rzt1-encoderから取得

RZ_T_sflash_sample/
　　　　┣inc/
　　　　┃  ┗◎r_ecl_rzt1_if.h
　　　　┃
　　　　┣★lib/
　　　　┃  ┗ ★ecl/
　　　　┃  　  ┣ ◎r_ecl_rzt1.a
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_0.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_1.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_2.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_3.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_4.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_5.dat
　　　　┃  　  ┣ ★s_fvIO_rzt1_comn_i2c_6.dat
　　　　┃  　  ┗ ★s_fvIO_rzt1_comn_i2c_7.dat
　　　　┗src/
　　　　　 ┣★fvio/
　　　　　 ┃   ┣ ★dev_driver/
　　　　　 ┃   ┃          ┣ ★adxl345/
　　　　　 ┃   ┃          ┃　　　　┣★fvIO_rzt1_i2c_adxl345.c
　　　　　 ┃   ┃          ┃　　　　┗★fvIO_rzt1_i2c_adxl345.h
　　　　　 ┃   ┃          ┗ ★ssd1306/
　　　　　 ┃   ┃          　　　　 ┣★fvIO_rzt1_i2c_ssd1306.c
　　　　　 ┃   ┃          　　　　 ┗★fvIO_rzt1_i2c_ssd1306!
　　　　　 ┃   ┣ ★fvio_driver/
　　　　　 ┃   ┃          ┣ ★fvIO_cmn_if.h
　　　　　 ┃   ┃          ┣ ★fvIO_rzt1_dma.c
　　　　　 ┃   ┃          ┣ ★fvIO_rzt1_dma.h
　　　　　 ┃   ┃          ┣ ★fvIO_rzt1_i2c_cmn.c
　　　　　 ┃   ┃          ┣ ★fvIO_rzt1_i2c_cmn.h
　　　　　 ┃   ┃          ┗ ★fvIO_dat.asm
　　　　　 ┃   ┃
　　　　　 ┃   ┗ ★fvio_if/
　　　　　 ┃              ┣ ★fvIO_if.c
　　　　　 ┃              ┗ ★fvIO_if.h
　　　　　 ┃
　　　　　 ┗sample/
　　　　　  　 ┗ ★main.c


## 4.サンプルプログラムの修正
src/common/sflash_boot/spibsc_ioset_userdef.cを以下のように修正する。
（「RZ_T_ram_sample」の場合は不要）

修正前:

~~~
#define SPIBSC_BUS_WITDH    (4)
#define SPIBSC_OUTPUT_ADDR  (SPIBSC_OUTPUT_ADDR_32)
~~~

修正後:

~~~
#define SPIBSC_BUS_WITDH    (1)
#define SPIBSC_OUTPUT_ADDR  (SPIBSC_OUTPUT_ADDR_24)
~~~


## ビルド
サンプルプログラムのマージ後、e2studioを開きプロジェクトのプロパティを以下のように修正してからビルドを実行する。

（１）Target Processor<br>
![set_target.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/8781d385-0145-915f-082a-2a6f6d2234ed.jpeg)


（２）Cross ARM C Compiler/Includes<br>
![add_include.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/f526eaa0-10b4-a90a-e90b-8bc085c2b455.jpeg)


（３）Cross ARM C Linker/Other<br>
![add_lib.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/4364c7dc-97bd-3854-f59a-ed97a4a4f49a.jpeg)

## 5.サンプルプログラムの書き込み
ターゲットボードとデバッガを以下のように接続し、e2studioのデバッグボタンから書き込みを実行。
![cnct_diag.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/da68ce21-a3c2-2a34-8a8e-f0559ddd72a9.jpeg)


書き込み後、[デバッグ]パースペクティブで命令ポインタがmainの中で停止していれば書き込み成功。
![write_ok.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/adc9e474-c955-3f3c-16a2-06e1c480436f.jpeg)

このとき、以下のような画面が表示されたら、再度書き込みを行う。
![write_ng.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/b8a24522-1416-e848-a115-d68bef700b14.jpeg)

## 6.サンプルプログラム実行
スタックボードのスロット0に加速度センサ、スロット1にディスプレイを接続して電源を入れると、
![sensor_cnct_diag.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/c30af9f4-b1df-e4ac-3143-c994f1e4f528.jpeg)

加速度センサのX軸の情報がディスプレイに出力されます。

![sample_run.jpg](https://qiita-image-store.s3.amazonaws.com/0/377302/572fc176-0a76-f4e4-c877-8ace38024b5e.jpeg)

このサンプルプログラムで、加速度センサとは約1.67[MHz]、ディスプレイとは約0.71[MHz]まで通信できました。
サンプリングレートに換算すると、加速度センサは16796[サンプル/s]、ディスプレイは51[フレーム/s]という驚異的なレートになります。


動作の様子は下記のyoutubeで。
(動画では、加速度センサは1933[サンプル/s]、ディスプレイは17[フレーム/s]で動いてます)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">fvIOサンプル動画（加速度センサ、OLEDディスプレイ） <a href="https://t.co/4LnowuEEjL">https://t.co/4LnowuEEjL</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; fvIO.smfj (@fvIO19) <a href="https://twitter.com/fvIO19/status/1106911098798665728?ref_src=twsrc%5Etfw">2019年3月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>