找回密码
 立即注册

QQ登录

只需一步,快速开始

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

QN8027 FM发射模块和QN8027的开发资料和程序源码

  [复制链接]
跳转到指定楼层
楼主
QN8027 FM发射模块的资料和程序源码,还有QN8027开发资料

下载:
qn8006b1_sdk_driver_v1.00.rar (474.06 KB, 下载次数: 262)
QN8027.zip (1.9 MB, 下载次数: 282)







For C51

Before using this code:
- Make sure I2C address is matching datasheet
- If i2c driver existed, then just ignore qnio.c/h
- Modify QND_Deley(ms) to get accurate platform related miliseconds delay,
  otherwise all chip's functionality may not working properly
- Detail please read related doc or get FAE's help

  1. #include "qndriver.h"

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


  4. #define R_TXRX_MASK    0xd0
  5. UINT8  S_XDATA  qnd_RSSIns = 255;
  6. UINT8  S_XDATA  qnd_Crystal = QND_CRYSTAL_DEFAULT;
  7. UINT8  S_XDATA  qnd_RSSIn[QND_BAND_NUM];
  8. UINT8  S_XDATA  qnd_PrevMode;
  9. UINT8  S_XDATA  qnd_Country  = COUNTRY_CHINA ;
  10. UINT16 S_XDATA  qnd_CH_START = 7600;
  11. UINT16 S_XDATA  qnd_CH_STOP  = 10800;
  12. UINT8  S_XDATA  qnd_CH_STEP  = 1;
  13. UINT8  qnd_ClearScanFlag = 0;
  14. UINT16 qnd_ClearChannel = 0;
  15. UINT8  qnd_FirstScan = 1;

  16. UINT8  S_XDATA qnd_AutoScanAll;
  17. UINT8  S_XDATA qnd_IsStereo;
  18. UINT8  S_XDATA qnd_ChCount;
  19. UINT16 S_XDATA  qnd_RSSInBB[QND_BAND_NUM+1];         
  20. UINT16 S_XDATA qnd_ChList[QN_CCA_MAX_CH];
  21. UINT8  S_XDATA  qnd_StepTbl[3]={5,10,20};
  22. QND_SeekCallBack qnd_CallBackFunc = 0;



  23. /**********************************************************************
  24. void QNF_RXInit()
  25. **********************************************************************
  26. Description: set to SNR based MPX control. Call this function before
  27.              tune to one specific channel

  28. Parameters:
  29. None
  30. Return Value:
  31. None
  32. **********************************************************************/
  33. void QNF_RXInit()
  34. {
  35.     QNF_SetRegBit(77,0x80,0x80);  // Set to High-Z
  36.     QNF_SetRegBit(40,0x80,0x80);  // Set SNR as criteria for MPX control

  37.     QNF_SetRegBit(64,0x3f,SMSTART_VAL); //set SMSTART
  38.     QNF_SetRegBit(66,0x3f,HCCSTART_VAL); //set HCCSTART
  39.     QNF_SetRegBit(65,0x7f,SNCSTART_VAL); //set SNCSTART
  40. }

  41. /**********************************************************************
  42. void QNF_SetMute(UINT8 On)
  43. **********************************************************************
  44. Description: set register specified bit

  45. Parameters:
  46. On:        1: mute, 0: unmute
  47. Return Value:
  48. None
  49. **********************************************************************/
  50. void QNF_SetMute(UINT8 On)
  51. {
  52.     if(On)
  53.     {
  54.         QNF_SetRegBit(REG_PD2, 0x0c, 0x0c); // mute/unmute to avoid noise   
  55.         //   QNF_SetRegBit(3, 0x80, 0x80); // mute/unmute to avoid noise   
  56.     }
  57.     else
  58.     {
  59.         QND_Delay(QND_DELAY_BEFORE_UNMUTE);
  60.         QNF_SetRegBit(REG_PD2, 0x0c, 0x00); // mute/unmute to avoid noise   
  61.         //   QND_Delay(50);
  62.      //   QNF_SetRegBit(3, 0x80, 0x00); // mute/unmute to avoid noise   
  63.     }
  64. }

  65. /**********************************************************************
  66. void QNF_SetRegBit(UINT8 reg, UINT8 bitMask, UINT8 data_val)
  67. **********************************************************************
  68. Description: set register specified bit

  69. Parameters:
  70.     reg:        register that will be set
  71.     bitMask:    mask specified bit of register
  72.     data_val:    data will be set for specified bit
  73. Return Value:
  74.     None
  75. **********************************************************************/
  76. void QNF_SetRegBit(UINT8 reg, UINT8 bitMask, UINT8 data_val)
  77. {
  78.     UINT8 temp;
  79.     temp = QND_ReadReg(reg);
  80.     temp &= (UINT8)(~bitMask);
  81.     temp |= data_val & bitMask;
  82. //    temp |= data_val;
  83.     QND_WriteReg(reg, temp);
  84. }

  85. /**********************************************************************
  86. void QNF_InitRSSInBB()
  87. **********************************************************************
  88. Description: init RSSI noise floor band

  89. Parameters:
  90.     None
  91. Return Value:
  92.     None
  93. **********************************************************************/
  94. void QNF_InitRSSInBB()
  95. {
  96.     UINT8 i,d2,d,step;
  97.     UINT16 d1;

  98.     // get frequency leap step
  99.     step = qnd_StepTbl[qnd_CH_STEP];
  100.     // total frequency span
  101.     d1 = qnd_CH_STOP - qnd_CH_START;
  102.     // make sure d2 value <= 255, normally QND_BAND_NUM should < 10
  103.     d2 = step * QND_BAND_NUM;
  104.     d = d1/d2;
  105.     // first one should be CH_START
  106.     qnd_RSSInBB[0] = qnd_CH_START;
  107.     for(i=1; i<QND_BAND_NUM; i++) {
  108.         qnd_RSSInBB[i] = qnd_RSSInBB[i-1] + d * step;
  109.     }
  110.     // last one set one more step higher for convenience
  111.     qnd_RSSInBB[i] = qnd_CH_STOP+step;
  112. }

  113. /**********************************************************************
  114. UINT8 QNF_GetRSSInBandIndex(UINT16 chfreq)
  115. **********************************************************************
  116. Description: get band index

  117. Parameters:
  118.     chfreq: channel frequency (10Khz unit, eg: for 101.10Mhz, input 10110)
  119. Return Value: band index for input CH frequency
  120. **********************************************************************/
  121. UINT8 QNF_GetRSSInBandIndex(UINT16 chfreq)  
  122. {
  123.     UINT8 i;
  124.     for(i=0; i<QND_BAND_NUM; i++) {
  125.         if(chfreq < qnd_RSSInBB[i+1]) {
  126.             // finally come to here, if no wrong input
  127.             return i;
  128.         }
  129.     }
  130. }

  131. /**********************************************************************
  132. UINT8 QNF_GetRSSIn(UINT16 chFreq)
  133. **********************************************************************
  134. Description: get RSSI noise floor

  135. Parameters:
  136.     chfreq: channel frequency (10Khz unit, eg: for 101.10Mhz, input 10110)
  137. Return Value:
  138.     the RSSI noise floor
  139. **********************************************************************/
  140. UINT8 QNF_GetRSSIn(UINT16 chFreq)
  141. {
  142.     UINT8 idx;
  143.     idx = QNF_GetRSSInBandIndex(chFreq);
  144.     return qnd_RSSIn[idx];
  145. }

  146. /**********************************************************************
  147. UINT16 QNF_GetCh()
  148. **********************************************************************
  149. Description: get current channel frequency

  150. Parameters:
  151.     None
  152. Return Value:
  153.     channel frequency
  154. **********************************************************************/
  155. UINT16 QNF_GetCh()
  156. {
  157.     UINT8 tCh;
  158.     UINT8  tStep;
  159.     UINT16 ch = 0;
  160.     // set to reg: CH_STEP
  161.     tStep = QND_ReadReg(CH_STEP);
  162.     tStep &= CH_CH;
  163.     ch  =  tStep ;
  164.     tCh= QND_ReadReg(CH);   
  165.     ch = (ch<<8)+tCh;
  166.     return CHREG2FREQ(ch);
  167. }

  168. /**********************************************************************
  169. UINT8 QNF_SetCh(UINT16 freq)
  170. **********************************************************************
  171. Description: set channel frequency

  172. Parameters:
  173.     freq:  channel frequency to be set
  174. Return Value:
  175.     1: success
  176. **********************************************************************/
  177. UINT8 QNF_SetCh(UINT16 freq)
  178. {
  179.     // calculate ch parameter used for register setting
  180.     UINT8 tStep;
  181.     UINT8 tCh;
  182.     UINT16 f;
  183.         f = FREQ2CHREG(freq);
  184.         // set to reg: CH
  185.         tCh = (UINT8) f;
  186.         QND_WriteReg(CH, tCh);
  187.         // set to reg: CH_STEP
  188.         tStep = QND_ReadReg(CH_STEP);
  189.         tStep &= ~CH_CH;
  190.         tStep |= ((UINT8) (f >> 8) & CH_CH);
  191.         QND_WriteReg(CH_STEP, tStep);

  192.     return 1;
  193. }

  194. /**********************************************************************
  195. void QNF_ConfigScan(UINT16 start,UINT16 stop, UINT8 step)
  196. **********************************************************************
  197. Description: config start, stop, step register for FM/AM CCA or CCS

  198. Parameters:
  199.     start
  200.         Set the frequency (10kHz) where scan to be started,
  201.         eg: 7600 for 76.00MHz.
  202.     stop
  203.         Set the frequency (10kHz) where scan to be stopped,
  204.         eg: 10800 for 108.00MHz
  205.     step        
  206.         1: set leap step to (FM)100kHz / 10kHz(AM)
  207.         2: set leap step to (FM)200kHz / 1kHz(AM)
  208.         0:  set leap step to (FM)50kHz / 9kHz(AM)
  209. Return Value:
  210.          None
  211. **********************************************************************/
  212. void QNF_ConfigScan(UINT16 start,UINT16 stop, UINT8 step)
  213. {
  214.     // calculate ch para
  215.     UINT8 tStep = 0;
  216.     UINT8 tS;
  217.     UINT16 fStart;
  218.     UINT16 fStop;
  219.         fStart = FREQ2CHREG(start);
  220.         fStop = FREQ2CHREG(stop);
  221.         // set to reg: CH_START
  222.     tS = (UINT8) fStart;
  223.     QND_WriteReg(CH_START, tS);
  224.     tStep |= ((UINT8) (fStart >> 6) & CH_CH_START);
  225.     // set to reg: CH_STOP
  226.     tS = (UINT8) fStop;
  227.     QND_WriteReg(CH_STOP, tS);
  228.     tStep |= ((UINT8) (fStop >> 4) & CH_CH_STOP);
  229.     // set to reg: CH_STEP
  230.     tStep |= step << 6;
  231.     QND_WriteReg(CH_STEP, tStep);
  232. }

  233. /**********************************************************************
  234. void QNF_SetAudioMono(UINT8 modemask, UINT8 mode)
  235. **********************************************************************
  236. Description:    Set audio output to mono.

  237. Parameters:
  238.   modemask: mask register specified bit
  239.   mode
  240.         QND_RX_AUDIO_MONO:    RX audio to mono
  241.         QND_RX_AUDIO_STEREO:  RX audio to stereo   
  242.         QND_TX_AUDIO_MONO:    TX audio to mono
  243.         QND_TX_AUDIO_STEREO:  TX audio to stereo
  244. Return Value:
  245.   None
  246. **********************************************************************/
  247. void QNF_SetAudioMono(UINT8 modemask, UINT8 mode)
  248. {
  249.     if (mode == QND_TX_AUDIO_MONO||mode == QND_RX_AUDIO_MONO)
  250.     {
  251.         // set to 22.5K (22.5/0.69 ~= 32)
  252.         QND_WriteReg(TX_FDEV, 0x20);
  253.     }
  254.     else
  255.     {
  256.         // back to default
  257.         QND_WriteReg(TX_FDEV, 0x6c);
  258.     }
  259.     QNF_SetRegBit(SYSTEM2,modemask, mode);
  260. }

  261. /**********************************************************************
  262. void QNF_UpdateRSSIn(UINT16 chFreq)
  263. **********************************************************************
  264. Description: update the qnd_RSSIns and qnd_RSSIn value              
  265. Parameters:
  266.     None
  267. Return Value:
  268.     None
  269. **********************************************************************/
  270. void  QNF_UpdateRSSIn(UINT16 chFreq)
  271. {
  272.     UINT8 i,j;
  273.     UINT8 r0;
  274.     UINT16 ch;

  275.     // backup SYSTEM1 register
  276.     r0 = QND_ReadReg(SYSTEM1);
  277.     if(!chFreq)
  278.     {
  279.         for (i = 0 ; i < QND_BAND_NUM; i++)
  280.         {
  281.             ch = QND_TXClearChannelScan(qnd_RSSInBB[i], qnd_RSSInBB[i+1]-qnd_StepTbl[qnd_CH_STEP], qnd_CH_STEP, 15);
  282.             qnd_RSSIn[i] = QND_GetRSSI(ch);
  283.             if (qnd_RSSIns > qnd_RSSIn[i])
  284.             {
  285.                 qnd_RSSIns = qnd_RSSIn[i];
  286.                 qnd_ClearChannel = ch;
  287.             }
  288.         }
  289.     }
  290.     else
  291.     {
  292.         i = QNF_GetRSSInBandIndex(chFreq);
  293.         ch = QND_TXClearChannelScan(qnd_RSSInBB[i], qnd_RSSInBB[i+1]-qnd_StepTbl[qnd_CH_STEP], qnd_CH_STEP, 15);
  294.         qnd_RSSIn[i] = QND_GetRSSI(ch);
  295.     }
  296.     // restore SYSTEM1 register
  297.     QND_WriteReg(SYSTEM1, r0);
  298. }

  299. /**********************************************************************
  300. int QND_Delay()
  301. **********************************************************************
  302. Description: Delay for some ms, to be customized according to user
  303.              application platform

  304. Parameters:
  305.         ms: ms counts
  306. Return Value:
  307.         None
  308.             
  309. **********************************************************************/
  310. void QND_Delay(UINT16 ms)
  311. {
  312.     UINT16 i,k;
  313.     for(i=0; i<3000;i++)
  314.     {   
  315.         for(k=0; k<ms; k++)
  316.         {

  317.         }
  318.     }
  319. }

  320. /**********************************************************************
  321. UINT8 QND_GetRSSI(UINT16 ch)
  322. **********************************************************************
  323. Description:    Get the RSSI value
  324. Parameters:
  325. Return Value:
  326. RSSI value  of the channel setted
  327. **********************************************************************/
  328. UINT8 QND_GetRSSI(UINT16 ch)
  329. {
  330.     UINT8 delayTime;
  331.     {
  332.         QND_SetSysMode(QND_MODE_RX|QND_MODE_FM);
  333.         delayTime = QND_READ_RSSI_DELAY;
  334.     }
  335.     QNF_SetCh(ch);
  336.     QNF_SetRegBit(SYSTEM1, CCA_CH_DIS, CCA_CH_DIS);   
  337.     QND_Delay(delayTime);
  338.     return QND_ReadReg(RSSISIG);  
  339. }

  340. /**********************************************************************
  341. void QN_ChipInitialization()
  342. **********************************************************************
  343. Description: chip first step initialization, called only by QND_Init()

  344. Parameters:
  345.     None
  346. Return Value:
  347.     None
  348. **********************************************************************/
  349. void QN_ChipInitialization()
  350. {
  351.     QND_WriteReg(0x01,0x89);  //sw reset
  352.     QND_WriteReg(0x50,0x00);
  353.     QND_WriteReg(0x01,0x49);  //recalibrate
  354.     QND_WriteReg(0x01,0x09);
  355.     QND_Delay(40);           //wait more than 400ms
  356.     QND_WriteReg(0x3C,0x89);  //for RDS SYNC
  357.     QNF_SetRegBit(0x49,0xc0, 0x00);
  358.     QND_WriteReg(0x4a,0xba);
  359.     QND_WriteReg(0x5c,0x05);
  360.     QND_WriteReg(0x52,0x0c);
  361.     QNF_SetRegBit(49,0x30,0x00); //minimize rxagc_timeout; WQF0717
  362.     QND_WriteReg(0x38,0x2d);  //for SNR CCA ccnclk2=2'b00
  363.     QND_WriteReg(0x39,0x88);  //for SNR CCA ccnclk1=2'b00
  364.     QND_WriteReg(0x52,0x0c);  //mute
  365.     QND_WriteReg(0x00,0x81);
  366.     QND_WriteReg(0x57,0x80);
  367.     QND_WriteReg(0x57,0x00);
  368.     QND_Delay(10);           //wait more than 100ms
  369.     QND_WriteReg(0x00,0x01);
  370.     QND_WriteReg(0x52,0x00);

  371.     QNF_SetRegBit(31,0x38,0x28);  //WQF0717
  372.     //WQF0717  
  373.     QND_WriteReg(HYSTERSIS, 0xff);
  374.     QND_WriteReg(MPSTART, 0x12);
  375.     QNF_SetRegBit(58,0xf,0xf);//set ccth11
  376. }

  377. /**********************************************************************
  378. void QND_LoadDefalutSetting(UINT8 country)
  379. **********************************************************************
  380. Description: load some defalut setting for a certain country
  381. Parameters:
  382.     country :
  383.     COUNTRY_CHINA: China
  384.     COUNTRY_USA: USA
  385.     COUNTRY_JAPAN: Japan (not supported yet)
  386. Return Value:
  387.     None
  388. **********************************************************************/
  389. void QND_LoadDefalutSetting(UINT8 country)
  390. {

  391.     switch(country)
  392.     {
  393.     case COUNTRY_CHINA:
  394.         break;
  395.     case COUNTRY_USA:
  396.         QND_ConfigFMModule(QND_CONFIG_AUDIOPEAK_DEV,75);
  397.         QND_ConfigFMModule(QND_CONFIG_PILOT_DEV,9);
  398.         QND_ConfigFMModule(QND_CONFIG_RDS_DEV,2);
  399.         QNF_SetRegBit(0x01,0x08,0x08);
  400.         QNF_SetRegBit(0x04,0x3f,0x3f);
  401.         QND_TXConfigAudio(QND_CONFIG_SOFTCLIP,1);
  402.         break;
  403.     case COUNTRY_JAPAN:
  404.         break;
  405.     default:
  406.         break;
  407.     }
  408. }

  409. /**********************************************************************
  410. int QND_Init()
  411. **********************************************************************
  412. Description: Initialize device to make it ready to have all functionality ready for use.

  413. Parameters:
  414.     None
  415. Return Value:
  416.     1: Device is ready to use.
  417.     0: Device is not ready to serve function.
  418. **********************************************************************/
  419. UINT8 QND_Init()
  420. {
  421.     QN_ChipInitialization();
  422.     QNF_SetMute(1);
  423.     QNF_InitRSSInBB();    // init band range
  424.     QND_WriteReg(0x00,  0x01); //resume original status of chip /* 2008 06 13 */
  425.     QNF_SetMute(0);
  426.     return 1;
  427. }

  428. /**********************************************************************
  429. void QND_SetSysMode(UINT16 mode)
  430. ***********************************************************************
  431. Description: Set device system mode(like: sleep ,wakeup etc)
  432. Parameters:
  433.     mode:  set the system mode , it will be set by  some macro define usually:
  434.    
  435.     SLEEP (added prefix: QND_MODE_, same as below):  set chip to sleep mode
  436.     WAKEUP: wake up chip
  437.     TX:     set chip work on TX mode
  438.     RX:     set chip work on RX mode
  439.     FM:     set chip work on FM mode
  440.     AM:     set chip work on AM mode
  441.     TX|FM:  set chip work on FM,TX mode
  442.     RX|AM;  set chip work on AM,RX mode
  443.     RX|FM:    set chip work on FM,RX mode
  444. Return Value:
  445.     None     
  446. **********************************************************************/
  447. void QND_SetSysMode(UINT16 mode)
  448. {   
  449.     UINT8 val;
  450.     switch(mode)        
  451.     {        
  452.     case QND_MODE_SLEEP:                       //set sleep mode        
  453.         qnd_PrevMode = QND_ReadReg(SYSTEM1);        
  454.         QNF_SetRegBit(SYSTEM1, R_TXRX_MASK, STNBY);         
  455.         break;        
  456.     case QND_MODE_WAKEUP:                      //set wakeup mode        
  457.         QND_WriteReg(SYSTEM1, qnd_PrevMode);        
  458.         break;        
  459.     case QND_MODE_DEFAULT:
  460.         QNF_SetRegBit(SYSTEM2,0x80,0x80);
  461.         break;
  462.     default:   
  463.             val = (UINT8)(mode >> 8);        
  464.             if (val)
  465.             {
  466.                     if(val == (QND_MODE_TX >> 8))
  467.                     {
  468.                         QND_WriteReg(73, 0x44);
  469.                     }
  470.                     else if(val == (QND_MODE_RX >> 8))
  471.                     {
  472.                         QND_WriteReg(73, 0x04);
  473.                     }                        
  474.                     // set to new mode if it's not same as old
  475.                     if((QND_ReadReg(SYSTEM1) & R_TXRX_MASK) != val)
  476.                     {
  477.                         QNF_SetMute(1);
  478.                         QNF_SetRegBit(SYSTEM1, R_TXRX_MASK, val);
  479.                         //   QNF_SetMute(0);
  480.                     }
  481.                     // make sure it's working on analog output
  482.                     QNF_SetRegBit(SYSTEM1, 0x08, 0x00);   
  483.             }   
  484.         break;        
  485.     }   
  486. }

  487. /**********************************************************************
  488. void QND_TuneToCH(UINT16 ch)
  489. **********************************************************************
  490. Description: Tune to the specific channel. call QND_SetSysMode() before
  491.     call this function
  492. Parameters:
  493.     ch
  494.     Set the frequency (10kHz) to be tuned,
  495.     eg: 101.30MHz will be set to 10130.
  496. Return Value:
  497.     None
  498. **********************************************************************/
  499. void QND_TuneToCH(UINT16 ch)
  500. {
  501.     UINT8 rssi;
  502.     UINT8 minrssi;

  503.     QNF_RXInit();

  504.     // if chip working on TX mode, just set CH
  505.     if(QND_ReadReg(SYSTEM1) & TXREQ)
  506.     {
  507.         QNF_SetRegBit(SYSTEM1, CCA_CH_DIS, CCA_CH_DIS);
  508.         QNF_SetCh(ch);   
  509.         return;
  510.     }
  511.     QNF_SetMute(1);
  512.     if ((ch - 7710) % 240 == 0)
  513.     {
  514.         QNF_SetRegBit(TXAGC_GAIN, IMR, IMR);
  515.     }
  516.     else
  517.     {
  518.         QNF_SetRegBit(TXAGC_GAIN, IMR, 0x00);
  519.     }
  520.     QNF_SetCh(ch);
  521.     QNF_SetRegBit(SYSTEM1, CCA_CH_DIS, CCA_CH_DIS);

  522.     //Free filter without RDS and Set filter 2 for Non-RDS
  523.     QNF_SetRegBit(GAIN_SEL,0x38,(QND_ReadReg(SYSTEM2) & 0x20) ? 0x00 : 0x28);
  524.     QNF_SetMute(0);
  525. }

  526. /**********************************************************************
  527. void QND_SetCountry(UINT8 country)
  528. ***********************************************************************
  529. Description: Set start, stop, step for RX and TX based on different
  530.              country
  531. Parameters:
  532. country:
  533. Set the chip used in specified country:
  534.     CHINA:
  535.     USA:
  536.     JAPAN:
  537. Return Value:
  538.     None     
  539. **********************************************************************/
  540. void QND_SetCountry(UINT8 country)
  541. {
  542.     qnd_Country = country;
  543.     switch(country)
  544.     {
  545.     case COUNTRY_CHINA:
  546.         qnd_CH_START = 7600;
  547.         qnd_CH_STOP = 10800;
  548.         qnd_CH_STEP = 1;
  549.         break;
  550.     case COUNTRY_USA:
  551.         qnd_CH_START = 8810;
  552.         qnd_CH_STOP = 10790;
  553.         qnd_CH_STEP = 2;
  554.         break;
  555.     case COUNTRY_JAPAN:
  556.         break;
  557.     }
  558. }

  559. /**********************************************************************
  560. void QND_UpdateRSSIn(UINT16 ch)
  561. **********************************************************************
  562. Description: in case of environment changed, we need to update RSSI noise floor
  563. Parameters:
  564.     None
  565. Return Value:
  566.     None
  567. **********************************************************************/
  568. void QND_UpdateRSSIn(UINT16 ch)
  569. {
  570.     UINT8 temp;
  571.     UINT8 v_abs;
  572.     if (qnd_FirstScan == 0 )
  573.     {
  574.         temp = QND_GetRSSI(qnd_ClearChannel);

  575.         if(temp > qnd_RSSIns)
  576.         {
  577.             v_abs = temp - qnd_RSSIns;
  578.         }
  579.         else
  580.         {
  581.             v_abs = qnd_RSSIns - temp;
  582.         }
  583.         if (v_abs< RSSINTHRESHOLD)
  584.         {
  585.             qnd_ClearScanFlag = 0;   
  586.         }
  587.         else
  588.         {
  589.             qnd_ClearScanFlag = 1;
  590.         }
  591.     }
  592.     if (qnd_ClearScanFlag||qnd_FirstScan||ch)
  593.     {
  594.         QNF_UpdateRSSIn(ch);
  595.         qnd_FirstScan = 0;
  596.     }
  597.     return;
  598. }

  599. /**********************************************************************
  600. void QND_ConfigFMModule(UINT8 optiontype, UINT8 option)
  601. ***********************************************************************
  602. Description: Config the FM modulation setting
  603. country
  604. Parameters:
  605.   optiontype:
  606.     QND_CONFIG_AUDIOPEAK_DEV : audio peak deviation
  607.     QND_CONFIG_PILOT_DEV:      pilot deviation
  608.     QND_CONFIG_RDS_DEV:        rds deviation  
  609.   option:
  610.     QND_CONFIG_AUDIOPEAK_DEV: 0~165khz
  611.     QND_CONFIG_PILOT_DEV:     8~10
  612.     QND_CONFIG_RDS_DEV:       1~7.5khz
  613. Return Value:
  614.     None     
  615. **********************************************************************/
  616. void QND_ConfigFMModule(UINT8 optiontype, UINT8 option)
  617. {
  618.     UINT8  tmp8;
  619.     UINT16 tmp16;
  620.     switch (optiontype)
  621.     {
  622.     case QND_CONFIG_AUDIOPEAK_DEV:
  623.         tmp16 = option*100;
  624.         tmp8  = tmp16/69;
  625.         QND_WriteReg(0x0e,tmp8);
  626.         break;
  627.     case QND_CONFIG_PILOT_DEV:
  628.         tmp8 = option<<2;
  629.         QNF_SetRegBit(0x0f,0x3c,tmp8);
  630.         break;
  631.     case QND_CONFIG_RDS_DEV:
  632.         tmp16 = option*100;
  633.         tmp8  = tmp16/35;
  634.         QNF_SetRegBit(0x18,0x7f,tmp8);
  635.         break;
  636.     default:
  637.         break;
  638.     }
  639. }

  640. /***********************************************************************
  641. Description: set call back function which can be called between seeking
  642. channel
  643. Parameters:
  644. func : the function will be called between seeking
  645. Return Value:
  646. None
  647. **********************************************************************/
  648. void QND_SetSeekCallBack(QND_SeekCallBack func)
  649. {
  650.     qnd_CallBackFunc = func;
  651. }

  652. /***********************************************************************
  653. UINT16 QND_RXSeekCH(UINT16 start, UINT16 stop, UINT16 step, UINT8 snr_th, UINT8 up);
  654. ***********************************************************************
  655. Description: Automatically scans the frequency range, and detects the
  656.                 first channel(AM or FM, it will be determine by the system mode which set
  657.                 by QND_SetSysMode).
  658.                 A threshold value needs to be passed in for channel detection.
  659. Parameters:
  660.         start
  661.                 Set the frequency (10kHz) where scan will be started,
  662.                 eg: 76.00MHz will be set to 7600.
  663.         stop
  664.                 Set the frequency (10kHz) where scan will be stopped,
  665.                 eg: 108.00MHz will be set to 10800.
  666.         step
  667.                 FM:
  668.                         QND_FMSTEP_100KHZ: set leap step to 100kHz
  669.                         QND_FMSTEP_200KHZ: set leap step to 200kHz
  670.                         QND_FMSTEP_50KHZ:  set leap step to 50kHz
  671.                 AM:
  672.                         QND_AMSTEP_***:
  673.         snr_th:
  674.                 Set threshold for quality of channel to be searched.
  675.         up:
  676.                 Set the seach direction :
  677.                         Up;0,seach from stop to start
  678.                         Up:1 seach from start to stop
  679. Return Value:
  680.   The channel frequency (unit: 10kHz)
  681.   -1: no channel found

  682. ***********************************************************************/
  683. UINT16 QND_RXSeekCH(UINT16 start, UINT16 stop, UINT8 step, UINT8 db, UINT8 up)
  684. {
  685.     UINT8 regValue;
  686.     UINT16 c, chfreq;
  687.     UINT16 ifcnt;
  688.     UINT8 savevalue;
  689.     UINT8 rssi,mprssi;
  690.     UINT8 scanFlag = 1;
  691.     UINT8 stepvalue;
  692.     UINT8 timeout = 0;
  693.     UINT8 pilot_snr;
  694.     UINT8 minrssi;
  695.     if (qnd_AutoScanAll == 0)
  696.     {
  697.         QNF_SetMute(1);
  698.         QNF_SetRegBit(GAIN_SEL,0x38,0x38);
  699.         QND_UpdateRSSIn(0);       
  700.     }
  701.     up=(start<stop) ? 1 : 0;
  702.     stepvalue = qnd_StepTbl[step];
  703.     do
  704.     {
  705.         minrssi = QNF_GetRSSIn(start);
  706.         QNF_SetCh(start);
  707.         c = start;
  708.         if ((c - 7710) % 240 == 0)
  709.         {                
  710.             QNF_SetRegBit(TXAGC_GAIN, IMR, IMR);
  711.         }
  712.         else
  713.         {
  714.             QNF_SetRegBit(TXAGC_GAIN, IMR, 0);
  715.         }       
  716.         QNF_SetRegBit(SYSTEM1,0xA1,0x81);
  717.         QND_Delay(10); //10ms delay
  718.         rssi = QND_ReadReg(RSSISIG);        //read RSSI
  719.         if (rssi > minrssi+6+db)
  720.         {       
  721.             QNF_ConfigScan(start, start, step);
  722.             QNM_SetRxThreshold(minrssi-22+db);
  723.             QNF_SetRegBit(SYSTEM1,0xA1,0xA0);
  724.             timeout = 0;
  725.             do
  726.             {
  727.                 QND_Delay(5);
  728.                 regValue = QND_ReadReg(SYSTEM1);
  729.                 timeout++;
  730.             }
  731.             while((regValue &CHSC)&&timeout < 200);
  732.             if (timeout < 200)
  733.             {
  734.                 regValue = QND_ReadReg(CCA5);
  735.                 ifcnt = regValue;
  736.                 regValue = QND_ReadReg(CCA4);
  737.                 ifcnt =(((ifcnt&0x1f)<<8)+regValue);
  738.                 if ((ifcnt < 2268) && (ifcnt > 1828))
  739.                 {
  740.                     if (rssi > minrssi + 20 + db)
  741.                     {
  742.                         scanFlag = 0;
  743.                     }
  744.                     else
  745.                     {
  746.                         QND_Delay(PILOT_READ_OUT_DELAY_TIME);
  747.                         pilot_snr = (QND_ReadReg(STATUS1) & 0x01) ? 0 : 1;   
  748.                         if (pilot_snr)
  749.                         {
  750.                             scanFlag = 0;
  751.                         }            
  752.                         else
  753.                         {
  754.                             QND_Delay(PILOT_SNR_READ_OUT_DELAY_TIME);
  755.                             pilot_snr = QND_ReadReg(SNR);  
  756.                             if (pilot_snr > 5 && pilot_snr < 55)
  757.                             {
  758.                                 scanFlag = 0;
  759.                             }
  760.                         }
  761.                     }
  762.                 }
  763.             }
  764.         }
  765.         chfreq = start;
  766.         if (scanFlag)
  767.         {
  768.             start = chfreq + (up ? stepvalue : -stepvalue);
  769.             if ((up && (stop < start)) || (!up && (start < stop)))
  770.             {
  771.                 scanFlag = 0;
  772.                 chfreq = 0;
  773.             }
  774.         }
  775.         else
  776.         {
  777.             if(qnd_CallBackFunc)
  778.                 qnd_CallBackFunc(chfreq, BAND_FM);
  779.         }
  780.     }
  781.     while (scanFlag != 0);

  782.     if (qnd_AutoScanAll == 0)
  783.     {
  784.         //Move the filter setting to TunetoChannel
  785.         //QNF_SetRegBit(32,0x08,0x08);
  786.         QND_TuneToCH((chfreq==0) ? stop: chfreq);
  787.     }
  788.     //QND_LOG("=== Done QND_AutoScan_FMChannel_One ===");
  789.     return chfreq;  
  790. }

  791. /**********************************************************************
  792. UINT8 QND_RXSeekCHAll(UINT16 start, UINT16 stop, UINT16 step, UINT8 db, UINT8 up)
  793. **********************************************************************
  794. Description:    Automatically scans the complete FM or AM band and detects
  795.             all the available  channels(AM or FM, it will be determine by
  796.             the workmode which set by QND_SetSysmode). A threshold value
  797.             needs to be passed in for the channel detection.
  798. Parameters:
  799.     start
  800.         Set the frequency (10kHz) where scan will be started,
  801.         eg: 76.00MHz will be set to 7600.
  802.     stop
  803.         Set the frequency (10kHz) where scan will be stopped,
  804.         eg: 108.00MHz will be set to 10800.
  805.     Step
  806.         FM:
  807.             QND_FMSTEP_100KHZ: set leap step to 100kHz
  808.             QND_FMSTEP_200KHZ: set leap step to 200kHz
  809.             QND_FMSTEP_50KHZ:  set leap step to 50kHz
  810.         AM:
  811.         QND_AMSTEP_***:
  812.     db
  813.         Set signal noise ratio for channel to be searched.
  814.     up:
  815.         Set the seach direction :
  816.         Up;0,seach from stop to start
  817.         Up:1 seach from start to stop

  818. Return Value:
  819.   The channel count found by this function
  820.   -1: no channel found
  821. **********************************************************************/
  822. UINT8 QND_RXSeekCHAll(UINT16 start, UINT16 stop, UINT8 step, UINT8 db, UINT8 up)
  823. {
  824.     UINT16 prevCh = 0;
  825.     //UINT16 chfreq;
  826.     UINT8  stepvalue;
  827.     UINT16 temp;
  828.     UINT16 pStart = start;
  829.     UINT16 pStop = stop > qnd_CH_STOP ? qnd_CH_STOP : stop;
  830.     QNF_SetMute(1);
  831.     up=(start<stop) ? 1 : 0;
  832.     qnd_AutoScanAll = 1;
  833.     stepvalue = qnd_StepTbl[step];
  834.     QNF_SetRegBit(GAIN_SEL,0x38,0x38);
  835.     {
  836.         QND_UpdateRSSIn(0);
  837.     }
  838.     qnd_ChCount = 0;
  839.     do
  840.     {  
  841.         temp = QND_RXSeekCH(pStart, pStop, step, db, up);
  842.         if (temp)
  843.         {
  844.             qnd_ChList[qnd_ChCount++] =temp;
  845.         }
  846.         else
  847.         {
  848.             temp = pStop;
  849.         }
  850.         {
  851.             pStart = temp + (up ? stepvalue : -stepvalue);
  852.         }
  853.     }
  854.     while((up ? (pStart<=pStop):(pStart>=pStop)) && (qnd_ChCount < QN_CCA_MAX_CH));

  855.     QND_TuneToCH((qnd_ChCount >= 1)? qnd_ChList[0] : pStop);
  856.     qnd_AutoScanAll = 0;
  857.     QNF_SetMute(0);
  858.     return qnd_ChCount;
  859. }

  860. /************************************************************************
  861. void QND_RXConfigAudio(UINT8 optiontype, UINT8 option )
  862. *************************************************************************
  863. Description: config audio
  864. Parameters:
  865.   optiontype: option
  866.     QND_CONFIG_MUTE; ‘option’control muteable, 0:mutedisable,1:mute enable
  867.     QND_CONFIG_MONO; ‘option’control mono, 0: QND_AUDIO_STEREO,1: QND_AUDIO_STEREO
  868.     QND_CONFIG_EQUALIZER: 'option' control the EQUALIZER,0:disable  EQUALIZER; 1: enable EQUALIZER;
  869.     QND_CONFIG_VOLUME: 'option' control the volume gain,range : 0~83(0: -65db, 65: 0db, 83: +18db
  870.     QND_CONFIG_BASS_QUALITY: 'option' set BASS quality factor,0: 1, 1: 1.25, 2: 1.5, 3: 2
  871.     QND_CONFIG_BASS_FREQ: 'option' set BASS central frequency,0: 60Hz, 1: 70Hz, 2: 80Hz, 3: 100Hz
  872.     QND_CONFIG_BASS_GAIN: 'option' set BASS control gain,range : 0x0~0x1e (00000 :-15db, 11110 :15db
  873.     QND_CONFIG_MID_QUALITY: 'option' set MID quality factor,0 :1, 1 :2
  874.     QND_CONFIG_MID_FREQ: 'option' set MID central frequency,0: 0.5KHz, 1: 1KHz, 2: 1.5KHz, 3: 2KHz
  875.     QND_CONFIG_MID_GAIN: 'option' set MID control gain,range : 0x0~0x1e (00000 :-15db, 11110 :15db)
  876.     QND_CONFIG_TREBLE_FREQ: 'option' set TREBLE central frequency,0: 10KHz, 1: 12.5KHz, 2: 15KHz, 3: 17.5KHz
  877.     QND_CONFIG_TREBLE_GAIN: 'option' set TREBLE control gain,range : 0x0~0x1e (00000 :-15db, 11110 :15db

  878. Return Value:
  879.     none
  880. **********************************************************************/
  881. void QND_RXConfigAudio(UINT8 optiontype, UINT8 option )
  882. {
  883.     switch(optiontype)
  884.     {
  885.     case QND_CONFIG_MONO:
  886.         if (option)
  887.             QNF_SetAudioMono(RX_MONO_MASK, QND_RX_AUDIO_MONO);
  888.         else
  889.             QNF_SetAudioMono(RX_MONO_MASK, QND_RX_AUDIO_STEREO);
  890.         break;
  891.     case QND_CONFIG_MUTE:
  892.         if (option)
  893.             QNF_SetMute(1);
  894.         else
  895.             QNF_SetMute(0);
  896.         break;

  897.     default:
  898.         break;
  899.     }
  900. }

  901. /**********************************************************************
  902. UINT16 QND_TXClearChannelScan(UINT16 start, UINT16 stop, UINT16 step,UINT8 db)
  903. **********************************************************************
  904. Description:    Clean channel scan. Finds the best clear channel for transmission.

  905. Parameters:
  906.   Start
  907.     Set the frequency (10kHz) where scan will be started,
  908.     eg: 7600 for 76.00MHz
  909.   Stop
  910.     Set the frequency (10kHz) where scan will be stopped,
  911.     eg: 10800 for 108.00MHz
  912.   Step
  913.     QND_FSTEP_100KHZ: Set leap step to 100kHz.
  914.     QND_FSTEP_200KHZ: Set leap step to 200kHz.
  915.     QND_FSTEP_50KHZ:  Set leap step to 50kHz.
  916.   db
  917.     Set threshold for quality of channel to be searched.
  918. Return Value:
  919.   The channel frequency (unit: 10kHz)
  920. **********************************************************************/
  921. UINT16 QND_TXClearChannelScan(UINT16 start, UINT16 stop, UINT8 step,UINT8 db)
  922. {
  923.     UINT8 regValue;
  924.     UINT16 chnFreq;
  925.     QNF_ConfigScan(start, stop, step);
  926.     QNF_SetRegBit(CCA, 0xe0, 0x20);  // set TXCCAAqn
  927.     {
  928.         QNF_SetRegBit(SYSTEM1, 0xe1, 0x60);   // &0xfe  |0x60
  929.     }
  930.     do{
  931.         QND_Delay(20);
  932.         regValue =QND_ReadReg(SYSTEM1);        
  933.     }while(regValue&0x20);
  934.     // suppose it's time to get right TX ch
  935.     chnFreq = QNF_GetCh();
  936.     QND_LOGB("BestChannel ",chnFreq);
  937.     return chnFreq;
  938. }

  939. /**********************************************************************
  940. UINT8 QND_TXSetPower( UINT8 gain)
  941. **********************************************************************
  942. Description:    Sets FM transmit power attenuation.

  943. Parameters:
  944.     gain: The transmission power attenuation value, for example,
  945.           setting the gain = 0x13, TX attenuation will be -6db
  946.           look up table see below
  947. BIT[5:4]
  948.             00    0db
  949.             01    -6db
  950.             10    -12db
  951.             11    -18db
  952. BIT[3:0]    unit: db
  953.             0000    124
  954.             0001    122.5
  955.             0010    121
  956.             0011    119.5
  957.             0100    118
  958.             0101    116.5
  959.             0110    115
  960.             0111    113.5
  961.             1000    112
  962.             1001    110.5
  963.             1010    109
  964.             1011    107.5
  965.             1100    106
  966.             1101    104.5
  967.             1110    103
  968.             1111    101.5
  969. for example:
  970.   0x2f,    //111111    89.5
  971.   0x2e,    //111110    91
  972.   0x2d,    //111101    92.5
  973.   0x2c,    //111100    94
  974.   0x1f,    //111011 95.5
  975.   0x1e,    //111010 97
  976.   0x1d,    //111001 98.5
  977.   0x1c,    //111000 100
  978.   0x0f,    //001111    101.5
  979.   0x0e,    //001110    103
  980.   0x0d,    //001101    104.5
  981.   0x0c,    //001100    106
  982.   0x0b,    //001011    107.5
  983.   0x0a,    //001010    109
  984.   0x09,    //001001    110.5
  985.   0x08,    //001000    112
  986.   0x07,    //000111    113.5
  987.   0x06,    //000110    115
  988.   0x05,    //000101    116.5
  989.   0x04,    //000100    118
  990.   0x03,    //000011    119.5
  991.   0x02,    //000010    121
  992.   0x01,    //000001    122.5
  993.   0x00     //000000    124
  994. **********************************************************************/
  995. void QND_TXSetPower( UINT8 gain)
  996. {
  997.     UINT8 value = 0;
  998.     value |= 0x40;  
  999.     value |= gain;
  1000.     QND_WriteReg(PAG_CAL, value);
  1001. }

  1002. /**********************************************************************
  1003. void QND_TXConfigAudio(UINT8 optiontype, UINT8 option )
  1004. **********************************************************************
  1005. Description: Config the TX audio (eg: volume,mute,etc)
  1006. Parameters:
  1007.   optiontype:option :
  1008.     QND_CONFIG_AUTOAGC:‘option'set auto AGC, 0:disable auto AGC,1:enable auto AGC.
  1009.     QND_CONFIG_SOFTCLIP;‘option’set softclip,0:disable soft clip, 1:enable softclip.
  1010.     QND_CONFIG_MONO;‘option’set mono,0: QND_AUDIO_STEREO, 1: QND_AUDIO_STEREO
  1011.     QND_CONFIG_AGCGAIN;‘option’set AGC gain, range:0000~1111
  1012. Return Value:
  1013.   none
  1014. **********************************************************************/
  1015. void QND_TXConfigAudio(UINT8 optiontype, UINT8 option )
  1016. {
  1017.     switch(optiontype)
  1018.     {
  1019.     case QND_CONFIG_MONO:
  1020.         if (option)
  1021.             QNF_SetAudioMono(0x10, QND_TX_AUDIO_MONO);
  1022.         else
  1023.             QNF_SetAudioMono(0x10, QND_TX_AUDIO_STEREO);
  1024.         break;

  1025.     case QND_CONFIG_MUTE:
  1026.         if (option)  
  1027.             QNF_SetRegBit(0x28, 0x18,0);
  1028.         else   
  1029.             QNF_SetRegBit(0x28, 0x18,0x18);
  1030.         break;
  1031.     case QND_CONFIG_SOFTCLIP:
  1032.         if (option)
  1033.             QNF_SetRegBit(TXAGC_GAIN,0x80, 0x80);
  1034.         else
  1035.             QNF_SetRegBit(TXAGC_GAIN,0x80, 0x00);
  1036.         break;

  1037.     case QND_CONFIG_AUTOAGC:
  1038.         if (option)
  1039.             QNF_SetRegBit(TXAGC_GAIN,0x40,0);
  1040.         else
  1041.             QNF_SetRegBit(TXAGC_GAIN,0x41,0x41);
  1042.         break;
  1043.     case QND_CONFIG_AGCGAIN:
  1044.         QNF_SetRegBit(TXAGC_GAIN, 0x1f,option);
  1045.         break;
  1046.     default:
  1047.         break;
  1048.     }
  1049. }

  1050. /**********************************************************************
  1051. UINT8 QND_RDSEnable(UINT8 mode)
  1052. **********************************************************************
  1053. Description: Enable or disable chip to work with RDS related functions.
  1054. Parameters:
  1055.           on: QND_RDS_ON:  Enable chip to receive/transmit RDS data.
  1056.                 QND_RDS_OFF: Disable chip to receive/transmit RDS data.
  1057. Return Value:
  1058.            QND_SUCCESS: function executed
  1059. **********************************************************************/
  1060. UINT8 QND_RDSEnable(UINT8 on)
  1061. {
  1062.     UINT8 val;

  1063.     QND_LOG("=== QND_SetRDSMode === ");
  1064.     // get last setting
  1065.     val = QND_ReadReg(SYSTEM1);
  1066.     if (on == QND_RDS_ON)
  1067.     {
  1068.         val |= RDSEN;
  1069.         // if RDS enabled, channel conditional filter is auto selected
  1070.         QNF_SetRegBit(GAIN_SEL,0x08,0x00);
  1071.     }
  1072.     else if (on == QND_RDS_OFF)
  1073.     {
  1074.         val &= ~RDSEN;
  1075.         // if RDS disabled, channel conditional filter is set to filter 2
  1076.         QNF_SetRegBit(GAIN_SEL,0x38,0x28);
  1077.     }
  1078.     else
  1079.     {
  1080.         return 0;
  1081.     }
  1082.     QND_WriteReg(SYSTEM1, val);
  1083.     return 1;
  1084. }

  1085. /**********************************************************************
  1086. UINT8 QND_DetectRDSSignal(void)
  1087. **********************************************************************
  1088. Description: detect the RDSS signal .

  1089. Parameters:
  1090.     None
  1091. Return Value:
  1092.     the value of STATUS3
  1093. **********************************************************************/
  1094. UINT8 QND_RDSDetectSignal(void)
  1095. {
  1096.     UINT8 val = QND_ReadReg(STATUS3);   
  1097.     return val;
  1098. }

  1099. /**********************************************************************
  1100. void QND_RDSLoadData(UINT8 *rdsRawData, UINT8 upload)
  1101. **********************************************************************
  1102. Description: Load (TX) or unload (RX) RDS data to on-chip RDS buffer.
  1103.              Before calling this function, always make sure to call the
  1104.              QND_RDSBufferReady function to check that the RDS is capable
  1105.              to load/unload RDS data.
  1106. Parameters:
  1107.   rdsRawData :
  1108.     8 bytes data buffer to load (on TX mode) or unload (on RXmode)
  1109.     to chip RDS buffer.
  1110.   Upload:   
  1111.     1-upload
  1112.     0--download
  1113. Return Value:
  1114.     QND_SUCCESS: rds data loaded to/from chip
  1115. **********************************************************************/
  1116. void QND_RDSLoadData(UINT8 *rdsRawData, UINT8 upload)
  1117. {
  1118.     UINT8 i;
  1119.     UINT8 temp;
  1120.     if (upload)
  1121.     {       //TX MODE
  1122.         for (i = 0; i <= 7; i++)
  1123.         {
  1124.             QND_WriteReg(RDSD0 + i, rdsRawData[i]);
  1125.         }   
  1126.     }
  1127.     else
  1128.     {
  1129.         //RX MODE
  1130.         for (i = 0; i <= 7; i++)
  1131.         {
  1132.             temp = QND_ReadReg(RDSD0 + i);
  1133.             rdsRawData[i] = temp;
  1134.         }
  1135.     }
  1136. }

  1137. /**********************************************************************
  1138. UINT8 QND_RDSCheckBufferReady(void)
  1139. **********************************************************************
  1140. Description: Check chip RDS register buffer status before doing load/unload of
  1141. RDS data.

  1142. Parameters:
  1143.     None
  1144. Return Value:
  1145.     QND_RDS_BUFFER_NOT_READY: RDS register buffer is not ready to use.
  1146.     QND_RDS_BUFFER_READY: RDS register buffer is ready to use. You can now
  1147.     load (for TX) or unload (for RX) data from/to RDS buffer
  1148. **********************************************************************/
  1149. UINT8 QND_RDSCheckBufferReady(void)
  1150. {
  1151.     UINT8 val;
  1152.     UINT8 rdsUpdated;
  1153.     rdsUpdated = QND_ReadReg(STATUS3);
  1154.     if (QND_ReadReg(SYSTEM1) & TXREQ)
  1155.     {      
  1156.         //TX MODE
  1157.         QND_WriteReg(SYSTEM2,QND_ReadReg(SYSTEM2)^RDSTXRDY);  
  1158.         return QND_RDS_BUFFER_READY;
  1159.     }
  1160.     do {
  1161.         val = QND_ReadReg(STATUS3)^rdsUpdated;      
  1162.     }while(!(val&RDS_RXUPD)) ;
  1163.     return QND_RDS_BUFFER_READY;
  1164. }

