[Arduino] TEA5767

有沒有想過手機上或曾經(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();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Arduino Due有14個數(shù)字I/O,6個模擬I/O,一個復位開關,一個ICSP下載口,7-12v電源供電。 ...
    麥牛2013閱讀 3,530評論 0 8
  • 所有的使用Arduino 的朋友大多都會知道大名鼎鼎的XBee 這個土豪級的ZigBee 的通信模塊。我們是做產(chǎn)品...
    梁睿坤閱讀 4,343評論 0 11
  • SPI通信實驗 SPI簡介 串行外設接口(Serial Peripheral Interface Bus,SPI)...
    btskyrmb閱讀 9,925評論 1 12
  • 1、嵌入式系統(tǒng)的定義 (1)定義:以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統(tǒng)對功能、可靠性、成本...
    榮卓然閱讀 2,261評論 0 5
  • 拍攝地點:淮北。 拍攝主體:淮北市區(qū)城中村。 這是一組有別于其他溫度城市的照片。沒有拍攝美麗風景,卻是記錄了淮北近...
    耿卮言閱讀 1,401評論 3 24

友情鏈接更多精彩內容