07寶來經典CD(RC668)增加藍牙播放音樂

一、起因

      07款大衆寶來經典12年的老廉頗了,車還能開,準備在戰10年。07寶來只有個CD+收音機(西門子 RC668),由於車子歲數大了,收音機有雜音,而且山間小路還沒有信號,所以花15塊買的CD刻碟聽。這裏要心疼15塊錢一下,刻出來的碟片,放車上兩三次基本都讀碟失敗了,很是鬱悶。誰讓咱是個電農了能折騰,雖然收音機和CD不咋好使,可是功放是好使啊,何不改裝一下加個藍牙,以後拿手機放歌,想想都爽歪歪。

二、方案

     在沒有查找資料之前,想當然的方法就是,隔斷CD或者收音機的音頻線,在用單片機或者藍牙控制模擬開關切換信道。我的想法是用最少的錢,辦最大的事情。然後上網搜索了一圈發現高手真不少,各種改裝很是歡樂。其中下面這篇文章覺得寫得最爲詳細http://www.xcar.com.cn/bbs/viewthread.php?tid=18654146

這個老師羅列了5種方案,而且都有人試過水,看到他們的改裝我的最優選項是方案4通過模擬CD碟盒,將藍牙加進去,聽着原理也很簡單,但是網上只能找到引腳定義,並不知道具體的通信協議,要想知道通信協議:方案一買個碟盒掛上,邏輯分析儀+示波器。方案二、買一個別人做好的模擬碟盒設備,分析協議。無論哪種方式都和我的第一原則抵觸了,“花最少的錢,辦最大的事”。最後也選擇了老師的方案5。通過IIC控制TEF6894H 選擇模擬輸入信道,具體原理看上面的文章。

三、原理分析

      方案確定後,網上買了一套汽車拆機套裝,由於看錯了介紹買錯了工具心塞,買了2次纔買成,使用工具很容易將CD拆下來。擰下兩邊的卡簧螺絲即可。車機的上下蓋是卡上的不需要才螺絲,打開後在將CD卸下即可。在這個過程中遇到了兩個問題。

1、拆下來的機頭需要12V供電才能工作,這是車機的管件定義圖片。

      要想車機工作,至少要將S、K、SAF、電源正極接+12V,○接負極。我這這裏吃了很大虧,由於沒插頭,只能用烙鐵在電路板的背面,將S、K、SAF連到正極,由於晚上焊接,在加上老眼昏花焊接錯誤,導致開不開機,折騰了一天,被各種嘲諷,不說了都是眼淚。

2、由於這個型號的車機斷電重新上電會鎖住CD,開機顯示SAFE,接着顯示1000。這個就是鎖住的症狀,如果記得密碼輸入就好,不記得了的話,網上有解碼的,給出車機上的字碼就能幫你查到密碼,我不知道密碼所以花錢買了個破解,十分心痛。

如果上述兩個坑成功跳過後,就開始研究正題了,怎麼通過IIC寫入程序切換輸入的信道。

RC668這個板子的做工很好,關鍵的線路上都有測試點,所以這裏不需要破壞電路板,只需要將線焊接到測試點上即可,電源兩個線沒有焊接到測試點上。上電通過邏輯分析儀抓取沒有按鍵按下時的空閒波形,由於當時波形沒有保存,只能用表格描述了。

總線命令 IDEL read(0x0c) read(0x0c) read(0x0c) IDEL write IDEL 重複操作
時間長度 85ms 不記得 不記得 不記得 20ms 不記得 85ms 重複操作

上表示IIC總線空閒時的狀態,通過分析發現,在沒有按鍵按下的時候,總線只有讀命令,寫操作只寫了個地址操作,我猜是檢測TEF6894H 是否在線的,通過借鑑上面的帖子,只需要寫TEF6894H 的0x0B寄存器即可。寄存器如圖所示。

這裏要注意個問題。

1、如過要檢查IIC的數據,或者往IIC總線上發數據,不對總線操作的時候一定不要上拉或者下拉總線,入過不知道咋操作請將IO設置成高阻或者開漏模式,防止干擾總線,總線別干擾是開不了機的。

