Si4702をArduinoで制御　DSP　ラジオモジュール

#はじめに
* 電子工作の初心者としてDSPラジオに挑戦。
* Aitendoさんのモジュール以外にも目を向けて、AliexpressでDSPラジオICを探してみた。Si4702では何種類かモジュールが見つかるが、安価なものをチョイス。1枚100円なので3枚注文。
* Silicon Labsなので詳しい資料は入手可能。レジスタの操作が独特ですが、何とか受信できました。

#使用したもの
* Aliexpressで入手したSi4702モジュール。写真ご参照。
* IC（Si4702)のデータシート。検索してください。
* IC（Si4702)のProgramming Guide AN230。検索してください。
* Arduino Uno互換機(ELEGOO)
![Si4702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/5ce98081-8b94-e214-fc6e-baa0be7ce49c.png)

#モジュールについて
* DIP化　Aitendoさんの変換基板を使いました。
* 空中配線している抵抗とコンデンサは、DELAY回路。下で説明するRESET用に利用しているものです。

#RESET
* 本ICは、電源を入れただけでは起動せず、RESET動作を行う必要がある。RESETを行うには、電源をオンの状態のまま、RESETピンを「LOW → HIGH」とする必要がある。
* WEBで見つかる作例では、RESETピンをArduinoの適当なデジタルピンにつないで、デジタルピンを「LOW → HIGH」とするようなコードで解決しているものがあった。
* このコードも書いてみたのだが、何かと不便なのでハード的な解決方法を試してみた。
* マイコンのリセット回路と同じような簡素なDELAY回路をRESETピンにつけてみた。電源ピンから遅れてRESETピンに電圧がかかる理屈なので、RESETがかかるはず。
* 時定数はRCだから、RC = 100K * 1μ = 0.1秒　なので、RESETには十分と予想。実際にモジュールは無事起動した。

#配線
* RDA5807-M2と接続は同じ。ただし、音声出力にコンデンサが必要。電源は3.3V、5Vのどちらでも動きます。
* 1: ANT ～　10:LEFTです。 
![Si4702_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482773/356b47fc-c271-1f6b-b0b7-eb323b21d957.jpeg)

#I2C通信について
* I2C Scannerによるとアドレスは0x10です。
* さて、本ICのI2Cですが、RDA5807でも少し触れましたが、レジスタへの書き込みが、連続書込みしかできない。自動的に以下のレジスタから連続して書き込まれる（読み込まれる）。個別のレジスタを指定する必要がない（というかできない）。書込：02Hから　　読込：0AHから。
* コード例は、RDA5807の記事を参考にしてください。

#コード作成のポイント
* 本ICについては、AN230に（詳しすぎる）手順があるので、それに従えばよい。
* ICの起動（Powerup）：AN230 Table 3。 本ICを起動するには、上記のRESET後に以下の操作を行う必要がある。
    * 07h 水晶使用の設定　→　500ms以上待つ。
    * 02h DMUTE 1, ENABLE 1, DISABLE 0　→　110ms以上待つ。 
* 先に07hを操作しなければいけないが、本ICは02hからしか書き込めない。仕方ないので02hから06hまでは0を書き込むようなコードにしてみた。
* その後、再び02hに書き込む形にしたところ、無事起動した。
* 周波数のセット、VOLUMEなど：AN230 Table 15。他のモジュールと同じように、TUNEビット（03h.15）に1をセットして、周波数を書き込めばよい。
* CHANの計算は、例えば80MHZなら以下の通り。05hのSPACE、BANDも設定する。
    * SPACE 100khz, BAND 76-108Mhz　
    * CHAN = (80-76) / 0.1 = 40 (28h)
   
#動作コード
* 特定の周波数を書き込むシンプルなコード。あまりスマートなコードではないです。
* デジタルピンを使用した場合のRESET用のコードもコメントアウトして入れてあります。

```
#include <Wire.h>

void setup() {
/*
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
delay(10);
digitalWrite(13,HIGH);
delay(10);
*/  

//IC起動　
Wire.begin();
Wire.beginTransmission(0x10);  // slave address 0x10
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(0x00);      //6 
Wire.write(0x00);      // 
Wire.write(0x81);      //7 Crystal
Wire.write(0x00);      // 
Wire.endTransmission();     //

delay(500);

Wire.begin();
Wire.beginTransmission(0x10);  // slave address 0x10
Wire.write(0x42);      // DMUTE1 SEEK0
Wire.write(0x01);      // DISABLE0 ENABLE1
Wire.endTransmission();     //

delay(500);

//TUNE,周波数,VOL,de50
Wire.begin();
Wire.beginTransmission(0x10); // slave address 0x10
Wire.write(0x42);      //2 
Wire.write(0x01);      // 
Wire.write(0x80);      //3H Tune1
Wire.write(0x28);      //3L 80.0 
//Wire.write(0x16);      //3L 78.2 
//Wire.write(0x9C);      //3L 91.6 
Wire.write(0x08);      //4 de50
Wire.write(0x00);      // 
Wire.write(0x00);      //5 
Wire.write(0x5F);      // band01,space01,vol1111
Wire.endTransmission();     //
}

void loop() {
  // put your main code here, to run repeatedly:
}
```

#おまけ
* 詳細な資料がありますが、とても全部は無理で、部分的にしか読めませんでした。機能をフルに活用していない、ということなので少し残念。
* 年代的には　本IC　→　RDA5807　となっています。両方触ってみて、RDA5807は、Si4702の良いとこどりしている、という感じです。
* RESET操作が必要なICは初めてだったので戸惑いました。他のモジュールは、自動的にRESETされるものが多かったので。