找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4|回复: 0
打印 上一主题 下一主题
收起左侧

QN8027代码

[复制链接]
跳转到指定楼层
楼主
ID:1169786 发表于 2026-4-14 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "qndriver.h"

  2. extern UINT8 QND_ReadReg(UINT8 adr);
  3. extern UINT8 QND_WriteReg(UINT8 adr, UINT8 value);

  4. #define RSSINTHRESHOLD 4
  5. UINT8  clearscanflag = 0;
  6. UINT16 clearchannel = 0;
  7. UINT8  firstscan = 1;

  8. #define R_TXRX_MASK    0x20
  9. #define R_FMAM_MASK    0xc0
  10. UINT8  S_XDATA  RSSIn = 255;
  11. UINT8  S_XDATA  Rssinarray[4];
  12. UINT8  S_XDATA  qnd_Country  = COUNTRY_CHINA ;
  13. UINT16 S_XDATA  QND_CH_START = 7600;
  14. UINT16 S_XDATA  QND_CH_STOP  = 10800;
  15. UINT8  S_XDATA  QND_CH_STEP  = 1;
  16. UINT8 S_XDATA qnd_Band;




  17. /**********************************************************************
  18. void QNF_SetRegBit(UINT8 reg, UINT8 bitMask, UINT8 data_val)
  19. **********************************************************************
  20. Description: set register specified bit

  21. Parameters:
  22. reg:        register that will be set
  23. bitMask:    mask specified bit of register
  24. data_val:    data will be set for specified bit
  25. Return Value:
  26. None
  27. **********************************************************************/
  28. void QNF_SetRegBit(UINT8 reg, UINT8 bitMask, UINT8 data_val)
  29. {
  30.     UINT8 temp;
  31.     temp = QND_ReadReg(reg);
  32.     temp &= (UINT8)(~bitMask);
  33.     temp |= data_val;
  34.     QND_WriteReg(reg, temp);
  35. }

  36. /**********************************************************************
  37. UINT16 QNF_GetCh()
  38. **********************************************************************
  39. Description: get channel frequency of CCS

  40. Parameters:
  41. None
  42. Return Value:
  43. channel frequency
  44. **********************************************************************/
  45. UINT16 QNF_GetCh()
  46. {
  47.     UINT8 tCh;
  48.     UINT8  tStep;
  49.     UINT16 ch = 0;
  50.     // set to reg: CH_STEP
  51.     tStep = QND_ReadReg(CH_STEP);
  52.     tStep &= CH_CH;
  53.     ch  =  tStep ;
  54.     tCh= QND_ReadReg(CH);   
  55.     ch = (ch<<8)+tCh;
  56.     return CHREG2FREQ(ch);
  57. }

  58. /**********************************************************************
  59. UINT8 QNF_SetCh(UINT16 freq)
  60. **********************************************************************
  61. Description: set specified frequency

  62. Parameters:
  63.         freq:  specified frequency that is set
  64. Return Value:
  65.          1: set success
  66. **********************************************************************/
  67. UINT8 QNF_SetCh(UINT16 freq)
  68. {
  69.     // calculate ch para
  70.     UINT8 tStep;
  71.     UINT8 tCh;
  72.     UINT16 f;
  73.         f = FREQ2CHREG(freq);
  74.         // set to reg: CH
  75.         tCh = (UINT8) f;
  76.                 printk("cj+++tCh = %d \r\n",tCh);
  77.         QND_WriteReg(CH, tCh);
  78.         // set to reg: CH_STEP
  79.         tStep = QND_ReadReg(CH_STEP);
  80.         tStep &= ~CH_CH;
  81.         tStep |= ((UINT8) (f >> 8) & CH_CH);
  82.                 printk("cj+++tStep = %d \r\n",tStep);
  83.         QND_WriteReg(CH_STEP, tStep);

  84.     return 1;
  85. }

  86. /**********************************************************************
  87. void QNF_SetAudioMono(UINT8 modemask, UINT8 mode)
  88. **********************************************************************
  89. Description:    Set audio output to mono.

  90. Parameters:
  91.   modemask: mask register specified bit
  92.   mode
  93.         QND_RX_AUDIO_MONO:      RX audio to mono
  94.         QND_RX_AUDIO_STEREO:  RX audio to stereo   
  95.         QND_TX_AUDIO_MONO:    TX audio to mono
  96.         QND_TX_AUDIO_STEREO:  TX audio to stereo
  97. Return Value:
  98.   None
  99. **********************************************************************/
  100. void QNF_SetAudioMono(UINT8 modemask, UINT8 mode)
  101. {
  102.     QNF_SetRegBit(SYSTEM2,modemask, mode);
  103. }

  104. /**********************************************************************
  105. int QND_Delay()
  106. **********************************************************************
  107. Description: Delay for some ms, to be customized according to user
  108.              application platform

  109. Parameters:
  110.         ms: ms counts
  111. Return Value:
  112.         None
  113.             
  114. **********************************************************************/
  115. void QND_Delay(UINT16 ms)
  116. {
  117.     UINT16 i,k;
  118.     for(i=0; i<3000;i++)
  119.     {   
  120.         for(k=0; k<ms; k++)
  121.         {

  122.         }
  123.     }
  124. }

  125. /**********************************************************************
  126. UINT8 QND_GetRSSI(UINT16 ch)
  127. **********************************************************************
  128. Description:    Get the RSSI value, call QND_TuneToCH  to set specify CH
  129. Parameters:
  130. Return Value:
  131. RSSI value  of the channel setted
  132. **********************************************************************/
  133. void QN_ChipInitialization()
  134. {
  135.         //24M初始化
  136.     QND_WriteReg(0x00,0x81);// reset all registers to the default value
  137.     QND_Delay(20);
  138.      //to be customized: change the crystal setting(register 0x03 and 0x04) according to HW design
  139.      //Had better set Reg0x04 bit1~0=11(40Kohm input impedance) and bit6~4=011
  140.      QND_WriteReg(0x03,0x10);// 如果使用无源晶体,0x03寄存器[7:6]为00,
  141.      QND_WriteReg(0x04,0xb2);// 如果是24M,0x04写0xb2,如果是12M,0x04写0x32
  142.      
  143.     QNF_SetRegBit(0x00,0x40,0x40);//recalibration
  144.     QNF_SetRegBit(0x00,0x40,0x00);//recalibration
  145.     QND_Delay(20);                //delay 20 ms
  146.     QND_WriteReg(0x18,0xe4);        //SNR improve
  147.     QND_WriteReg(0x1b,0xf0);    //Increase RF power output
  148.     /***********/
  149.         QND_WriteReg(0x01, 0x7e);
  150.         QND_WriteReg(0x02, 0xb9);
  151.    /************/
  152.     //Done chip recalibration
  153. }


  154. void QN_ChipInitialization_12M()
  155. {
  156.     QND_WriteReg(0x00,0x81);// reset all registers to the default value
  157.     QND_Delay(20);
  158.      //to be customized: change the crystal setting(register 0x03 and 0x04) according to HW design
  159.      //Had better set Reg0x04 bit1~0=11(40Kohm input impedance) and bit6~4=011
  160.      QND_WriteReg(0x03,0x10);// 使用无源晶体,设置为0x10
  161.      QND_WriteReg(0x04,0x32);// 晶体为12M,如果是24M,设置为0xb2
  162.      
  163.     QNF_SetRegBit(0x00,0x40,0x40);//recalibration
  164.     QNF_SetRegBit(0x00,0x40,0x00);//recalibration
  165.     QND_Delay(20);                //delay 20 ms
  166.    
  167.     QND_WriteReg(0x18,0xe4);        //SNR improve
  168.     QND_WriteReg(0x1b,0xf0);    //Increase RF power output
  169.     /***********/
  170.         QND_WriteReg(0x01, 0x7e);
  171.         QND_WriteReg(0x02, 0xb9);
  172.    /************/
  173.     //Done chip recalibration
  174. }
  175. /**********************************************************************
  176. int QND_Init()
  177. **********************************************************************
  178. Description: Initialize device to make it ready to have all functionality ready for use.

  179. Parameters:
  180. None
  181. Return Value:
  182. 1: Device is ready to use.
  183. 0: Device is not ready to serve function.
  184. **********************************************************************/
  185. UINT8 QND_Init()
  186. {
  187.     QN_ChipInitialization();
  188.     QND_WriteReg(00,  0x22); //resume original status of chip /* 2008 06 13 */

  189.     qnd_Band = BAND_FM;
  190.     return 1;
  191. }

  192. UINT8 QND_Shutdown()
  193. {
  194.         QND_WriteReg(00,  0x01);
  195.         return 1;
  196. }

  197. /**********************************************************************
  198. void QND_SetSysMode(UINT16 mode)
  199. ***********************************************************************
  200. Description: Set device system mode(like: sleep ,wakeup etc)
  201. Parameters:
  202. mode:
  203. set the system mode , it will be set by  some macro define usually:
  204.     SLEEP:  it will set device system work on sleep mode
  205.     WAKEUP: it will wakeup device system
  206.     TX:     it will set device system work on TX mode
  207.     RX:     it will set device system work on RX mode
  208.     FM:     it will set device system work on FM mode
  209.     AM:     it will set device system work on AM mode
  210.     TX|FM:  it will set device system work on FM,TX mode
  211.     RX|AM;  it will set device system work on AM,RX mode
  212.     RX|FM:    it will set device system work on FM,RX mode
  213. Return Value:
  214.     None     
  215. **********************************************************************/
  216. void QND_SetSysMode(UINT16 mode)
  217. {   
  218.     UINT8 val;
  219.     switch(mode)        
  220.     {        
  221.     default:   
  222.             val = (UINT8)(mode >> 8);        
  223.             if (val)
  224.             {
  225.                 val = val >> 1;
  226.                 if (val & 0x20)
  227.                 {
  228.                     QNF_SetRegBit(SYSTEM1, 0x20, val);   
  229.                 }
  230.                 qnd_Band = BAND_FM;
  231.             }   
  232.         break;        
  233.     }   
  234. }

  235. /**********************************************************************
  236. void QND_TuneToCH(UINT16 ch)
  237. **********************************************************************
  238. Description:    Tune to the specified channel. Before use this function
  239. make sure the QND_SetSysMode() has been called. If system is working
  240. on FM&TX mode,it will turn FM to ch, and start Transmit; If system is
  241. working on FM&RX mode,it will turn FM to ch, and start FM play.
  242. Parameters:
  243. ch
  244. Set the frequency (10kHz) to be tuned,
  245. eg: 101.30MHz will be set to 10130.
  246. Return Value:
  247.     None
  248. **********************************************************************/
  249. void QND_TuneToCH(UINT16 ch)
  250. {
  251.     UINT8 rssi;
  252.     UINT8 minrssi;


  253.     QNF_SetCh(ch);
  254.     QND_Delay(150);


  255. }

  256. /**********************************************************************
  257. void QND_SetCountry(UINT8 country)
  258. ***********************************************************************
  259. Description: Set start, stop, step for RX and TX based on different
  260.              country
  261. Parameters:
  262. country:
  263. Set the chip used in specified country:
  264.     CHINA:
  265.     USA:
  266.     JAPAN:
  267. Return Value:
  268.     None     
  269. **********************************************************************/
  270. void QND_SetCountry(UINT8 country)
  271. {
  272.     qnd_Country = country;
  273.     switch(country)
  274.     {
  275.     case COUNTRY_CHINA:
  276.         QND_CH_START = 7600;
  277.         QND_CH_STOP = 10800;
  278.         QND_CH_STEP = 1;
  279.         break;
  280.     case COUNTRY_USA:
  281.         QND_CH_START = 8810;
  282.         QND_CH_STOP = 10790;
  283.         QND_CH_STEP = 2;
  284.         break;
  285.     case COUNTRY_JAPAN:
  286.         break;
  287.     }
  288. }

  289. /**********************************************************************
  290. UINT8 QND_TXSetPower( UINT8 gain)
  291. **********************************************************************
  292. Description:    Sets FM transmit power attenuation.

  293. Parameters:
  294.       attenuation :The transmission power attenuation value, for example,
  295.                    setting the gain = 0x13, TX attenuation will be -6db
  296.         gain:Look Up Table (see below)
  297.         
  298. // db: maximum is -34.5db -(12 + 124-101.5)
  299. //     input unit: 0.1db, eg: -110.5 => 1105
  300. //                 
  301. //      
  302. //
  303. /*
  304. BIT[5:4]
  305.             00    0db
  306.             01    -6db
  307.             10    -12db
  308.             11    -18db
  309. BIT[3:0]    unit: db
  310.             0000    124
  311.             0001    122.5
  312.             0010    121
  313.             0011    119.5
  314.             0100    118
  315.             0101    116.5
  316.             0110    115
  317.             0111    113.5
  318.             1000    112
  319.             1001    110.5
  320.             1010    109
  321.             1011    107.5
  322.             1100    106
  323.             1101    104.5
  324.             1110    103
  325.             1111    101.5
  326. for example:
  327.   0x2f,    //111111    89.5
  328.   0x2e,    //111110    91
  329.   0x2d,    //111101    92.5
  330.   0x2c,    //111100    94
  331.   0x1f,    //111011 95.5
  332.   0x1e,    //111010 97
  333.   0x1d,    //111001 98.5
  334.   0x1c,    //111000 100
  335.   0x0f,    //001111    101.5
  336.   0x0e,    //001110    103
  337.   0x0d,    //001101    104.5
  338.   0x0c,    //001100    106
  339.   0x0b,    //001011    107.5
  340.   0x0a,    //001010    109
  341.   0x09,    //001001    110.5
  342.   0x08,    //001000    112
  343.   0x07,    //000111    113.5
  344.   0x06,    //000110    115
  345.   0x05,    //000101    116.5
  346.   0x04,    //000100    118
  347.   0x03,    //000011    119.5
  348.   0x02,    //000010    121
  349.   0x01,    //000001    122.5
  350.   0x00     //000000    124
  351. */
  352. void QND_TXSetPower( UINT8 gain)
  353. {
  354.     UINT8 value = 0;
  355.     value |= 0x40;  
  356.     value |= gain;
  357.     QND_WriteReg(PAG_CAL, value);
  358. }

  359. /**********************************************************************
  360. Description: Config the Rx Audio performance like volume adjust,
  361. mute set:
  362. Parameters:
  363. optiontype:
  364. It indicates what you want to config,   it can use some marco define to control:
  365. eg: AGCGAINCONFIG, SOFTCLIPCONFIG, MONOCONFIG, OUTPUTFORMATCONFIG
  366. option:
  367. set the configuration value;
  368. if (optiontype== QND_CONFIG_AUTOAGC) : ‘option’ will control agc,
  369. 0:disable agc function, 1:enable function.
  370. if (optiontype== QND_CONFIG_SOFTCLIP); ‘option’ will control softclip,
  371. 0:disable soft clip, 1:enable softclip.
  372. if (optiontype== QND_CONFIG_MONO); ‘option’ will control mono,
  373. 0: QND_AUDIO_STEREO, 1: QND_AUDIO_STEREO
  374. if (optiontype == QND_CONFIG_AGCGAIN);  ‘option’ will control AGC value:0000~1111
  375. Return Value:
  376. none
  377. **********************************************************************/
  378. void QND_TXConfigAudio(UINT8 optiontype, UINT8 option )
  379. {
  380.     switch(optiontype)
  381.     {
  382.     case QND_CONFIG_MONO:
  383.         if (option)
  384.             QNF_SetAudioMono(0x10, QND_TX_AUDIO_MONO);
  385.         else
  386.             QNF_SetAudioMono(0x10, QND_TX_AUDIO_STEREO);
  387.         break;

  388.     case QND_CONFIG_MUTE:
  389.         if (option)
  390.             QNF_SetRegBit(23, 0x30,0);
  391.         else   
  392.             QNF_SetRegBit(23, 0x30,0x30);
  393.         break;
  394.     case QND_CONFIG_AGCGAIN:
  395.         QNF_SetRegBit(0x04, 0x70,(UINT8)(option<<4));
  396.         break;

  397.     default:
  398.         break;

  399.     }
  400. }

  401. /**********************************************************************
  402. UINT8 QND_SetRDSMode(UINT8 mode)
  403. **********************************************************************
  404. Description: Enable or disable chip to work with RDS related functions.
  405. Parameters:
  406.           on: QND_RDS_ON:  Enable chip to receive/transmit RDS data.
  407.                 QND_RDS_OFF: Disable chip to receive/transmit RDS data.
  408. Return Value:
  409.            QND_SUCCESS: function executed

  410. **********************************************************************/
  411. UINT8 QND_RDSEnable(UINT8 on)
  412. {
  413.     UINT8 val;

  414.     QND_LOG("=== QND_SetRDSMode === ");
  415.     // get last setting
  416.     val = QND_ReadReg(0x12);
  417.     if (on == QND_RDS_ON)
  418.     {
  419.         val |= RDSEN;
  420.     }
  421.     else if (on == QND_RDS_OFF)
  422.     {
  423.         val &= ~RDSEN;
  424.     }
  425.     else
  426.     {
  427.         return 0;
  428.     }
  429.     QND_WriteReg(0x12, val);
  430.     return 1;
  431. }

  432. /**********************************************************************
  433. UINT8 QND_LoadRDSData( UINT8 *buf)
  434. **********************************************************************
  435. Description: Load (TX) or unload (RX) RDS data to on-chip RDS buffer.
  436.                Before calling this function, always make sure to call the
  437.               QND_RDSBufferReady function to check that the RDS is capable
  438.               to load/unload RDS data.
  439. Parameters:
  440.           rdsRawData : 8 bytes data buffer to load (on TX mode) or unload (on RX
  441.           mode) to chip RDS buffer.
  442.           Upload:   1-upload, 0--download
  443. Return Value:
  444.          QND_SUCCESS: function executed
  445. **********************************************************************/
  446. void QND_RDSLoadData(UINT8 *rdsRawData, UINT8 upload)
  447. {
  448.     UINT8 i;
  449.     UINT8 temp;
  450.     if (upload)
  451.     {       //TX MODE
  452.         for (i = 0; i <= 7; i++)
  453.         {
  454.             QND_WriteReg(RDSD0 + i, rdsRawData[i]);
  455.         }   
  456.     }
  457.     else
  458.     {
  459.         //RX MODE
  460.         for (i = 0; i <= 7; i++)
  461.         {
  462.             temp = QND_ReadReg(RDSD0 + i);
  463.             rdsRawData[i] = temp;
  464.         }
  465.     }
  466. }

  467. /**********************************************************************
  468. UINT8 QND_RDSBufferReady(void)
  469. **********************************************************************
  470. Description: Check chip RDS register buffer status before doing load/unload of
  471.              RDS data.

  472. Parameters:
  473.          None
  474. Return Value:
  475.          QND_RDS_BUFFER_NOT_READY: RDS register buffer is not ready to use.
  476.          QND_RDS_BUFFER_READY: RDS register buffer is ready to use. You can now
  477.                                    load (for TX) or unload (for RX) data
  478.                                    from/to RDS buffer
  479. **********************************************************************/
  480. UINT8 QND_RDSCheckBufferReady(void)
  481. {
  482.     // get last setting
  483.     UINT8 ret = QND_RDS_BUFFER_NOT_READY;
  484.     UINT8 val;
  485.     UINT8 temp;
  486.     UINT8 rdsUpdated;

  487.     if (QND_ReadReg(SYSTEM1) & TXREQ)
  488.     {       //TX MODE
  489.         val = QND_ReadReg(SYSTEM2);
  490.         rdsUpdated = val&RDSTXRDY ? 0 : 1;      
  491.         if (rdsUpdated == 0)
  492.         {
  493.             QND_WriteReg(SYSTEM2,val & 0xfb);  //write 0
  494.             ret = QND_RDS_BUFFER_READY;
  495.         }
  496.         else
  497.         {
  498.             QND_WriteReg(SYSTEM2,val | 0x04);  
  499.             ret = QND_RDS_BUFFER_READY;                       //wirte 1   
  500.         }
  501.         
  502.     }
  503.     else
  504.     {                                      //for RX mode
  505.     }
  506.     return ret;
  507. }

复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表