#はじめに
- 電子工作の初心者としてDSPラジオに挑戦中。
- 今回はマイナーなCHIPに挑戦。データシートはあるが、作例はほとんど無く、少し苦労しました。日本国内では入手できなさそうなCHIPなので、参考にはならないと思いますが。
- 今回のCHIPは外部からクロックを供給する必要あるため、32.768kHzの水晶発振回路を利用しています。他記事をご参照ください。
#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の水晶発振回路
#DIP化
- Chipが1.27ミリ(ハーフピッチ)なのではんだ付けはそれほど難しくありません。ピン数も少ないので。パスコン(0.1μF)を空中配線しています。
- パスコン以外はそのままはんだ付けしています。本CHIPは出力コンデンサも不要で、そのままイヤフォンで聴けます。
#配線
#I2C通信、Slaveアドレスについて
- ArduinoのI2C Scanner によると、Slave addressは"0X64"でした。
- I2C通信ですが、Si4702などと同様に、連続書込み/読み込みだけです。RDA5807Mの"0X10"と同様に、書き込みは02hから、読込は0Ahからとなり、レジスタの指定はできません。コード例などはこの記事を参照願います。
#コード作成のポイント
- データシートに手順が書いてあるのですが、最初の"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])を1にする。
- これで受信に成功すると思います。
#動作コード
- 特定の周波数を書き込むシンプルなコード。連続書込みしかできないので、冗長なコードになっています。うまく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からのノイズを拾いやすいのかもしれません。