复制代码


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

使用道具 举报

沙发
ID:79034 发表于 2017-5-23 19:08 | 只看该作者
楼主有没51现成试过能用的例程啊?新手。这个不知道怎么改啊。
回复

使用道具 举报

板凳
ID:228360 发表于 2017-10-30 11:10 | 只看该作者
很不错,谢谢分享。
回复

使用道具 举报

地板
ID:338360 发表于 2018-8-31 15:36 | 只看该作者
不错不错,谢谢分享
回复

使用道具 举报

5#
ID:338360 发表于 2018-9-3 08:40 | 只看该作者
下来参考一下,刚有项目要用8027
回复

使用道具 举报

6#
ID:44267 发表于 2018-10-24 19:31 | 只看该作者
请问楼主这个有实物成功了嘛
回复

使用道具 举报

7#
ID:28367 发表于 2019-3-1 10:06 | 只看该作者
很详细,谢谢楼主分享
回复

使用道具 举报

8#
ID:535790 发表于 2020-3-19 22:15 | 只看该作者
学习一下
回复

使用道具 举报

9#
ID:568565 发表于 2020-5-9 15:16 | 只看该作者
51的驱动放进去以后空间都不够用了
回复

使用道具 举报

10#
ID:334128 发表于 2023-6-23 21:31 | 只看该作者
正在找此芯片资料,谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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