2、在總線上插入IIC寫命令的時候,一定要避開IIC總線衝突,要在總線空閒的時候插入數據防止總線互相干擾

爲了解決第二個問題,所以在編寫IIC程序的時候要解決IIC總線佔用和同步問題。

四、程序編寫

本着“錢少辦大事”的原則,找到了之前做項目剩下的板子和芯片(STC8F1K08),可以滿足IIC總線監測和同步功能。STC8F1K08爲8腳單片機帶硬件IIC,正好不用模擬了,滿足需求。STC8F1K08管腳圖如下:

 IIC通信問題解決了,那麼IIC時序同步監測總線空閒怎麼實現呢?這裏通過分析分析IIC通信協議,總線空閒時SDA和SCL是高電平,通信的時候總線會發生跳變,而且通過分析發現空閒時IIC總線上的讀命令和寫命令時間長度不超過5ms,那麼就可以檢測IIC總線邊沿跳變當最後一次跳變5ms後還有跳變發生時,就可以認爲總線進入空閒狀態了。這時就可以像總線上發送命令了。那麼如何實現邊沿跳變檢測呢?因爲每傳輸一個bit SCL都會發生跳變,所以這裏檢測SCL邊沿跳變情況。SCL和外部中斷INT0共用P3.2,這爲IIC總線空閒檢測便利,只有當IIC空閒的時候才發送數據,所以P3.3和P3.2在發送的時候設置成雙向口即可,然後開啓外部中斷0設置成檢測跳變沿(其實設置成非電平觸發模式都可以)。在中斷中打開定時器,清零5ms計數,檢測同步是否鎖定,如果鎖定則解除鎖定,清除同步標誌位。主程序如下:

/********************************Copyright (C) **********************************
**                        					king song
**                                     
**                       
**
**-------------------------------------------------------------------------------
** File		     name: main
** Author 			   : king song
** Create Date		 : 2019.06.22
** version			   : 1.0.0
** Description		 : main
** Email Address 	 : [email protected]
** Technology blogs: 
** others			     : 
**----------------------------Modification--------------------------------------
Modification History	:
Data			By			Version			
================================================================================*/

 #include "stc8a8k64s4a12.h"
#include "userapp.h"
#include "watchdog.h"
#include "timer.h"
#include "uart.h"
#include "iic_master.h"


void Delay1000ms();		//@22.1184MHz

/***********main函數************************/
void main()
{
	unsigned char i = 0;

	
		P3_Mode_OUT_OD(PIN_2);			//  開機初始化 IIC IO狀態 防止鎖死IIC總線
		P3_Mode_OUT_OD(PIN_3);

		Delay1000ms();
		AUXR = 0x00;
	
		InitUart();

    IT0 = 1;                                    //使能INT0下降沿中斷
    EX0 = 1;                                    //使能INT0中斷
    EA = 1;
	
		timer0Init();

//		WDT_CONTR = 0x27;                           //看門狗溢出時間4
		
		
		while(1)									
		{
			
			
			appUserSever();

		}

}





