RTC6218(RL508)をArduinoで制御　DSP　FMラジオモジュール　

#はじめに
* 電子工作の初心者としてDSPラジオに挑戦中。
* 今回はマイナーなCHIPに挑戦。データシートはあるが、作例はほとんど無く、少し苦労しました。日本国内では入手できなさそうなCHIPなので、参考にはならないと思いますが。
* 今回のCHIPは外部からクロックを供給する必要あるため、32.768kHzの水晶発振回路を利用しています。[他記事](https://qiita.com/dabodabo/items/87996b067e15a7e9b029)をご参照ください。

#Chipについて
* 今回はRTC6218(RL508)。台湾のメーカー（RichWave）のようです。この会社のHPがありますが、そこにはRTC62XXシリーズの表記はあるのですが、本CHIP（RTC6218)は表記がありませんでした。
* CHIP名なのですが、RL508という表記も見かけます。どちらの名前で検索してもデータシートは出てきます。
* ChipはAliexpressで調達。20個で750円（送料込み）。小ロットのものが見つかりませんでした。
* 他のモジュールで資料検索していた時に、本CHIPをみかけました。データシートはしっかりしていたので、挑戦してみることにしました。

#使用したもの
* RTC6218　RichWave社　Aliexpress
* AitendoさんのDIP化基板(http://www.aitendo.com/product/18107) 
* RTC6218(RL508)のデータシート　検索してください。
* パスコン　0.1μF
* Arduino Uno互換機(ELEGOO)
* 32.768kHzの[水晶発振回路](https://qiita.com/dabodabo/items/87996b067e15a7e9b029)

#DIP化
* Chipが1.27ミリ(ハーフピッチ)なのではんだ付けはそれほど難しくありません。ピン数も少ないので。パスコン(0.1μF)を空中配線しています。
* パスコン以外はそのままはんだ付けしています。本CHIPは出力コンデンサも不要で、そのままイヤフォンで聴けます。
![RTC6218_module.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/134d1d3b-9a10-4692-fa83-9fa377c1fd26.jpeg)

#配線
* 他のモジュールと同様にArduinoとつなぐだけ。電源は3.3Vを使っています。
* RCLKピンには、水晶発振回路からの出力を接続。ANTピンはアンテナです。
* 添付画像ご参照ください。
![RTC6218_kairo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/c46246ff-fec0-1e7a-432b-2b0d3c09c6d5.jpeg)

#I2C通信、Slaveアドレスについて
* ArduinoのI2C Scanner によると、Slave addressは"0X64"でした。
* I2C通信ですが、Si4702などと同様に、連続書込み/読み込みだけです。RDA5807Mの"0X10"と同様に、書き込みは02hから、読込は0Ahからとなり、レジスタの指定はできません。コード例などは[この記事](https://qiita.com/dabodabo/items/f8b52413849291a2d462)を参照願います。

#コード作成のポイント
* データシートに手順が書いてあるのですが、最初の"Initialize"が珍しい手順で、ここで苦労しました。
* 「レジスタ0に0X96AAを書き込め」と書いてあるのですが、データシートによるとレジスタ0は"DEVICE ID"で、しかもRead Onlyの設定。こんなところに書き込み？
* さらに、本CHIPは02hからしか書き込めないので、00hに書き込むには、02→03→・・→0F→00と書き込まなければならない。
* ということで半信半疑で書き込んでみると、何とこれが正解。これで無事Initializeに成功しました。
* 次にPower-Up。これは06hのCSR0_ENABLEを1、CSR0_DISABLEを0にすればよい。
* 同じく、06hでクロック周波数（32.768kHz）を設定。
* 次に音声関係を02hで設定。Mute0、Mono0、De50など。
* 最後に、周波数を設定。Band、Spaceを選択して、03hに設定。この時、TUNEビット（03h[15]）を１にする。
* これで受信に成功すると思います。

#動作コード
* 特定の周波数を書き込むシンプルなコード。連続書込みしかできないので、冗長なコードになっています。うまくWHILE文など使えば、簡明になるかも。
* 連続書込みの時、目的のレジスタに到達するまでのレジスタは0を書き込んでいます。
* レジスタに書き込むデータは、16進数、2進数、10進数が混在しています。この方がわかりやすそうだったので。

```
#include <Wire.h>

void setup() {
delay(50);
Wire.begin();
//Initialize 96AA->00h
Wire.beginTransmission(0x64); // slave address 0x64
Wire.write(0x00);      //02h 
Wire.write(0x00);      // 
Wire.write(0x00);      //03h 
Wire.write(0x00);      // 
Wire.write(0x00);      //4 
Wire.write(0x00);      // 
Wire.write(0x00);      //5 
Wire.write(0x00);      // 
Wire.write(0x00);      //6 
Wire.write(0x00);      // 
Wire.write(0x00);      //7 
Wire.write(0x00);      // 
Wire.write(0x00);      //8 
Wire.write(0x00);      // 
Wire.write(0x00);      //9 
Wire.write(0x00);      //  
Wire.write(0x00);      // A
Wire.write(0x00);      //  
Wire.write(0x00);      // B
Wire.write(0x00);      // 
Wire.write(0x00);      // C 
Wire.write(0x00);      //  
Wire.write(0x00);      // D
Wire.write(0x00);      //  
Wire.write(0x00);      // E
Wire.write(0x00);      //  
Wire.write(0x00);      // F
Wire.write(0x00);      // 
Wire.write(0x96);      // 00h  Initilize
Wire.write(0xAA);      //  
Wire.endTransmission();
delay(200);

//Power-up 06h 
Wire.beginTransmission(0x64); // slave address 0x64
Wire.write(0x00);      //2 
Wire.write(0x00);      // 
Wire.write(0x00);      //3 
Wire.write(0x00);      // 
Wire.write(0x00);      //4 
Wire.write(0x00);      // 
Wire.write(0x00);      //5 
Wire.write(0x00);      // 
Wire.write(0b10000000); //06h Enable1 Dis0
Wire.write(0b00000000); // clk32768
Wire.endTransmission();
delay(100);

//Audio, Frequency set. Tune1
Wire.beginTransmission(0x64);     // slave address 0x64
Wire.write(0b11010000); //02h Mute0 Mono0 DE50 
Wire.write(0b00000111); //  vol 0111
Wire.write(0b10010100); //03h Tune1 Band01 Space01
Wire.write(800-760);    //  80.0
//Wire.write(825-760);  //  82.5
Wire.endTransmission();
}

void loop() {
}
```
#おまけ
* 本CHIPのような初期化の方法は初めてだったので、かなり戸惑いました。データシート通りと言えばそれまでなのですが。このような初期化の方法は一般的なのでしょうか…
* 時々、本CHIPが動作しない時がありました。電源を抜き差ししたり、プログラムを2回走らせると、動作するようになります。起動方法にどこか問題があるのかもしれません。
* 電源を乾電池経由にすると、ノイズが減少しました。PCからのノイズを拾いやすいのかもしれません。