工作してみた(みる)
Si4700 FMラジオの試作
まえおき
というわけで(なにが、「というわけで」なのかは、)、作成日記。ラジヲが欲しいのです[1]。
さて、Si4700は2005年発表の製品で[2]廃番のためか、ソフト制御関係のデータシートは、購入したDigikeyサイトにも、本家のシリコンラボのサイトにも、もはやみあたりません。
ロシアの某サイトから入手したシートにはConfidential
の斜め文字が入っていて、アマチュアといえども品行方正
を旨にしているわたくしとしては文句をいわれると嫌なので
、このまま工作に入るワケにいかず、さらに電脳網をごにょごにょしていると後継のSi4702/3シリーズ仕様書が品行方正風に入手出来、またSi4700を使ったMP3 Music Player、RAMPというTimpy風工作の頁がbascom-avrgoogle
のソースを提供しているので、これでなんとか大丈夫だろう、と。
Si4700のFeatures
カバー周波数は76-108MHzとひろく、2.7-5.5Vで動作します。ただ、ロジック信号基準になるInterface Supply Volatge端子への供給電圧は1.5-3.6Vが推奨値となってますので注意が必要です。
2線と3線でソフトウエア制御。Seek Tuning対応、Volumeコントロールあり。
外形は写真にあるように4mmX4mm、QFN。ピン配置(TopView)は右の画像のごとし。
ピン覚え
- GND--1,5,6,14,17,24,GNDPAD,3(RFGND)
- FMIP--2=あんてな
- FMIN--4--RFGND(3ピン)に接続するべきと書いてある
- RST--7=リセット(active low)
- SEN--8=シリアル利用可能入力(active low)
- SCLK---9=シリアルクロック
- SDIO--10 = data I/O
- 外部クロック(32.768Khz)入力---11
- VIO---Interface Supply Voltage--12
- VD(DVCC)--13
- 右出力--15,左--16
- VA(AVCC)--18
- GPIO1,2,3--19,20,21ピン()
- NC--22,23
裏返しView
裏返してハンダ付けするので、そっち側からの覚え図。
外部クロック
外部クロックの32786Hzが必要。4702以降は内部発振回路がついていてXTALをつけるだけで済むみたいなんですが 。
今回はお手軽にいつか電気時計を作るんだ と夢見た時に、秋月から買っておいたRTC-8564NRdatasheet 「リアルタイムクロックモジュール」で得ることにします。
8pinがVCC,4pinがGND。2pinから信号が出ます。I2C制御で、32768Hz,1024Hz,32Hz,1Hzを選択可能ですが制御なしでデフォルトの32768が確保出来るのが嬉しいところ。
challenge a 半田付け
おせんさんgoogle がやれば半田漬けだが、普通の人がやれば半田付け、などとおもしろくもなんともない冗談はやめて、ともかく、やってみる。
これまた秋月で買っておいた4x4穴のキットカットgoogle 基板(っていうのかどうかしらないけど、割れ目が入っててぱきぱき折って使うので、ぼくはそう呼んでいる) を2枚使う。線材は、30AWGのラッピングワイヤと、ビニール線を剥いて取った極細銅線。GNDパッドあたりの配線とか狭いところのランドは後者。二枚のキットカット板は、8ピンのピンヘッダX2で固定する。
出来た!....がでも、なんかこれ、あまりに不格好。ブレッドボードに取り外しする時に、真ん中からキットカット! しそうでもあるので、やりなおし することにしました。
これもまた秋月で買っておいた8x8穴の1.27ピッチのキットカット基板を一枚使ってみる。このピッチ幅なら、一応奇麗?に配線が可能。
配線したあと、これまたつかうあてなく買ったままになっていたmade in Thailandの28 ssop変換基板の裏側に、そいつを菱形に寝転ばせ必要なピンのリードだけを両側の穴にハンダ付けする。
最初の基板より大きくなったけど見かけはマシで頑丈っぽいのでこれで許してやろうとおもう。以上、やりなおしも含め、この半田にかかった時間は3時間になんなんとする。眼ヤニガタマリマシタ
ブレッドボードで配線
インターフェース電源と呼称されているVio(ロジックの基準電源ですね)は3.6V以下であるべしという規格になっているのがちょっと面倒。この電圧を基準として、HighはVio+0.3Vが最高値。当然5V標準のArduinoピン出力は使えない(実はアマチュア的には 使えると思うけど、壊すとやだから)。
とはいえコレハモハヤArduino利用の定番問題。SparkFunのLogic Level Converter[3]基板を差しこんで、2-wireに対応。[4]。おすすめ。
Arduinoのスケッチを書く
wire.hライブラリ利用上の注意
2-wire制御用にArduinoのwire.hライブラリを使う。こういうのがあるからArduinoは便利だと思う。
Si4700のdevice addressは、0010000b。でREAD がb=1,WRITEがb=0。
このREAD/WRITEビットはwire.hが付加するので、wire.hを使う場合のデバイスアドレス値は右シフトした値(0x20>>1とか)か、最初からシフトした値(0x10)にしておく必要ある[5]。はじめて使った時、それを知らずに嵌まったので、復讐
復習の意味で記しておくのだ。ちなみにwire.hが使っているtwi.cを見ると
wire.hが利用するtwi.cのアドレス設定関数
void twi_setAddress(uint8_t address)
{
// set twi slave address (skip over TWGCE bit)
TWAR = address << 1;
}となっているのである。
なお、Arduino+wire.hを使う場合、2線制御用ピンはmega8/168/328のPC4=SDA,PC5=SCLにハードコーディングされている。変更不可。これはArduino Analogピンの4と5にあたる。
Si4700の2線制御条件
さて、Si4700を2線で制御するためには、つぎの条件を満たしておく必要がある。(1)SEN(8pin)がHIGHで、(2)GPIO3がhigh-Zgoogle か未接続(float)。さらに(3)RSTピンは、立ち上がり前にはHIGHになっていること。さらにさらに(4)外部クロックはすでに入力されていること。
Si4700の2線制御では、設定用レジスタ番地を任意に指定できない。(1)WRITEの場合、スタート番地は02hで(2)READの場合スタート番地は0Ahで、それぞれ8ビット*2のデータの送受信で番地カウンタが自動増加する。
READ/WRITEとも、00h番地に到達すると内部カウンターは0に戻る(ラップアラウンドgoogle )。また、STOP が送信されるとカウンターはリセットされる。
と延々と書いてるのは、最初、レジスタ指定してデータ*2を繰り返すと思ってて嵌まったからである
。データシートはちゃんと読みましょう。
最小限のスケッチ
最低限受信出来るようにするためには02hから05hまでのレジスタを設定すればいいみたい。それが下のスケッチ。
---
/*
*Si4700 2wire
*/
#include <Wire.h>;
int RST = 7;
int slaveAddress = 0x20 >> 1;
void i2c_data_write(int data){
Wire.send(data >> 8);
Wire.send(data >> 0x00FF);
}
void setup()
{
pinMode(RST,OUTPUT);
delay(20);
digitalWrite(RST,LOW);
delay(120);
digitalWrite(RST,HIGH);
delay(120);
Wire.begin();
Wire.beginTransmission(slaveAddress);
i2c_data_write(0x4001);//02h
i2c_data_write(0x8071);//03h 87.3MHzの場合
i2c_data_write(0x4800);//04h
i2c_data_write(0x5F);//05h
Wire.endTransmission();
}
void loop()
{
}
きこえた 。うれしい。あと、SparkFunのAR1000より、カナリ感度がいい(と思う)。
レジスタ覚え
SEEKを試す
一応レジスタの動きをメモしたので、次にSEEKモードを試してみる。だいたい次のような動作をする。
- TUNEビットがセットされると、チューニング動作が開始する。
- チューニングが終わると、STCビットがセットされ、RSSIビットを読み込むことが出来る
- STCビットが1にセットされると、TUNEビットは0である必要がある。
- SEEKチューニングはRSSIが、SEEKTHビット閾値以上っであるチャンネルを探すことである。
- なおSKSNRとSKCNTはそれにかかわる
- SEEKモードには2つのパターンがある。
- SKMODE=0。この場合は、SF/BLが1の場合は、再度行う
- SKMODE=1。この場合はバンドリミットまで行って、SF/BLが1になる。
というわけで、とりあえず02hのSEEK(ビット8)を1にして、SEEKUP(ビット9)を上=1にして、76Mhzからはじめるスケッチを書いてみる。
(ねむくなってきたので中断。おやすみなさい..
さてaction 再開..
まず、TUNEとSEEKの開始/終了と、再開条件をみると、STCビットが大切なのがわかる。さらにSEEKではSF/BLの状態も大切。またAFCRLというビットが1だと実はSEEKに失敗しているのでこれも大切。
というわけで、まずは、SEEKして、0Ahをreadして、STCが1になっているのを観察して、AFCRLが1ないしはSF/BLが1の場合はSEEKをリセットして、その地点からSEEKを再開。STC=1,SFCRL=0,SF/BL=0の場合にとりあえず終了、というスケッチを書いてみる。
....それから30分後 .....やってみたが、不安定。信号強度の強い局は問題ないのだが、RSSI閾値をminにしてもSTCが1になってくれない局がある。とりあえずこの作業はサクっと中断することにした[6]。
では本題へ
SEEKはいま一つだが、とりあえず動作確認は出来たので、本題に入りたい。あれ?
実はこのSi4700君を、Friskケースに入れたいのである。続きはSi4700をFriskケースに入れるにて。