Fm發射功能在車載android系統的應用
阿新 • • 發佈:2019-01-24
FM發射功能在車載android系統的應用
很久沒有寫android的文章了,今晚就寫一篇FM發射功能在車載電子上的應用,以及軟體需要注意的地方。所謂FM發射就是充當於FM電臺,頻率在76-108M之間都可以,我們選用的是QN8027。這個FM發射有什麼意義呢?
比如有些主機或者後座娛樂系統播放音樂,是沒有喇叭或者喇叭比較差一點,用FM發射出去,在原廠配的FM裡就可以搜到這個FM發射頻點,聽收音機一樣來接受播放的音樂,再用原廠的音響放出來,整個在車上的人都可以享受這個音樂帶來的高品質享受。那麼這個系統怎麼實現呢?
QN8027是用IIC控制的,對初始化有一定要求,參考時鐘也有講究,跟硬體電路設計很相關。初始化參考程式碼如下:
static void QN8027_init_setting(void) { unsigned char value = 0; int ret = -1; /*reset all regs to default value*/ fm_radio_write_reg(gclient, 0x0, 0x81); msleep(20);/*sleep 20ms*/ /*-----xtal--setup----------*/ fm_radio_write_reg(gclient, 0x3, 0x30); /*osc=12M--0x33-40k 0x32--20k 0x31--10k TX digital gain=2dB*/ fm_radio_write_reg(gclient, 0x4, 0x12); /*---recalibration-----*/ fm_radio_write_reg(gclient, 0x0,0x41); fm_radio_write_reg(gclient, 0x0,0x01); msleep(20);/*sleep 20ms*/ /*-----default---------*/ fm_radio_write_reg(gclient,0x18,0xe4);/*SNR improve*/ fm_radio_write_reg(gclient,0x1b,0xf0);/*Increase RF power output maximum*/ fm_radio_write_reg(gclient, 0x2, 0xb9); /*enable transmit*/ ret = fm_radio_read_reg(gclient, 0x0, &value); value |= 0x20; fm_radio_write_reg(gclient, 0x00, value);/*No reset. FSM runs normally*/ }
必須特別強調的一點是在切換FM發射頻點的時候,會發現在高頻點的時候,也就是0x0暫存器的儲存FM頻率的第8-9bit有值的情況下,發射天線電壓幅度會降低,後面跟著發現這種高頻率點,同時需要更改兩個暫存器的值,後面筆者在調頻率的時候,先讓fm進入standby模式,設定好新的頻點的時候再讓fm處於transmit的模式,這樣就有效解決這個輸出幅度異常的問題。參考程式碼如下:
static int QN8027_set_frequency(unsigned int freq) {
int CH = 0, ret = -1;
unsigned char value = 0;
if(freq < 76000 || freq > 108000) {
printk("Error,wrong freq %d KHz, [76--108MHz]\n", freq);
return -1;
}
CH = (freq - 76000)/50;
printk("QN8027_set_frequency: freq = %d KHz, CH = 0x%x\n", freq, CH);
fm_radio_read_reg(gclient, 0X0, &value);
value = (value & 0xFC) | ((CH&0X300)>>8);
value &= 0xdf;/*set standby mode*/
ret = fm_radio_write_reg(gclient, 0x00, value);/*update CH[8:9]*/
if(ret <0)
return -1;
value = CH & 0xFF;
ret = fm_radio_write_reg(gclient, 0x01, value);/*update CH[0:7]*/
fm_radio_read_reg(gclient, 0X0, &value);
value |= 0x20;/*set transmit mode*/
ret = fm_radio_write_reg(gclient, 0x00, value);
return ret;
}