FmTEA5767.c
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:19k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. /*==========================================================================
  2. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  3. File: Fm.c
  4. content: 
  5. History: Created by David Chiu 2004/4/27
  6. ==========================================================================*/
  7. #define _FM_TEA5767_H_
  8. #include "TypeDef.h"
  9. #include "Const.h"
  10. #include "Reg5661.h"
  11. #if(FM_MODULE==0) //Walace060126#2
  12. #include "Common.h"
  13. #include "UiFm.h"  //just for UiDisplayCtrl
  14. #include "I2C.h"
  15. #include "FmTEA5767.h" 
  16. //Ren050312#1
  17. #include "ExtCodec.h"
  18. #include "IntCodec.h"
  19. //Walace060126#2 start
  20. #define FM_GET_ADC_LEVEL 0xF0
  21. #define FM_GET_IF 0x7F
  22. #define FM_SEARCH_FINISH 0x80
  23. #define FM_SEARCH_BAND 0x40
  24. #define FM_CMD_MUTE_EN 0x80
  25. #define FM_CMD_MUTE_DIS 0x7F
  26. #define FM_CMD_SEARCH_EN 0x40
  27. #define FM_CMD_SEARCH_DIS 0xBF
  28. #define FM_CMD_STANDBY_EN 0x40
  29. #define FM_CMD_STANDBY_DIS 0xBF
  30. #define FM_CMD_STOP_HIGH 0x60
  31. #define FM_CMD_STOP_MID 0x40
  32. #define FM_CMD_STOP_LOW 0x20
  33. #define FM_HI_INJECTION_EN 0x10
  34. #define FM_LO_INJECTION_ENJ 0xEF
  35. #define FM_FORCE_MONO 0x08 //Walace060217#1
  36. #define FM_NEXT_STOP_LEVEL 0x20
  37. #define FM_STERO_EN 0x80
  38. //Walace060126#2 end
  39. BOOL gfHILOInjection;
  40. XBYTE gxbFmWriteData[5];
  41. XBYTE gxbFmReadData[5];
  42. //Walace060126#2 end
  43.  
  44. BOOL TEA5767Write(void);
  45. BOOL TEA5767Read(void);
  46. WORD CalculatePLL(WORD wfrequency);
  47. WORD ConvertPLL(WORD wPll);
  48. BOOL IsValidStop(void)large;
  49. //Dennis Shih 20060309
  50. //Dino050812
  51. void FMHiLoCheck(void) large;
  52. /*
  53. EXTERN API BOOL gfStereoSet; //Walace060217#1
  54. EXTERN API BOOL gfRealStereo;
  55. */
  56. /*
  57. *--------------------------------------------------------------------------
  58. Desciption:
  59. Initial setting of FM Module
  60. Arguments:
  61. void
  62. Global arguments:
  63. gxwFmFreq=Default FM Freq
  64. Returns:
  65. void
  66. --------------------------------------------------------------------------*/
  67. #if (_PM_FM_|_PM_MPTEST_)
  68. API bit TEA5767_FmInit(void)
  69. {
  70. //David 041106#2
  71. /*
  72. obDCVARRD=0x0A; //DCV Addr 0x0A
  73. obDCVWRDATA=0x72; //Set 0x72
  74. obDCVARRD=0x09; //DCV Addr 0x09
  75. obDCVWRDATA=0x74; //Set 0x74
  76. */
  77. obGPIOEDAT &=0xBF; //Power on FM //David 041106#1
  78. // Data Init...
  79. //FmDataInit(); //Vicky050311#3 //Walace060126#2
  80. TEA5767_FmDataInit(); //Vicky050311#3 //Walace060126#2
  81. I2cInit();
  82. obI2CCLKDIV = 7; // Set I2C Serial Port Clock for FM
  83. I2cWaitBusy();
  84. //return FmSetFreq(); //Walace060126#2
  85. return TEA5767_FmSetFreq();
  86. }
  87. //Vicky050311#3
  88. API void TEA5767_FmDataInit(void)
  89. {
  90. BYTE bI;
  91. for(bI=0;bI<5;bI++)
  92. {
  93. gxbFmReadData[bI]=0;
  94. gxbFmWriteData[bI]=0;
  95. }
  96. gfHILOInjection=FM_LO_INJEC;
  97. gxbFmWriteData[2]=0x00;//low injection ,stereo on,left not muted,right not muted,SW port1 low
  98. gxbFmWriteData[3]=0x1e;//SW port2 low,standby off,US/Europe FM band limit,xtal=32.768kHz,Soft-mute on,HCC on,SNC on,pin 14 is SW port1;
  99. gxbFmWriteData[4]=0x80;//6.5kHz reference for PLL  enable,Deemphasis time const is 50us
  100. }
  101. #endif
  102. #if (_PM_FM_|_PM_MPTEST_)
  103. /*--------------------------------------------------------------------------
  104. Desciption:
  105. Write 5 bytes to TEA5767HN chip ,no subaddress byte is needed
  106. Arguments:
  107. void
  108. Global arguments:
  109. xbFmWriteData[]: Data write to TEA5767 chip
  110. Returns:
  111. TRUE or FALSE
  112. --------------------------------------------------------------------------*/
  113. BOOL TEA5767Write(void)
  114. {
  115. BYTE bI;
  116. obCLKI2CMCTRL |= 0x80; //clock Enable //Renshuo050322#A
  117. obMODSEL2 |= 0x08; //I2CM Enable
  118. obI2CMAADDR = FM_TEA5767;
  119. obI2CSLADDR = gxbFmWriteData[0];
  120. for(bI=1;bI<5;bI++)
  121. obI2CFIFO = gxbFmWriteData[bI];
  122. obI2CMACMD = (I2C_CMD_SINGLE | I2C_CMD_CURRENT | I2C_CMD_WRITE_MODE | I2C_CMD_DATA_LEN(4));
  123. //Renshuo050322#A      
  124. bI = I2cWaitBusy();  
  125. obMODSEL2 &= 0xF7; //I2CM Disable
  126. obCLKI2CMCTRL &= 0x7F; //clock Disable
  127. return bI;
  128. }
  129. #endif // (_PM_FM_|_PM_MPTEST_)
  130. #if (_PM_FM_|_PM_MPTEST_)
  131. /*--------------------------------------------------------------------------
  132. Desciption:
  133. Read 5 bytes from TEA5767HN chip ,no subaddress byte is needed
  134. Arguments:
  135. void
  136. Global arguments:
  137. void
  138. Returns:
  139. TRUE or FALSE
  140. --------------------------------------------------------------------------*/
  141. BOOL TEA5767Read(void)
  142. {
  143. BYTE bI;
  144. //Renshuo050322#A    
  145. obCLKI2CMCTRL |= 0x80; //clock Enable
  146. obMODSEL2 |= 0x08; //I2CM Enable
  147. obI2CMAADDR = FM_TEA5767;
  148. obI2CMACMD = ( I2C_CMD_SINGLE | I2C_CMD_CURRENT | I2C_CMD_READ_MODE | I2C_CMD_DATA_LEN(5));
  149. if(I2cWaitBusy())
  150. {
  151. for(bI=0;bI<5;bI++)
  152. gxbFmReadData[bI]=obI2CFIFO;
  153. //Renshuo050322#A    
  154. obCLKI2CMCTRL |= 0x80; //clock Enable
  155. obMODSEL2 |= 0x08; //I2CM Enable
  156. return TRUE;
  157. }
  158. else
  159. {
  160. obCLKI2CMCTRL |= 0x80; //clock Enable
  161. obMODSEL2 |= 0x08; //I2CM Enable
  162. return FALSE;
  163. }
  164. }
  165. #endif // (_PM_FM_|_PM_MPTEST_)
  166. #if (_PM_FM_|_PM_MPTEST_)
  167. /*--------------------------------------------------------------------------
  168. Desciption:
  169. Converts frequency to PLL value in condition of "HILO injection" = 1 
  170. Arguments:
  171. xwfrequency: the frequency based on 100KHz (ex: 963 = 96.3 MHz)
  172. Global arguments:
  173. void
  174. Returns:
  175. The value of PLL 
  176. --------------------------------------------------------------------------*/
  177. WORD CalculatePLL(WORD wfrequency)
  178. {
  179. #if(FM_STEP_100K) //Dennis060517#1 start
  180. if (gfHILOInjection)
  181. return (WORD)( (( (DWORD)wfrequency*100000)+225000)>>13);//HILO injection=1
  182. else
  183. return (WORD)( (( (DWORD)wfrequency*100000)-225000)>>13);//HILO injection=0
  184. #else
  185. if (gfHILOInjection)
  186. return (WORD)( (( (DWORD)wfrequency*10000)+225000)>>13);//HILO injection=1
  187. else
  188. return (WORD)( (( (DWORD)wfrequency*10000)-225000)>>13);//HILO injection=0
  189. #endif //Dennis060517#1 end
  190. }
  191. #endif
  192. #if (_PM_FM_)
  193. /*--------------------------------------------------------------------------
  194. Desciption:
  195. Converts PLL value to frequency in condition of "HILO injection" = 1
  196. Arguments:
  197. wPll: The PLL value
  198. Global arguments:
  199. void
  200. Returns:
  201. The frequency 
  202. --------------------------------------------------------------------------*/
  203. WORD ConvertPLL(WORD wPll)
  204. {
  205. #if(FM_STEP_100K) //Dennis060517#1 start
  206. if(gfHILOInjection)
  207. return (((((DWORD)wPll<<13)-225000)/100000)+1); // HILo injection=1;
  208. else
  209. return (((((DWORD)wPll<<13)+225000)/100000)+1);// HILo injection=0;
  210. #else 
  211. if(gfHILOInjection)
  212. return (((((DWORD)wPll<<13)-225000)/10000)+10); // HILo injection=1;
  213. else
  214. return (((((DWORD)wPll<<13)+225000)/10000)+10);// HILo injection=0;
  215. #endif //Dennis060517#1 end
  216. }
  217. #endif // (_PM_FM_)
  218. #if (_PM_FM_|_PM_MPTEST_)
  219. /*--------------------------------------------------------------------------
  220. Desciption:
  221. Set FM IC's PLL by "gxwFmFreq"
  222. Arguments:
  223. void
  224. Global arguments:
  225. gxwFmFreq : FM frequency based on 100KHz
  226. Returns:
  227. TRUE: Set Freq successful
  228. FALSE: Busy time out or Nack error
  229. --------------------------------------------------------------------------*/
  230. API bit TEA5767_FmSetFreq(void)
  231. {
  232. XWORD xwPLL;
  233. xwPLL=CalculatePLL(gxwFmFreq);
  234. if (gfHILOInjection)
  235. gxbFmWriteData[2] |= FM_HI_INJECTION_EN;
  236. else
  237. gxbFmWriteData[2] &= FM_LO_INJECTION_ENJ;
  238. gxbFmWriteData[0]=((xwPLL>>8) & FM_CMD_MUTE_DIS) & FM_CMD_SEARCH_DIS; //not mute and not in search mode
  239.        gxbFmWriteData[1]=xwPLL ;    
  240. TEA5767Write();
  241. return TRUE;
  242. }
  243. #endif //_PM_FM_|_PM_MPTEST_
  244. #if (_PM_FM_)
  245. /*--------------------------------------------------------------------------
  246. Desciption:
  247. Set FM in mute mode, this function will set frequ, too.
  248. If You want to unmute, just call FmSetFreq
  249. Arguments:
  250. void
  251. Global arguments:
  252. gxwFmFreq : FM frequency based on 100KHz
  253. Returns:
  254. void
  255. --------------------------------------------------------------------------*/
  256. API void TEA5767_FmSetMute(void)
  257. {
  258. XWORD xwPLL;
  259. xwPLL=CalculatePLL(gxwFmFreq);
  260. if (gfHILOInjection)
  261. gxbFmWriteData[2] |= FM_HI_INJECTION_EN;
  262. else
  263. gxbFmWriteData[2] &= FM_LO_INJECTION_ENJ;
  264. gxbFmWriteData[0]=((xwPLL>>8) | FM_CMD_MUTE_EN) & FM_CMD_SEARCH_DIS; //mute and not in search mode
  265. gxbFmWriteData[1]=xwPLL ;
  266.    
  267. TEA5767Write();
  268. }
  269. #endif  // (_PM_FM_)
  270. #if (_PM_FM_)
  271. /*--------------------------------------------------------------------------
  272. Desciption:
  273. Stop FM Module, set IC mute and standby
  274. Arguments:
  275. void
  276. Global arguments:
  277. void
  278. Returns:
  279. void
  280. --------------------------------------------------------------------------*/
  281. API void TEA5767_FmEnd(void)
  282. {
  283. gxbFmWriteData[0] |= FM_CMD_MUTE_EN;
  284. gxbFmWriteData[3] |= FM_CMD_STANDBY_EN;
  285. TEA5767Write();
  286. ClkI2CmDis();
  287. ClkCdcEn(); //2004.11.16 Renshuo
  288. //obALGPAREG |= 0x04; //power down PDY
  289. //obALGPAREG |= 0x01; //power down PD
  290. //obALGPAREG |= 0x02; //power down PDX
  291. #if(!EXT_ADC | !EXT_DAC | !EXT_PA)
  292. //Renshuo050322#A    
  293. IntCdcPowerDownPa(); //Renshuo041207#A //Ren050312#1
  294. #endif
  295. ClkCdcDis();
  296. gfCdcAlreadyInit = FALSE; /*2004.11.17 Renshuo add*/
  297. obGPIOEDAT |=0x40; //Power down FM //David 041106#1
  298. //David 041106#2
  299. /*
  300. // restore dvc value
  301. obDCVARRD=0x0A; //DCV Addr 0x0A
  302. obDCVWRDATA=0x42; //Set 0x42
  303. obDCVARRD=0x09; //DCV Addr 0x09
  304. obDCVWRDATA=0x07; //Set 0x07
  305. */
  306. }
  307. #endif // (_PM_FM_)
  308. API void  TEA5767_FmSetStereo(BOOL fStereo) //Walace060217#1
  309. {
  310. if(fStereo) //Dennis060309#1
  311. gxbFmWriteData[2] &=(~FM_FORCE_MONO); //Dennis Shih 2006/03/10
  312. else
  313. gxbFmWriteData[2] |=FM_FORCE_MONO; //Dennis Shih 2006/03/10
  314. TEA5767Write();
  315. }
  316. #if (_PM_FM_)
  317. /*--------------------------------------------------------------------------
  318. Desciption:
  319. check Fm is stereo or mono
  320. Arguments:
  321. void
  322. Global arguments:
  323. void
  324. Returns:
  325. TRUE:Stereo
  326. FALSE:MONO
  327. --------------------------------------------------------------------------*/
  328. API bit TEA5767_FmCheckStereo(void)
  329. {
  330. TEA5767Read();
  331. if(gxbFmReadData[2]&FM_STERO_EN)
  332. return TRUE;
  333. else
  334. return FALSE;
  335. }
  336. #endif //(_PM_FM_)
  337. #if (_PM_FM_)
  338. /*--------------------------------------------------------------------------
  339. Desciption:
  340. Search Up/Down from currently frequency
  341. Arguments:
  342. fSearchUp 1: Up 0: Down
  343. bStopLevel
  344. Global arguments:
  345. void
  346. Returns:
  347. TRUE: A station is found
  348. FALSE:Reach the band limit
  349. --------------------------------------------------------------------------*/
  350. //BOOL TEA5767_FmSearch(BOOL fSearchUp) 
  351. #if(USE_CHIP_AUTO_SEARCH) //Walace060829#4
  352. BOOL TEA5767_FmSearch(BYTE fSearchUp) reentrant //Tne051228#reentrant
  353. {
  354. //-----------------------For TEA5767--------------------------
  355. BYTE xbLevelHigh,xbLevelLow;
  356. WORD xwPLL,xwPreFreq,xwTimeOut2;
  357. DWORD xdwTimeOut1;
  358. WORD xwDifFreq;
  359. BYTE xbNowStopLevel;
  360. BYTE xbRetry=0;
  361. xbNowStopLevel=FM_CMD_STOP_LOW; // Use Low Level for search default
  362. xdwTimeOut1=0x7FFFFFFF;
  363. while(1)
  364. {
  365. xwPreFreq = gxwFmFreq;
  366. xwPLL = CalculatePLL(gxwFmFreq);
  367. gxbFmWriteData[0] = ((BYTE)(xwPLL>>8) | FM_CMD_SEARCH_EN | FM_CMD_MUTE_EN);
  368. gxbFmWriteData[1] = (BYTE)xwPLL;
  369. gxbFmWriteData[2] = (((BYTE)fSearchUp)<<7) | xbNowStopLevel;
  370. TEA5767Write(); //Start Search
  371. xdwTimeOut1--;
  372. if(xdwTimeOut1==0) 
  373. return FALSE; // TimeOut
  374. xwTimeOut2=0xFFFF;
  375. do
  376. {
  377. UiDispCtrl(UI_FM_SEARCHING); //show searching message
  378. if(!TEA5767Read()) return FALSE;
  379. xwTimeOut2--;
  380. if(xwTimeOut2==0) return FALSE; //Time Out
  381. }
  382. while((gxbFmReadData[0]&FM_SEARCH_FINISH)==FALSE); //wait search finish
  383. if(gxbFmReadData[0]&FM_SEARCH_BAND) //Reach the band limit
  384. return (FALSE);
  385. //applying searching algorithm here
  386. xwPLL=((WORD)(gxbFmReadData[0] & 0x3f))<<8;
  387. xwPLL|=gxbFmReadData[1];
  388. gxwFmFreq=ConvertPLL(xwPLL);
  389. if( (xwPreFreq==gxwFmFreq ) )
  390. {
  391. if(fSearchUp)
  392. gxwFmFreq++;
  393. else
  394. gxwFmFreq--;
  395. }
  396. else
  397. {
  398. if(xbNowStopLevel==FM_CMD_STOP_HIGH) // STOP Level High...No more high
  399. {
  400. if (IsValidStop())
  401. break;
  402. }
  403. else
  404. {
  405. if(fSearchUp)
  406. xwDifFreq=(gxwFmFreq-xwPreFreq);
  407. else
  408. xwDifFreq=(xwPreFreq-gxwFmFreq);
  409. if(xwDifFreq==1)
  410. {
  411. xbRetry++;
  412. if(xbRetry>=3)
  413. {
  414. xbNowStopLevel += FM_NEXT_STOP_LEVEL; // Try Next stop Level
  415. xbRetry=0;
  416. }
  417. }
  418. else
  419. {
  420. if (IsValidStop())
  421. break;
  422. }
  423. }
  424. }
  425. }//while loop
  426. if(gfHILOInjection)
  427. xwPLL+=0x3d;
  428. else
  429. xwPLL+=0x30;
  430. //starting to set HILO to optimal level
  431. gxbFmWriteData[0]=(xwPLL>>8) & FM_CMD_SEARCH_DIS; //stop search mode
  432. gxbFmWriteData[1]=xwPLL ;
  433. TEA5767Write();
  434. TEA5767Read();
  435. xbLevelHigh=(gxbFmReadData[3] & FM_GET_ADC_LEVEL);
  436. if(gfHILOInjection)
  437. xwPLL-=0x7a;
  438. else
  439. xwPLL-=0x60;
  440. gxbFmWriteData[0]=(xwPLL>>8) & FM_CMD_SEARCH_DIS;
  441.     gxbFmWriteData[1]=xwPLL ;
  442. TEA5767Write();
  443. TEA5767Read();
  444. xbLevelLow=(gxbFmReadData[3] & FM_GET_ADC_LEVEL);
  445. if (xbLevelHigh<xbLevelLow)
  446. gfHILOInjection=TRUE; //high injection
  447. else
  448. gfHILOInjection=FALSE; //low injection
  449. //FmSetFreq();
  450. return TRUE;
  451. }
  452. #else //Walace060829#4 start
  453. API BYTE FmCheckLevel(void)
  454. {
  455. TEA5767Read();
  456. return (gxbFmReadData[3] & FM_GET_ADC_LEVEL)>>4;
  457. }
  458. BOOL TEA5767_FmSearch(BYTE fSearchUp) reentrant //Tne051228#reentrant
  459. {
  460. WORD wDelay,xwPLL;
  461. BYTE xbIFCounter;
  462. BYTE xbStreo;
  463. BYTE bI;
  464. BYTE bKey;
  465. BYTE bTemp,bLevel;
  466. while(1)
  467. {
  468.      bTemp=0;
  469. //KeyGet(bKey); //Walace060829#4
  470. //if((bKey == KEY_LEFT_BREAK)||(bKey == KEY_RIGHT_BREAK))
  471. // return FALSE;
  472. if(fSearchUp)
  473. {
  474. gxwFmFreq++;
  475. if(gxwFmFreq>FM_FREQ_MAX)
  476. {
  477. gxwFmFreq=FM_FREQ_MAX;
  478. return FALSE;
  479. }
  480. }
  481. else
  482. {
  483. gxwFmFreq--;
  484. if(gxwFmFreq<FM_FREQ_MIN)
  485. {
  486. gxwFmFreq=FM_FREQ_MIN;
  487. return FALSE;
  488. }
  489. }
  490. //UiShowFreq();    
  491. //UiShowScrollPreset();    
  492. UiDispCtrl(UI_FM_SEARCHING); //Walace060829#4
  493. xwPLL=CalculatePLL(gxwFmFreq);
  494. if (gfHILOInjection)
  495. gxbFmWriteData[2] |= FM_HI_INJECTION_EN;
  496. else
  497. gxbFmWriteData[2] &= FM_LO_INJECTION_ENJ;
  498. gxbFmWriteData[0]=((xwPLL>>8) & FM_CMD_MUTE_DIS) & FM_CMD_SEARCH_DIS; //not mute and not in search mode
  499.     gxbFmWriteData[1]=xwPLL ;
  500. TEA5767Write();
  501. wDelay=0;
  502. while(++wDelay<30000);
  503. wDelay=0;
  504. while(++wDelay<30000);
  505. bLevel = FmCheckLevel();
  506.  
  507. for(bI=0;bI<15;bI++)
  508. {
  509. TEA5767Read();
  510. xbIFCounter = gxbFmReadData[2] & FM_GET_IF;
  511. xbStreo=gxbFmReadData[2]&FM_STERO_EN;
  512. if(xbStreo)
  513. {
  514.     bTemp++;
  515. if((xbIFCounter>=0x35)&(xbIFCounter<0x3e)&(bTemp>10)&(bLevel>=2))
  516. //if((xbIFCounter>=0x37)&(xbIFCounter<0x3e)&(bTemp>12)&(bLevel>=4))
  517. {
  518.       bTemp=0;
  519. TEA5767Write();
  520. return TRUE;
  521. }
  522. }
  523. wDelay=0;
  524. while(++wDelay<800);
  525. }
  526. }
  527. }
  528. #endif //#if(USE_CHIP_AUTO_SEARCH)
  529. //Walace060829#4 end
  530. #endif // (_PM_FM_)
  531. #if (_PM_FM_|_PM_MPTEST_)
  532. /*--------------------------------------------------------------------------
  533. Desciption:
  534. Checking frequency searching stopped value is valid or not 
  535. Arguments:
  536. void
  537. Global arguments:
  538. void
  539. Returns:
  540. TRUE: Valid
  541. FALSE:Invalid
  542. --------------------------------------------------------------------------*/
  543. BOOL IsValidStop(void) large
  544. {
  545. //Dennis Shih 20060309 start
  546. XBYTE xbLevel1,xbIFCounter;
  547. TEA5767Read();
  548. xbLevel1 = (gxbFmReadData[3] & FM_GET_ADC_LEVEL)>>4;
  549. xbIFCounter = gxbFmReadData[2] & FM_GET_IF;
  550. //if (!(  (xbLevel1>5) & (0x30<xbIFCounter)  & (xbIFCounter<0x5f)))
  551. if (!(  (xbLevel1>3) & (0x32<xbIFCounter)  & (xbIFCounter<0x3b)))
  552. return (FALSE);
  553. else 
  554. return TRUE;
  555. /*
  556. XBYTE xbLevel1,xbLevel2,xbIFCounter;
  557. #define xbLevelDiff xbLevel2
  558. if (!(  (xbLevel1>5) & (0x31<xbIFCounter)  & (xbIFCounter<0x3a) ))
  559. return (FALSE);
  560. else 
  561. return TRUE;
  562. if (gfHILOInjection)
  563. gxbFmWriteData[2] &= FM_LO_INJECTION_ENJ; //hi toggle to lo
  564. else
  565. gxbFmWriteData[2] |= FM_HI_INJECTION_EN; //lo toggle to high
  566. TEA5767Write();
  567. TEA5767Read();
  568. xbLevel2 = (gxbFmReadData[3] & FM_GET_ADC_LEVEL)>>4; //measure level2
  569. xbIFCounter = gxbFmReadData[2] & FM_GET_IF;
  570. if (gfHILOInjection)
  571. gxbFmWriteData[2] |= FM_HI_INJECTION_EN; //high injection
  572. else
  573. gxbFmWriteData[2] &= FM_LO_INJECTION_ENJ; //low injection
  574. TEA5767Write();
  575. if(xbLevel1>=xbLevel2)
  576. xbLevelDiff=xbLevel1-xbLevel2;
  577. else
  578. xbLevelDiff=xbLevel2-xbLevel1;
  579. if (xbLevel1>10)
  580. {
  581. if (!(  (xbLevelDiff<3) & (0x31<xbIFCounter)  & (xbIFCounter<0x3e) ))
  582. return (FALSE);
  583. }
  584. else
  585. {
  586. if (!(  (xbLevelDiff<2) & (0x31<xbIFCounter)  & (xbIFCounter<0x3e)))
  587. return (FALSE);
  588. }
  589.     
  590. return (TRUE);
  591. #undef xbLevelDiff 
  592. */
  593. //Dennis Shih 20060309 end
  594. }
  595. #endif // (_PM_FM_)         
  596. /*--------------------------------------------------------------------------
  597. Desciption:
  598. Search Up/Down from currently frequency and select stop level
  599. Arguments:
  600. 1: Up
  601. 0: Down
  602. Global arguments:
  603. void
  604. Returns:
  605. TRUE: A station is found
  606. FALSE:Reach the band limit
  607. --------------------------------------------------------------------------*/
  608. /*
  609. API BOOL FmSearchFreq(BOOL fSearchUp)
  610. {
  611. XWORD xwPreFreq,xwDifFreq;
  612. XBYTE xbNowStopLevel,xbRetry=0;
  613. xbNowStopLevel=FM_CMD_STOP_LOW; // Use Low Level for search default
  614. //xbNowStopLevel=FM_CMD_STOP_HIGH;
  615. while(1)
  616. {
  617. xwPreFreq=gxwFmFreq;
  618. if(FmSearch(fSearchUp,xbNowStopLevel)==FALSE)
  619. return FALSE;
  620. if(xbNowStopLevel==FM_CMD_STOP_HIGH)
  621.  return TRUE; // STOP Level High...No more high
  622. if(fSearchUp)
  623. xwDifFreq=(gxwFmFreq-xwPreFreq);
  624. else
  625. xwDifFreq=(xwPreFreq-gxwFmFreq);
  626. if(xwDifFreq==1)
  627. {
  628. xbRetry++;
  629. if(xbRetry>3)
  630. {
  631. xbNowStopLevel += FM_NEXT_STOP_LEVEL; // Try Next stop Level
  632. xbRetry=0;
  633. }
  634. }
  635. else
  636. return TRUE;
  637. }
  638. }
  639. */
  640. //Dennis Shih 20060309
  641. //Dino050812
  642. //check the whether the FM freq level ADC and IF counter
  643. #if (_PM_FM_|_PM_MPTEST_)
  644. API bit TEA5767_FmFreqCheck(void)
  645. {
  646. XWORD xwPLL;
  647. XWORD Temp;
  648. //gfHILOInjection=0;
  649. FMHiLoCheck();
  650. xwPLL=CalculatePLL(gxwFmFreq);
  651.      gxbFmWriteData[1]=xwPLL ;
  652. if(!TEA5767Write())
  653. return FALSE;
  654. Temp=0x100;
  655. do
  656.    {
  657.     Temp--;
  658.     TEA5767Read();
  659.     if(gxbFmReadData[0] &0x80)
  660. goto CHECKFREQ;
  661.     }while(Temp>0);
  662.     return FALSE;
  663. CHECKFREQ:
  664. if(IsValidStop())
  665. return TRUE;
  666. else
  667. return FALSE;
  668. }
  669. //Dennis Shih 20060309
  670. //Dino050812
  671. //Check the HILO inject value
  672. void FMHiLoCheck(void) large
  673. {
  674. XBYTE xbLevelHigh,xbLevelLow;
  675. XWORD xwPLL;
  676. xwPLL = CalculatePLL(gxwFmFreq);
  677. if(gfHILOInjection)
  678. xwPLL+=0x3d;
  679. else
  680. xwPLL+=0x30;
  681. //starting to set HILO to optimal level
  682. gxbFmWriteData[0]=(xwPLL>>8) & FM_CMD_SEARCH_DIS; //stop search mode
  683.     gxbFmWriteData[1]=xwPLL ;
  684. TEA5767Write();
  685. TEA5767Read();
  686. xbLevelHigh=(gxbFmReadData[3] & FM_GET_ADC_LEVEL);
  687. if(gfHILOInjection)
  688. xwPLL-=0x7a;
  689. else
  690. xwPLL-=0x60;
  691. gxbFmWriteData[0]=(xwPLL>>8) & FM_CMD_SEARCH_DIS;
  692.     gxbFmWriteData[1]=xwPLL ;
  693. TEA5767Write();
  694. TEA5767Read();
  695. xbLevelLow=(gxbFmReadData[3] & FM_GET_ADC_LEVEL);
  696. if (xbLevelHigh<xbLevelLow)
  697. gfHILOInjection=TRUE; //high injection
  698. else
  699. gfHILOInjection=FALSE; //low injection
  700. }
  701. #endif
  702. #endif //#if(FM_MODULE==1) //Walace060126#2