📄 fm_tea5767.c
字号:
#include "api.h"#include "fm_tea5767.h"#include "i2c.h"#define mCombinU16(u16, h1, h0) \{ \ ((UNION16 *)&(u16))->v8[1] = h0; \ ((UNION16 *)&(u16))->v8[0] = h1; \}extern INT8U _buf[64];extern void my_sprintf(char *buf, const char *fmt, ...);INT8U u8FMdata[5];INT16U u16RadioFrequency;code INT8U U8RadioSet[5] = {MUTE_TEA5767_ON,0x00,0x00,STANDBY_ON,0x00};//--------------------------------------------------------------------------static BOOLEAN bRadioSetCommand(INT8U *ptr){ register INT8U i; vI2C_Start(); if(FALSE == bI2C_ByteOut(TEA5767_ADDR_W)) return FALSE; for(i=0;i<5;i++) { if(FALSE == bI2C_ByteOut(ptr[i])) return FALSE; } vI2C_Stop(); return true;}BOOLEAN bRadioInit(void){ FM_BUSEN = 1; u16RadioFrequency = FM_FREQ_MIN; return(bRadioSetCommand(U8RadioSet));}//--------------------------------------------------------------------------BOOLEAN bRadioStop(void){ if(bRadioSetCommand(U8RadioSet)==FALSE) return FALSE; FM_BUSEN = 0; return TRUE;}//--------------------------------------------------------------------------static BOOLEAN bWrite_Command_To_TEA5767(void){ return(bRadioSetCommand(u8FMdata));}//--------------------------------------------------------------------------static BOOLEAN bRead_Command_From_TDA5767(void){ register INT8U i; vI2C_Start(); if(FALSE == bI2C_ByteOut(TEA5767_ADDR_R)) return FALSE; for(i=0;i<4;i++) u8FMdata[i] = u8I2C_ByteIn(0); u8FMdata[4] = u8I2C_ByteIn(1); vI2C_Stop(); return TRUE;}//--------------------------------------------------------------------------static INT16U u16FreqToPLL(INT32U u16Freq){ INT32U u32Freq = u16Freq; return (((u32Freq*10000)-225000)/8192); //for XTAL_32768K // 4/32768 = 8192}//--------------------------------------------------------------------------static INT32U u16PLLToFreq(INT16U u16pll){ INT32U u32pll = u16pll; INT16U r; r = ((u32pll*8192)+225000)/10000; // 4/32768 = 8192 if((r%10) >= 5) r = ((r/10)+1) * 10; return r;}//--------------------------------------------------------------------------#if 0void 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//-------------------------------------------------------BOOLEAN bSetFmFrequency(INT16U freq){ INT16U u16PLL; u16RadioFrequency = freq; u16PLL = u16FreqToPLL(u16RadioFrequency); u8FMdata[0] = (INT8U)(u16PLL >> 8); u8FMdata[1] = (INT8U)(u16PLL & 0xFF); u8FMdata[2] = LOW_SIDE_INJECTION; 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; if(FALSE == bRead_Command_From_TDA5767()) return FALSE; return TRUE; }void FmFrequencyUp(){ u16RadioFrequency += FM_FREQ_STEP; if(u16RadioFrequency > FM_FREQ_MAX) u16RadioFrequency = FM_FREQ_MIN;}void FmFrequencyDown(){ u16RadioFrequency -= FM_FREQ_STEP; if(u16RadioFrequency < FM_FREQ_MIN) u16RadioFrequency = FM_FREQ_MAX;}//-------------------------------------------------------BOOLEAN bFmFrequencyUp(void){ FmFrequencyUp(); return bSetFmFrequency(u16RadioFrequency); }//--------------------------------------------------------------------------BOOLEAN bFmFrequencyDown(void){ FmFrequencyDown(); return bSetFmFrequency(u16RadioFrequency);}extern BOOLEAN init_volume(void);extern BOOLEAN close_volume(void);extern void delay(UINT16 n);//--------------------------------------------------------------------------BOOLEAN bFmAutoSearch(INT8U u8UpDown){ extern BOOLEAN init_volume(void); extern BOOLEAN close_volume(void); extern void delay(UINT16 n);// INT16U pll_dec; INT16U u16PLL; register INT8U ReadFlag=0; register INT8U count; 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 0// 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; #endif }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -