標(biāo)題: 眾拳STM8的RDA5807收音機(jī)實(shí)驗(yàn)資料 附代碼 [打印本頁]

作者: 眾拳單片機(jī)    時(shí)間: 2017-12-8 10:10
標(biāo)題: 眾拳STM8的RDA5807收音機(jī)實(shí)驗(yàn)資料 附代碼

一. 控制接口
RDA5807 提供了 I2C 作為控制接口.

    在該接口下,有兩中讀寫方式,分別是連續(xù)讀寫方式和帶寄存器地址的標(biāo)準(zhǔn) I2C 方式,兩種方式通過I2C 的器件地址來區(qū)分實(shí)現(xiàn),讀寫方式和器件地址詳細(xì)描述如下:

1、連續(xù)讀寫方式:
    在該模式下,寄存器的地址是不可見的,即有一個(gè)固定的起始寄存器地址(寫操作時(shí)為 02H,讀操作時(shí)為 0AH),并有一個(gè)內(nèi)部遞增計(jì)數(shù)器,I2C 器件地址為 0010000B,加上讀寫標(biāo)志,即 I2C 器件地址為0x20(寫操作)和 0x21(讀操作)

(1)、 寫操作: 寫操作默認(rèn)起始寄存器為 02H, 即所有寫操作都是默認(rèn)從 02H開始,即使只寫如 03H 或者 05H,都必須從 02H 寫起,MCU 寫入寄存器的順序如下:02H 的高字節(jié),02H 的低字節(jié),03H 的高字節(jié),……,直到結(jié)束。芯片在 MCU 寫入每個(gè)字節(jié)后都會(huì)返回一個(gè) ACK。MCU 會(huì)給出 STOP 來結(jié)束操作。

(2)、 讀操作: 讀操作默認(rèn)起始寄存器為 0AH, 即所有讀操作都是默認(rèn)從 0AH開始。在對(duì)芯片進(jìn)行讀操作時(shí),MCU 給出命令字節(jié)后,RDA5807HP 會(huì)送出數(shù)據(jù)字節(jié),順序如下:0AH 高字節(jié),0AH 低字節(jié),0BH 高字節(jié),……,直到芯片接收到從 MCU 發(fā)出的 NACK, MCU 送出 STOP,讀操作結(jié)束。除了最后一個(gè)字節(jié), MCU 在讀到每個(gè)字節(jié)后都要給出 ACK, 在讀到最后一個(gè)字節(jié)后, MCU給出 NACK,使芯片把總線交給 MCU,然后 MCU 發(fā)出 STOP,結(jié)束整個(gè)操作。
2、標(biāo)準(zhǔn) I2C 讀寫方式:
    該模式是與標(biāo)準(zhǔn) I2C 讀寫方式一致,即帶寄存器地址的方式,I2C 器件地址為 0010001B,加上讀寫標(biāo)志位,即為 0x22(寫操作)和 0x23(讀操作),讀寫方式的格式如下:



二. 狀態(tài)轉(zhuǎn)換


RDA5807HP 中有 5 種狀態(tài): 復(fù)位初始化(Reset&Initial),設(shè)置頻點(diǎn)(Tune), 搜臺(tái)(Seek),工作(Working),休眠(Sleep)。

    在芯片上電和復(fù)位后,軟件通過編寫 ENABLE(02H,bit 0)寄存器,將其置為 1,即可使RDA5807HP 進(jìn)入上電狀態(tài)。 軟件通過編程相應(yīng)寄存器, 即可使 RDA5807HP 進(jìn)入 Tune 或 Seek狀態(tài),這些操作之后,RDA5807HP 進(jìn)入正常工作狀態(tài)(Working)。軟件通過將 ENABLE 置為 0,可使 RDA5807HP 進(jìn)入睡眠狀態(tài),此時(shí)所有寄存器值保持不變(與未睡眠之前相同)。在睡眠狀態(tài)時(shí),軟件可通過編寫 ENABLE 為 1,即可將 RDA5807HP 回到正常工作(Working)狀態(tài)。進(jìn)入工作模式后,軟件需要重新設(shè)置所需要的頻點(diǎn),即重新進(jìn)行一次 Tune 操作。

