はじめに
- 電子工作の初心者として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との互換モードもあるらしいので、互換品としてのニーズを狙った製品なのかも。