void Delay1000ms()		//@22.1184MHz
{
	unsigned char i, j, k;

	i = 113;
	j = 53;
	k = 228;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

IIC總線同步空閒狀態發送程序

/********************************Copyright (C) **********************************
**                        					 king song
**                       
**
**--------------File Info---------------------------------------------------------
** File		     name: userapp.c
** Author 			   : king song
** Create Date		 : 2019.06.22
** version			   : 1.0.0
** Description		 : 
** Email Address 	 : [email protected]
** Technology blogs: 
** others			     : 
**----------------------------Modification--------------------------------------
Modification History	:
Data			By			Version			
================================================================================*/

#include "userapp.h"
#include "uart.h"
#include "intrins.h"
#include "string.h"
#include "iic_master.h"

sbit    SDA         =   P3^3;
sbit    SCL         =   P3^2;

sbit    BLE_STA     =   P5^4;


/////////////////////////同步鎖定和同步標誌主要通過這兩個標誌位實現一個空閒中斷插入1條命令/////////////////////////////////////////////////

unsigned int syn_count = 0;							//同步總線空閒時間計數
unsigned char syn_flag = 0;							//同步總線標誌位
unsigned char syn_lock = 0;							//同步總線標誌位

unsigned char ble_flag = 0;							//藍牙發送標誌和發送次數計數

extern unsigned char  uart_flag ;				//串口命令標誌位


void appUserSever(void)
{

	if((syn_flag == 1)&&(	syn_lock == 0))
	{
	
		if((BLE_STA == 1)&&(ble_flag == 0))
		{
			ble_flag = 1;

		
		}else if((BLE_STA == 0))
		{

		   ble_flag = 0;
		}
		
		
		
		if((uart_flag == 1)||((ble_flag>0)&&(ble_flag<30)))			// 串口 發送切換到藍牙命令或者手機連接上設備了切換到藍牙模式
		{
			uart_flag = 0;
			switchBLE();
			ble_flag++;

			P3_Mode_OUT_OD(PIN_2);																//發送完數據後繼續監聽總線狀態
			P3_Mode_OUT_OD(PIN_3);

		}

		
		syn_lock = 1;
	}
	
}

void TM0_Isr() interrupt 1
{

	
			syn_count++;
	
			if(syn_count>5)					//延時5ms
			{
//				EX0 = 0;    					//關閉中斷
				syn_flag = 1;
				EX0 = 1;              //使能INT0中斷
				TR0 = 0;
			}
	

}
void INT0_Isr() interrupt 0
{
		TR0 = 1; 

		syn_count = 0;
		if(syn_lock == 1)
		{
			syn_lock = 0;
			syn_flag = 0;

		}
//		if(SCL ==1)      						//   
//		{

//		}									
//		else                    						//反轉
//		{

//		}
            
	
	
                               

}

該程序主要實現通過串口發送命令或者藍牙連接成功自動將車機的音頻輸入信號切換到外部CD輸入。如果想退出藍牙模式只需要按車機面板上FM/AM/CD切換按鈕即可恢復正常車機工作模式。

五、焊接調試

首先按照上述設計,焊接電路,藍牙模塊選擇的是JDY-66雙模藍牙,既可以傳音頻又可以串口透傳,可以將藍牙串口接到單片機上通過手機遙控實現更多更能。如下圖所示爲將藍牙模塊和單片機做小系統焊接到一起,由於電源取的是車機的5V電源,藍牙模塊供電最大4.2V,這裏直接在電源上串聯個4007實現降壓,上電實測電源電源在4.1V左右滿足要求。電源和IIC總線焊接到4pin的XH連接器上方便拆卸,對應機頭上焊接XH工頭,由於JDY-66輸出的是差分音頻信號,而車機輸入的是單端信號無法匹配,所以信號直接用變壓器轉換一下,網上有JDY-66配套的差分轉單端的模塊,我就是買了變壓器轉換模塊。所以將兩路差分信號加上GND總共5根線也焊接到XHl連接器上。

 注意:車機的音頻輸入信號可以直接通過車機後面的端子直接送入如下所示。由於我沒有對應的插座所以直接在背面的PCB上直接飛線出音頻輸入信號了。

 爲了方便以後升級將單片機的串口引出,並在程序裏面設計了軟復位,監測到ISP下載指令就會復位進入下載模式,下載程序再也不用斷電了。然後在廢物堆裏面找到了一個裝TO220 MOS管的殼正好可以將電路板塞進去。

 

 車機焊接的接口和安裝沒有拍照片,將來有機會再補上吧。

六、總結

從拆機頭到裝回去總共折騰了1天半,寫這個博客又差點寫了4個小時,從時間成本分析,不合算不如買一個划算,但是從另外一個角度來說,終於DIY一個有用的東西了,可以根據自己的需求改改改。由於使用的是藍牙模塊是雙模的還支持串口透傳,賣家還提供了Android APP源碼 那麼可以加上手機修改SSID、手機端升級程序等沒啥用的功能了。太困了有空再勘誤吧,哈哈哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章