2011/10/21

[電子工作]TEA5767搭載FMモジュールを、Arduinoから動かす

,
 Arduinoから、aitendoから発売されているTEA5767モジュールを動かしてみました。
 TEA5767はFMレシーバICで、I2C or SPI機能を持つので、スレーブとしてマイコンに接続することができます。しかし、aitendoのモジュールは、最初からI2C専用の設計になっています(PinがSDAとSCLしかない)。なので、今回は、ArduinoからI2C経由で制御します。

 ところでこのモジュール、アンテナ端子がイヤホンのGNDと100Ωで繋がってる気がするんですが、これってどうなんでしょう?ELMさんのMP3プレーヤーの作例では、イヤホンアンテナとするためなのか、RDA5800のアンテナ端子とイヤホンのGNDを1pでつないでるみたいですが。アナログ高周波回路、よくわかりません…

配線

I2Cのバス2本、Vcc、GNDをArduinoに接続します。Arduino Duemilanoveの場合、
SDAはAnalog 4
SCLはAnalog 5
です。

コード

以下にコードを置いておきます。参考程度にどうぞ。
 内容は、指定した周波数を受信するようにさせるだけのシンプルなものです。各パラメータは、データシートのp11-p17あたりが詳しいです。
 設定するPLLの値は、このサイトさんに、周波数との対応表があるので参考にさせて頂きました。

#include <Wire.h>

//82.5 NHK-FM 2772
//81.3 J-WAVE 26DF
//write addr
const int addr = 0b1100000;
const char data1 = 0x27;
const char data2 = 0x72;
const char data3 = 0x10;
const char data4 = 0x36;
const char data5 = 0b00000000;

void setup()
{
  delay(1000);
  
  Serial.begin(9600);
  Wire.begin();
  //Serial.print(Wire.requestFrom(addr, 5));
  Wire.beginTransmission(addr);
  //Wire.send(0b11000000);
  Wire.send(data1);
  Wire.send(data2);
  Wire.send(data3);
  Wire.send(data4);
  Wire.send(data5);
  Wire.endTransmission();
  Serial.print("end");
}

void loop()
{
}

悩んだこと

Wire.beginTransmission(addr);
のaddrは0~127までの値です。I2Cのアドレスは大抵Lower bit(LSB?)が0か1かでRead/Writeの判断をすると思うのですが、この場合その最下位1bitを切り捨て、残り7bitを右シフトさせ0~127の範囲に収めてaddrに指定するみたいです。詳細は公式リファレンスをどうぞ。

「Wire.beginTransmission(addr);はアドレスをI2Cバスに送るか?」
実はここでかなり悩み、時間をとられました。何しろアマチュアなので原因の切り分けがなかなかできません。
日本語リファレンスには、「指定したアドレスのI2Cスレーブに対して送信処理を始めます。」とあります。
実際、TEA5767はI2Cの場合、addr, data[0], data[1], data[2], data[3], data[4]の6byteをたてつづけに送る必要があるみたいですが、Wire.send()を用いてaddrからもう一度送ると、上手く動きません。どうやら、Wire.beginTransmission()では特定のスレーブを受信体制にするために、I2Cバスにaddrを送信すると思うのですが、どうなんでしょう…。
Read more →