1. 程式人生 > >Fm發射功能在車載android系統的應用

Fm發射功能在車載android系統的應用

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;
}