Posted at

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


はじめに


  • 電子工作の初心者としてDSPラジオに挑戦。

  • AITENDOさんで入手可能なモジュールを順番にTRY。今回はSP3777に挑戦。作例も少なく、データシートも中国語で苦戦。裏技的な資料を入手して何とか成功。


使用したもの


  • Aitendoさんのモジュール。SP3777-M(http://www.aitendo.com/product/4769)

  • IC(SP3777AHN)のデータシート。上記参照。

  • IC(DX5767)のデータシート。検索してください。

  • Arduino Uno互換機(ELEGOO)


モジュールについて


  • DIP化。この変換基板(http://www.aitendo.com/product/17501) を利用。本来の用途とは違う気もしますが、店頭でみかけたので使っています。念のため、絶縁のため中央部分にはテープを貼って使っています。



データシートについて


  • DSP3777AHNのデータシートは中国語でわかりにくい。いろいろ調べていくうちに、「DX5767」とレジスタが同じようだ、ということが判明。

  • 技術的な話も少し載っていて、主としてこのデータシートを使って、コードを書きました。


配線


  • これもモジュールの説明通りにつなぐだけ。イヤフォンに直接出力可能です。出力コンデンサも不要。

  • よく見ると、本モジュールはAR1019とピン配置が同一。代替品としての利用も想定されていたのかもしれません。



Slaveアドレス


  • 本モジュールは2つのアドレスあり。RDA5807に似ています。


    • 0x10 A mode 今回はこちらを使います。

    • 0X60 P mode TEA5767互換モード(ここでは取り扱わず)




I2C通信


  • 本モジュールの 0x10 はレジスタ連続書込/読込用に設定されていて、個別レジスタへの書き込みはサポートされていない(RDA5807と同様)。

  • このアドレスを用いると、自動的に以下のレジスタから連続して書込/読込が行われる。個別のレジスタを指定することはできない。書込:03Hから  読込:00Hから。

  • 書込コード例。このコードで03Hと04Hに書き込まれる。

Wire.beginTransmission(0X10); //slave address

Wire.write(0x44); // 03h
Wire.write(0x81); // 03l
Wire.write(0x7C); // 04h
Wire.write(0xFA); // 04l 82.5
Wire.endTransmission();


  • 読込コード例。このコードで00Hから6バイト読み込まれる。つまり、00H、01H、02Hの3つのレジスタを読み込むことになる。

Wire.beginTransmission(0X10); // slave address

Wire.requestFrom(0x10,6); //n byte read


コード作成のポイント


  • DISABLE=0 ICを起動するにはDISABLEビット(03h.15)にゼロを書き込めばよい。

  • TUNEビット0→1 他のDSPモジュールと同様に、特定周波数をレジスタに書き込む場合、以下の手順を踏む必要がある。


    • まず、TUNEビット(03h.9)をゼロにする。

    • 次に、特定周波数、VOLUME、BNADなどをセット

    • 最後にTUNEビットを1にする。



  • CHANの計算 とにかく50Khzを使って計算する。80Mhzを選ぶなら、CHANは200になる。


動作コード


  • 上記のポイントを考慮して作成した、特定の周波数を書き込むシンプルなコード。3つのレジスタだけ操作すればよく、後はDefaultのままでOK。

  • 03h → 04h → 05h → 03h と書き込めばよいので、連続書込みでも特に難しくはなかった。

  • 今回は、0bxxxxyyyyの形で表記してみた。この方がわかりやすいかも。

#include <Wire.h>

void setup()
{
delay(1000);

Wire.begin();

Wire.beginTransmission(0X10); //slave address
// write starts from 03H
Wire.write(0b01000100); // 03h TUNE 0
Wire.write(0b10000001); // 03l
Wire.write(0b01111100); // 04h
Wire.write(0b11001000); // 04l 80Mhz
//Wire.write(0b11111010); // 04l 82.5
Wire.write(0b10011001); // 05h
Wire.write(0b11000000); // 05l
Wire.endTransmission();

Wire.beginTransmission(0X10); //slave address
Wire.write(0b01000110); // 03h TUNE 1
Wire.write(0b10000001); // 03l
Wire.endTransmission();
}

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


おまけ


  • 本ICは台湾製と説明があるが、データシートにはメーカーの表記が見当たらず。中国語のデータシートは何となく意味はわかった。

  • TEA5767との互換モードもあるらしいので、互換品としてのニーズを狙った製品なのかも。