單片機(jī)源程序如下:
  1. /****************************************************************************************
  2. *   說    明: FM收音機(jī)固定頻率實(shí)驗(yàn)
  3. *   開發(fā)平臺(tái): 劍齒虎STM8開發(fā)板        
  4. *   作    者: 劉洋 張殿東
  5. *   版    本: V1.0
  6. ****************************************************************************************/
  7. #include "pbdata.h"

  8. void BSP_Configuration(void);

  9. /****************************************************************************************
  10. *   函 數(shù) 名: main
  11. *   功能說明: c程序入口
  12. *   形    參:無
  13. *   返 回 值: 錯(cuò)誤代碼(無需處理)
  14. ****************************************************************************************/
  15. int main(void)
  16. {   
  17.     u16 time=0;
  18.     u8 key=0;
  19.   
  20.     BSP_Configuration();
  21.      
  22.     while(1)
  23.     {
  24.       key=TM1650_Key();
  25.       
  26.       switch(key)
  27.       {
  28.         case 0x64: //上搜臺(tái)
  29.         {            
  30.             RDA_Seek_Direction(1);
  31.             RXFreq=RDA_Search_Freq();
  32.             RDA_Freq_View(RXFreq);
  33.             while(TM1650_Key()==key);
  34.         }
  35.         break;
  36.         case 0x5C:// 下搜臺(tái)
  37.         {
  38.             RDA_Seek_Direction(0);
  39.             RXFreq=RDA_Search_Freq();
  40.             RDA_Freq_View(RXFreq);
  41.             while(TM1650_Key()==key);
  42.         }
  43.         break;
  44.         case 0x54:// 左小聲
  45.         {
  46.             RDA_Vol_Small();
  47.             while(TM1650_Key()==key);
  48.         }
  49.         break;
  50.         case 0x44://右大聲
  51.         {
  52.             RDA_Vol_Big();
  53.             while(TM1650_Key()==key);
  54.         }
  55.         break;
  56.         case 0x4C://  確定鍵  開關(guān)
  57.         {                       
  58.             RDA_Enable();
  59.             while(TM1650_Key()==key);                        
  60.         }
  61.         break;        
  62.       }
  63.       
  64.       if(KEY_Down(K1_PORT,K1_PIN)==true)//向下微調(diào)
  65.       {   
  66.           RDA_Freq_Down();
  67.       }
  68.    
  69.       if(KEY_Down(TOUCH_PORT, TOUCH_PIN)==true)//向上微調(diào)
  70.       {            
  71.           RDA_Freq_Up();
  72.       }
  73.       
  74.       time++;
  75.       delay_ms(1);
  76.       if(time>1000)
  77.       {
  78.         time=0;      
  79.         printf("頻率:%d\r\n",RXFreq);
  80.         printf("信號(hào):%d\r\n",RDA_RSSI());
  81.         printf("音量:%d\r\n",Vol);
  82.         printf("\r\n");
  83.       }
  84.     }
  85. }
  86. /****************************************************************************************
  87. *   函 數(shù) 名: BSP_Configuration
  88. *   功能說明: 初始化硬件設(shè)備。只需要調(diào)用一次。該函數(shù)配置CPU寄存器和外設(shè)的寄存器并初始化一些全局變量。
  89. *   形    參:無
  90. *   返 回 值: 無
  91. ****************************************************************************************/
  92. void BSP_Configuration(void)
  93. {
  94.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);   
  95. ……………………

  96. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:

【眾拳】劍齒虎STM8開發(fā)板的實(shí)驗(yàn)代碼下載:

眾拳RDA5807收音機(jī)實(shí)驗(yàn)程序.zip (1.92 MB, 下載次數(shù): 168)
資料.zip (869.77 KB, 下載次數(shù): 100)


作者: qq972738716    時(shí)間: 2018-1-29 23:39
學(xué)習(xí)了
作者: IdeaMing    時(shí)間: 2018-1-31 10:18
謝謝分享,真的是無私奉獻(xiàn)。
作者: 行云流水    時(shí)間: 2018-9-30 18:10
謝謝分享
作者: a89588038    時(shí)間: 2018-10-13 16:31
51hei論壇有你更精彩 謝謝分享
作者: mengxia0510    時(shí)間: 2019-3-25 16:48
感謝分享
作者: 行云流水    時(shí)間: 2019-3-30 21:20
謝謝分享。辛苦了!
作者: JK_L    時(shí)間: 2019-7-23 17:22
有你更精彩

作者: hanvic    時(shí)間: 2019-8-12 21:54
謝謝分享,真的是無私奉獻(xiàn)。
作者: hanvic    時(shí)間: 2019-8-12 22:00
謝謝分享,收藏了
作者: SolitaryLGQ    時(shí)間: 2019-9-4 11:43
請(qǐng)教個(gè)問題:在讀取0BH寄存器時(shí)發(fā)現(xiàn)FM_TRUE位恒為0,沒辦法判斷當(dāng)前通道是否為station,請(qǐng)問各位大佬遇到過嗎?怎么解決的?
作者: saya0769    時(shí)間: 2019-10-19 15:56
謝謝分享啊。好東西。謝謝了。十分感謝。
作者: 562969678    時(shí)間: 2019-12-20 14:24
好東西
作者: zjx666    時(shí)間: 2020-4-23 11:10
謝謝分享,真的是無私奉獻(xiàn)。
作者: sad520ljh    時(shí)間: 2020-4-23 17:30
用了一下,沒成功。
初始化都不加個(gè)判斷是否初始化成功的嗎。即使不連接也能運(yùn)行下去。
用了搜臺(tái)功能,函數(shù)里有個(gè)while,不過不知道為什么一下子就過去了,一直返回常數(shù)。
難受。
作者: xiangdan    時(shí)間: 2020-8-7 11:39
謝謝分享,真的是無私奉獻(xiàn)




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1