📄 fm_tea5767.lst
字号:
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FM_TEA5767
OBJECT MODULE PLACED IN ..\output\output_bin\output_fm\fm_tea5767.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\code\ap_fm\src\fm_tea5767.c LARGE OPTIMIZE(9,SIZE) BROWSE INCDIR(..\.
-.\..\bsp\include;..\..\code\ap_fm\src\include;..\..\code\global;..\..\code\include) DEFINE(CONFIG_ASIC,dynamic_load) DEB
-UG OBJECTEXTEND PRINT(..\output\output_bin\output_fm\fm_tea5767.lst) OBJECT(..\output\output_bin\output_fm\fm_tea5767.ob
-j)
line level source
1 #include "api.h"
2 #include "fm_tea5767.h"
3 #include "i2c.h"
4
5 #define mCombinU16(u16, h1, h0) \
6 { \
7 ((UNION16 *)&(u16))->v8[1] = h0; \
8 ((UNION16 *)&(u16))->v8[0] = h1; \
9 }
10
11 extern INT8U _buf[64];
12
13 extern void my_sprintf(char *buf, const char *fmt, ...);
14
15 INT8U u8FMdata[5];
16 INT16U u16RadioFrequency;
17 code INT8U U8RadioSet[5] = {MUTE_TEA5767_ON,0x00,0x00,STANDBY_ON,0x00};
18 //--------------------------------------------------------------------------
19 static BOOLEAN bRadioSetCommand(INT8U *ptr)
20 { register INT8U i;
21 1 vI2C_Start();
22 1 if(FALSE == bI2C_ByteOut(TEA5767_ADDR_W))
23 1 return FALSE;
24 1 for(i=0;i<5;i++)
25 1 {
26 2 if(FALSE == bI2C_ByteOut(ptr[i]))
27 2 return FALSE;
28 2 }
29 1 vI2C_Stop();
30 1 return true;
31 1 }
32
33 BOOLEAN bRadioInit(void)
34 {
35 1 FM_BUSEN = 1;
36 1
37 1 u16RadioFrequency = FM_FREQ_MIN;
38 1 return(bRadioSetCommand(U8RadioSet));
39 1 }
40
41 //--------------------------------------------------------------------------
42 BOOLEAN bRadioStop(void)
43 {
44 1 if(bRadioSetCommand(U8RadioSet)==FALSE)
45 1 return FALSE;
46 1 FM_BUSEN = 0;
47 1 return TRUE;
48 1 }
49
50 //--------------------------------------------------------------------------
51 static BOOLEAN bWrite_Command_To_TEA5767(void)
52 {
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 2
53 1 return(bRadioSetCommand(u8FMdata));
54 1 }
55
56 //--------------------------------------------------------------------------
57 static BOOLEAN bRead_Command_From_TDA5767(void)
58 {
59 1 register INT8U i;
60 1
61 1 vI2C_Start();
62 1
63 1 if(FALSE == bI2C_ByteOut(TEA5767_ADDR_R))
64 1 return FALSE;
65 1
66 1 for(i=0;i<4;i++)
67 1 u8FMdata[i] = u8I2C_ByteIn(0);
68 1
69 1 u8FMdata[4] = u8I2C_ByteIn(1);
70 1
71 1 vI2C_Stop();
72 1
73 1 return TRUE;
74 1 }
75
76
77 //--------------------------------------------------------------------------
78 static INT16U u16FreqToPLL(INT32U u16Freq)
79 {
80 1 INT32U u32Freq = u16Freq;
81 1 return (((u32Freq*10000)-225000)/8192); //for XTAL_32768K // 4/32768 = 8192
82 1 }
83
84 //--------------------------------------------------------------------------
85 static INT32U u16PLLToFreq(INT16U u16pll)
86 {
87 1 INT32U u32pll = u16pll;
88 1 INT16U r;
89 1
90 1 r = ((u32pll*8192)+225000)/10000; // 4/32768 = 8192
91 1
92 1 if((r%10) >= 5)
93 1 r = ((r/10)+1) * 10;
94 1
95 1 return r;
96 1 }
97
98 //--------------------------------------------------------------------------
99
100 #if 0
void vPrintFreq()
{
INT16U freq1 = u16RadioFrequency/FM_FREQ_STEP;
my_sprintf(_buf, "%d.%d ", freq1/10, freq1%10);
if(u8FMdata[2] & 0x80)
_buf[6] = 'S';
vLcd_Disp_FMfreq(_buf);
}
#endif
112
113 //-------------------------------------------------------
114 BOOLEAN bSetFmFrequency(INT16U freq)
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 3
115 {
116 1 INT16U u16PLL;
117 1
118 1 u16RadioFrequency = freq;
119 1
120 1 u16PLL = u16FreqToPLL(u16RadioFrequency);
121 1
122 1 u8FMdata[0] = (INT8U)(u16PLL >> 8);
123 1 u8FMdata[1] = (INT8U)(u16PLL & 0xFF);
124 1 u8FMdata[2] = LOW_SIDE_INJECTION;
125 1 u8FMdata[3] = US_EUROPE_FM_BAND | XTAL_32768K | SOFT_MUTE_ON | STEREO_NOISE_CANCELLING_ON;
126 1 u8FMdata[4] = DTC_75us | PLLREF_ON;
127 1
128 1 if(FALSE == bWrite_Command_To_TEA5767())
129 1 return FALSE;
130 1
131 1 if(FALSE == bRead_Command_From_TDA5767())
132 1 return FALSE;
133 1
134 1 return TRUE;
135 1 }
136
137 void FmFrequencyUp()
138 {
139 1 u16RadioFrequency += FM_FREQ_STEP;
140 1 if(u16RadioFrequency > FM_FREQ_MAX)
141 1 u16RadioFrequency = FM_FREQ_MIN;
142 1 }
143 void FmFrequencyDown()
144 {
145 1 u16RadioFrequency -= FM_FREQ_STEP;
146 1 if(u16RadioFrequency < FM_FREQ_MIN)
147 1 u16RadioFrequency = FM_FREQ_MAX;
148 1 }
149
150 //-------------------------------------------------------
151 BOOLEAN bFmFrequencyUp(void)
152 {
153 1 FmFrequencyUp();
154 1 return bSetFmFrequency(u16RadioFrequency);
155 1 }
156
157
158 //--------------------------------------------------------------------------
159 BOOLEAN bFmFrequencyDown(void)
160 {
161 1 FmFrequencyDown();
162 1 return bSetFmFrequency(u16RadioFrequency);
163 1 }
164
165
166 extern BOOLEAN init_volume(void);
167 extern BOOLEAN close_volume(void);
168 extern void delay(UINT16 n);
169 //--------------------------------------------------------------------------
170 BOOLEAN bFmAutoSearch(INT8U u8UpDown)
171 {
172 1 #if 0
INT16U pll_dec;
INT16U u16PLL;
register INT8U ReadFlag=0;
register INT8U count;
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 4
//BOOLEAN bFM_STEREO;
//INT8U u8FM_LEV;
//INT8U u8FM_IF;
if(SEARCH_UP == u8UpDown)
FmFrequencyUp();
else
FmFrequencyDown();
u16PLL = u16FreqToPLL(u16RadioFrequency);
u8FMdata[0] = ((INT8U)(u16PLL >> 8)) | MUTE_TEA5767_ON | SEARCH_MODE_ON;
u8FMdata[1] = (INT8U)(u16PLL & 0xFF);
u8FMdata[2] = u8UpDown | LOW_SIDE_INJECTION | SEARCH_STOP_LEVEL_LOW;
u8FMdata[3] = US_EUROPE_FM_BAND | XTAL_32768K | SOFT_MUTE_ON | STEREO_NOISE_CANCELLING_ON;
u8FMdata[4] = DTC_75us | PLLREF_ON;
if(FALSE == bWrite_Command_To_TEA5767())
return FALSE;
count = 0;
#if 1// marco modify for fm auto search
while(!ReadFlag)
{
if(FALSE == bRead_Command_From_TDA5767())
return FALSE;
ReadFlag = u8FMdata[0] & 0x80;
if(u16RadioFrequency>FM_FREQ_MAX || u16RadioFrequency<FM_FREQ_MIN)
break;
mCombinU16(pll_dec,u8FMdata[0]&0x3F, u8FMdata[1]);
u16RadioFrequency = u16PLLToFreq(pll_dec);
}
bSetFmFrequency(u16RadioFrequency);
return TRUE;
#else
while(count++ < 10)
{
delay(5);
if(FALSE == bRead_Command_From_TDA5767())
//return FALSE;
continue;
//ReadFlag = u8FMdata[0] & 0x80;
//if(ReadFlag)
bFM_STEREO = (u8FMdata[2] >> 7);
u8FM_IF = (u8FMdata[2] & 0x7F);
u8FM_LEV = (u8FMdata[3] >> 4);
if((u8FM_IF>0x31)&&(u8FM_IF<0x3e)&&(u8FM_LEV>=5)&&(bFM_STEREO))
{
init_volume();
bSetFmFrequency(u16RadioFrequency);
delay(5000);
close_volume();
return TRUE;
}
else
return FALSE;
}
// bSetFmFrequency(u16RadioFrequency);
return FALSE;
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 5
#endif
#else
242 1 u8UpDown = u8UpDown;
243 1 return FALSE;
244 1 #endif
245 1
246 1 }
247
248
249 //-----------------------------------------------------------------------------------------------------
250 BOOLEAN bFmSearchRead(void)
251 {// marco new add
252 1 #if 1
253 1
254 1 INT16U u16PLL;
255 1
256 1 BOOLEAN bFM_STEREO;
257 1 INT8U u8FM_LEV;
258 1 INT8U u8FM_IF;
259 1 register INT8U count;
260 1
261 1 u16PLL = u16FreqToPLL(u16RadioFrequency);
262 1
263 1 u8FMdata[0] = ((INT8U)(u16PLL >> 8)) | MUTE_TEA5767_ON/* | SEARCH_MODE_ON*/;
264 1 u8FMdata[1] = (INT8U)(u16PLL & 0xFF);
265 1 u8FMdata[2] = /*u8UpDown |*/ LOW_SIDE_INJECTION /*| SEARCH_STOP_LEVEL_LOW*/;
266 1 u8FMdata[3] = US_EUROPE_FM_BAND | XTAL_32768K | SOFT_MUTE_ON | STEREO_NOISE_CANCELLING_ON;
267 1 u8FMdata[4] = DTC_75us | PLLREF_ON;
268 1
269 1 if(FALSE == bWrite_Command_To_TEA5767())
270 1 return FALSE;
271 1
272 1 count = 0;
273 1
274 1 //while((!ReadFlag)&&(count++ < 50))
275 1 while(count++ < 10)
276 1 {
277 2 delay(5);
278 2 if(FALSE == bRead_Command_From_TDA5767())
279 2 //return FALSE;
280 2 continue;
281 2
282 2 //ReadFlag = u8FMdata[0] & 0x80;
283 2 //if(ReadFlag)
284 2 bFM_STEREO = (u8FMdata[2] >> 7);
285 2 u8FM_IF = (u8FMdata[2] & 0x7F);
286 2 u8FM_LEV = (u8FMdata[3] >> 4);
287 2 if((u8FM_IF>0x31)&&(u8FM_IF<0x3e)&&(u8FM_LEV>=5)&&(bFM_STEREO))
288 2 {
289 3 init_volume();
290 3 bSetFmFrequency(u16RadioFrequency);
291 3 delay(5000);
292 3 close_volume();
293 3 return TRUE;
294 3 }
295 2 else
296 2 return FALSE;
297 2 }
298 1
299 1 // bSetFmFrequency(u16RadioFrequency);
300 1 return FALSE;
C51 COMPILER V7.50 FM_TEA5767 08/18/2008 13:49:44 PAGE 6
301 1 #else
return FALSE;
#endif
304 1 }
305
306
307
308
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 591 ----
CONSTANT SIZE = 5 ----
XDATA SIZE = 7 11
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -