有沒有想過手機上或曾經(jīng)的MP3上的收音機可以自己做了?TEA5767幫您圓夢~= ̄ω ̄=
TEA5767是個FM調頻立體聲收音模塊,它可以用I2C或SPI來控制,而且內置75MHz的DSP讓收音質量好到飛起(聽說的~→_→)
參數(shù)規(guī)格
- 收音波段:
- FM日本頻段 - 76MHz ~ 91MHz
- FM歐美頻段 - 87.5MHz ~ 108MHz
- 中頻頻率: 225kHz
- 調諧系統(tǒng): PLL
- 靈敏度: 15μA
- 工作電壓: 2.5v~5.0v
- 信噪比: 60dB
- 聲道: 立體聲
- 聲道分離度: 30dB
- 晶振:
- 32.768kHz
- 13MHz
電路連接
本例直接采用I2C的連線方式來連接線路,所以線路會很簡潔。

TEA5767接線圖
電源會容易受到音頻放大器電源的干擾,所以要做好隔離。如果音頻放大器電源不超過5v時,也可以只在靠近TEA5767的電源端上接入一顆磁環(huán)抗干擾。

電路圖好難畫
指令集
我們這里主講I2C通信方式
I2C地址
- 讀地址: 0xC0
- 寫地址: 0xC1
寫入數(shù)據(jù)
向TEA5767寫入數(shù)據(jù)時,需要寫入一個5個字節(jié)長的結構體
struct WriteBuffer {
bool isMute : 1; // 靜音 = TRUE,正常 = FALSE
bool isSearchMode : 1; // 搜索模式 = TRUE,放音模式 = FALSE
int prePLL : 6; // 頻率PLL值的前6bits
int postPLL : 8; // 頻率PLL值的后8bits
int searchDirection : 1; // 向前搜索 = 0,向后搜索 = 1
int stopSearchLevel : 2; // 搜索模式不自動停止 = 0,搜索到微弱信號(信號強度ADC輸出5)時中斷搜索 = 1,搜索到中等信號(信號強度ADC輸出7)時中斷搜索 = 2,搜索到強烈信號(信號強度ADC輸出10)時中斷搜索 = 3
int sideBand : 1; // 上邊帶接收 = 1,下邊帶接收 = 0
bool isMono : 1; // 強制單聲道輸出 = TRUE,立體聲輸出 = FALSE
bool isMuteLeft : 1; // 立體聲合成到右聲道 = TRUE,正常聲道輸出 = FALSE
bool isMuteRight : 1; // 立體聲合成到左聲道 = TRUE,正常聲道輸出 = FALSE
int softwarePort1Output : 1; // SWP1作為可編程端口使用,SWP1口輸出高電平 = 1,SWP1口輸出低電平 = 0
int softwarePort2Output : 1; // SWP2作為可編程端口使用,SWP2口輸出高電平 = 1,SWP2口輸出低電平=0
bool isStandby : 1; // 待機模式 = TRUE,工作模式 = FALSE
int bandLimit : 1; // 日本調頻制式 = 1,歐美調頻制式 = 0
int xtal : 1; // 使用外置13MHz晶振 = 1,使用外置32.768kHz晶振 = 0
bool isSoftwareMute : 1; // 開啟軟件靜音 = TRUE,關閉軟件靜音 = FALSE
bool isHighCutControl : 1; // 開啟高頻旁路 = TRUE,關閉高頻旁路 = FALSE
bool isStereoNoiseCanceling : 1; // 開啟立體聲噪音消除 = TRUE,關閉立體聲噪音消除 = FALSE
bool isEnableSearchIndicator : 1; // 搜索到頻道是SWP1輸出高電平 = TRUE,SWP1作為可編程端口使用 = FALSE
bool isEnablePLLReference : 1; // 啟動6.5MHz鎖相環(huán)參考頻率 = TRUE,關閉6.5MHz鎖相環(huán)參考頻率 = FALSE
int DTC : 1; // 美國制去加重時間75μs = 1,其他國家去加重時間 50μs = 0
};
讀取數(shù)據(jù)
從TEA5767讀取數(shù)據(jù)時,需要使用另一個5個字節(jié)長的結構體
struct ReadBuffer {
bool isReady : 1; // 已搜索到頻道或搜索到波段邊界 = TRUE,否則 = FALSE
bool isBandLimit : 1; // 已搜索到波段邊界 = TRUE,否則 = FALSE
int prePLL : 6; // 當前頻率的PLL值的前6bits
int postPLL : 8; // 當前頻率的PLL值的后8bits
bool isStereo : 1; // 當前信號為立體聲 = TRUE,否則 = FALSE
int intermediateFrequency : 7; // 當前中頻,正確調諧時在0x31~0x3E之間
int RFADClevel : 4; // ADC輸出的RF信號等級
int chipID : 4; // 芯片ID
};
PLL值計算
- 頻率轉PLL
- 上邊帶接收:
PLL = (4 * (fRF + fIF)) / fREF - 下邊帶接收:
PLL = (4 * (fRF - fIF)) / fREF
- 上邊帶接收:
- PLL轉頻率
- 上邊帶接收:
fRF = (PLL * fREF) / 4 - fIF - 下邊帶接收:
fRF = (PLL * fREF) / 4 + fIF
- 上邊帶接收:
上式中各參數(shù):
- fRF為當前頻率,單位Hz
- fREF為參考頻率,如果XTAL使用的是32.758kHz的晶振,那么參考頻率取值32768,如果XTAL使用的是13MHz,則參考頻率取值50000,單位Hz
- fIF為中頻,這里取值為225000,單位Hz
代碼實現(xiàn)
因為使用I2C和TEA5767通信,所以需要使用到Arduino內建的Wire庫
I2C讀寫
#include <Wire.h>
#define I2C_CLOCK 400000 // TEA5767的I2C最大速率不超過400kHz
#define ADDRESS 0xC0 // TEA5767的I2C地址為0xC0
ReadBuffer readBuffer;
WriteBuffer writeBuffer;
void setup() {
Wire.begin();
Wire.setClock(I2C_CLOCK);
readDataFromTea5768();
setupWriteBuffer(); // 把對TEA5767的設置寫入WriteBuffer
writeDataToTea5767();
}
void unsetup() {
Wire.end();
}
void readDataFromTea5767() {
int bufferSize = sizeof(ReadBuffer);
Wire.requestFrom(ADDRESS, bufferSize);
byte data[bufferSize];
byte counter = 0;
memset(data, 0, bufferSize);
memset(&readBuffer, 0, bufferSize);
while (Wire.available()) {
data[counter] = Wire.read();
counter++;
}
if (counter = bufferSize) {
memcpy(&readBuffer, data, bufferSize);
}
}
void writeDataToTea5767() {
Wire.beginTransmission(ADDRESS);
Wire.write(&writeBuffer, sizeof(WriteBuffer));
Wire.endTransmission();
}