全网首发!奔驰宝马奥迪卡带机卡带通道激活模块,无损安装可以接2路AUX

news2025/1/14 19:42:00

文章目录

    • 1.前言
    • 2.时序逆向分析
      • 2.1协议分析
      • 2.2卡带音频通道引出
    • 3、PCB设计
    • 4、程序设计
    • 5、焊接调试
    • 6、结语

1.前言

​ 之前写过四篇关于车机增加音频输入的方法。

1、07宝来经典车机CD收音机(RC668)改装增加蓝牙播放音乐

2、全网首发!老大众奥迪碟盒通信协议破解,可以模拟数码碟盒,外接AUX蓝牙U盘等音频设备

3、全网首发!大众奥迪DIY数码碟盒增加USB和蓝牙播放音乐功能使用原车接口无损改装

4、全网首发,克莱斯勒大捷龙jeep道奇DIY数码碟盒增加USB和蓝牙播放音乐功能使用原车接口无损改装
5、全网首发!大众宝来高尔夫polo领驭迈腾帕萨特奥迪A4A6B6B7等老车机增加带蓝牙控制的AUX解码模块
​ 早期老奔驰宝马奥迪高端车机他们的卡带机由于年代久远大部分都用不了,虽然他们不是一家,但是卡带部分用的都是一样的方案,这里以奥迪老A6卡带机为例,设计一套卡带通道激活模块,用于激活卡带通道,然后就可以把卡带音频引出转成AUX,接入自己喜欢的音源,奥迪卡带通道可以使用杜比音效,听重低音效果不错。
在这里插入图片描述

2.时序逆向分析

卡带机芯控制器原理图如下所示。
在这里插入图片描述

和主板通信的主要接口引脚是

ME/FE卡带正反面
MONITOR保护监控
PLAY-SWITCH卡带播放
ENABLE-CC使能
GNDgnd
CLOCK-CC时钟线
VCC 12V12V
DATA-CC数据线

​ 通过示波器和逻辑分析仪反复测试,卡带控制主要引脚为ENABLE-CC、CLOCK-CC、DATA-CC这个三个引脚有关。下面通过逻辑分析仪抓取3个引脚时序,破解协议。

关机状态 低电平
在这里插入图片描述
开机
在这里插入图片描述

按mode按钮切换到TAPE
在这里插入图片描述

REV按钮按下
在这里插入图片描述

FF 按钮按下
在这里插入图片描述

再按下FF按钮

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

抓取的波形太多了,综合分析结果如下

2.1协议分析

开机:进入非卡带 返回 f0 00 f0 00

开机 :进入卡带 箭头向上 : f0 00 f0 00 a8 aa db c2 df 56

先发f0 00 f0 00 然后发a8 然后 aa 然后 a8 aa db c2 df 56 a8发完拉低sw

开机 :进入卡带 箭头向下 : f0 f0 0 a8 aa db c2 ea e7 66

卡带机向上运行 关机 返回: 52 ea f0 00 先发52 后面为应答 F0后拉高SW

卡带机向下运行 关机 返回: 62 da f2 f0 00 先发62 后面为应答 F0后拉高SW

切换卡带机箭头向上 运行 返回:da d7 56

切换卡带机箭头向下 运行 返回:ea e7 66

切换功能机箭头向上 返回: 52 ea f0 00 先发52 后面为应答

切换功能机箭头向下 返回: 62 da f2 f0 00 先发62 后面为应答

FM 进入卡带机 箭头向上 :a8 aa db c2 df 56

FM 进入卡带机 箭头向下 :a8 aa db c2 ea e7 66

卡带机FF按钮 箭头向前快进按下 : c0 d2

在按下停止快进:c2 ea c2 f0 00 a8 aa db c2 df 56 先发c2 在发ea c2 在发后面

卡带机FR按钮 箭头向前快进按下 : c0 ea e2

在按下停止快进:c2 da c2 f0 00 a8 aa db c2 df 56 先发c2 在发da c2 在发后面

FF RF 一起按下 返回: 98 a8 aa db f0 00 先发98 在发a8 再发 aa db f0 00

2.2卡带音频通道引出

磁头AB面引出AUX

在这里插入图片描述

卡带机输入音频信号需要阻抗匹配
在这里插入图片描述

增益调节
在这里插入图片描述

3、PCB设计

​ 根据上述原理,设计原理图PCB

卡带接口引出PCB板卡
在这里插入图片描述

卡带控制接口PCB板卡
在这里插入图片描述

4、程序设计

贴上核心程序代码

///ENABLE/
void GPIOA_IRQHandler(void)
{
	
	static uint8_t preData = 0;
	
  /* USER CODE BEGIN GPIOA_IRQn 0 */

  /* EXTI line interrupt detected */	
  if (__HAL_GPIO_EXTI_GET_FLAG(TAPE_ENABLE_GPIO_PORT, TAPE_ENABLE_GPIO_PINS) != RESET)
  {
				__HAL_GPIO_EXTI_CLEAR_FLAG(TAPE_ENABLE_GPIO_PORT, TAPE_ENABLE_GPIO_PINS);
		
		
		if(HAL_GPIO_ReadPin(TAPE_ENABLE_GPIO_PORT, TAPE_ENABLE_GPIO_PINS) == GPIO_PIN_SET)		//上升沿
		{
			
				LED_01(LED_ON);

			
			
				TAPE_CLK_GPIO_Config();
			
			
			if ((myTape.tsReceiveData[0] == 0xac) || (myTape.tsReceiveData[0] == 0xa8))		//
			{
				osal_set_event(tape_task_id, TAPE_PLAY_EVENT);
				TAPE_ONOFF(TAPE_LOW);

			}else
			if ((myTape.tsReceiveData[0] == 0x52) || (myTape.tsReceiveData[0] == 0x62))		//关机
			{
				osal_set_event(tape_task_id, TAPE_STOP_EVENT);
			}else
			if (((myTape.tsReceiveData[0]&0xf0) == 0xf0)&&(preData==0xda))
			{
				osal_set_event(tape_task_id, TAPE_INIT_EVENT);
			}
			else
			if ((myTape.tsReceiveData[0] ==0xd2||myTape.tsReceiveData[0] ==0xe2)&&(preData==0xc0))			//c0 d2 快进c0 e2
			{
//					TAPE_ONOFF(TAPE_HIGHT);

				osal_set_event(tape_task_id, TAPE_FF_FAST_EVENT);
			}
			else
			if ((myTape.tsReceiveData[0] ==0xea||myTape.tsReceiveData[0] ==0xda)&&(preData==0xc0))			//c0 ea 快进 c0 da
			{
//					TAPE_ONOFF(TAPE_HIGHT);

				osal_set_event(tape_task_id, TAPE_FR_FAST_EVENT);
			}
			else
			if ((myTape.tsReceiveData[0] ==0xe7)&&(preData==0xea))			//切换箭头向下
			{
					TAPE_MEFE(TAPE_HIGHT);

			}	else
			if ((myTape.tsReceiveData[0] ==0xd7)&&(preData==0xda))			//切换箭头向上
			{
					TAPE_MEFE(TAPE_LOW);

			}
			
			
			
			preData = myTape.tsReceiveData[0];
			
			osal_set_event(tape_task_id, TAPE_RECE_EVENT);
			
			__HAL_GPIO_EXTI_CLEAR_FLAG(TAPE_ENABLE_GPIO_PORT, TAPE_ENABLE_GPIO_PINS);     //清除中断标志位
//			EXTI->IMR &= ~(EXTI_Line1);							//关闭外部中断1
				HAL_NVIC_DisableIRQ(TAPE_CLK_EXTI_IRQn);
			__HAL_GPIO_EXTI_CLEAR_FLAG(TAPE_CLK_GPIO_PORT, TAPE_CLK_GPIO_PINS);  //清除中断标志位
//			SPI2_Buffer_Rx[0] = 0;
//			SPI2_Buffer_Rx[1] = 0;
			
			
			
			
			
			
		
		}else																																									//下降沿
		{
				LED_01(LED_OFF);

			
				TAPE_CLK_GPIO_EXIT_Config();
				__HAL_GPIO_EXTI_CLEAR_FLAG(TAPE_CLK_GPIO_PORT, TAPE_CLK_GPIO_PINS);  //清除中断标志位
				HAL_NVIC_EnableIRQ(TAPE_CLK_EXTI_IRQn);						//开启外部中断1
//				EXTI->IMR |= EXTI_Line1;								
			
			myTape.tsRxinedx = 0;
		
		}
		

  }
			__HAL_GPIO_EXTI_CLEAR_FLAG(TAPE_ENABLE_GPIO_PORT, TAPE_ENABLE_GPIO_PINS);     //清除中断标志位

	
	
	
  /* USER CODE END GPIOA_IRQn CLK  0 */
}

/**
 * @brief 当前任务的事件回调处理函数
 * @param task_id       [任务ID]
 * @param task_event    [收到的本任务事件]
 * @return uint16       [未处理的事件]
 */
uint16 tape_task_event_process(uint8 task_id, uint16 task_event)
{
	
	
    if(task_event & TAPE_INIT_EVENT)
    {
			
			initTape();
			myTape.tsStatus = 1;
        return task_event ^ TAPE_INIT_EVENT; //处理完后需要清除事件位
    }
	
	
	
	
	
	
	
    if(task_event & TAPE_RECE_EVENT)
    {

	
			
				printf(" %x\n",myTape.tsReceiveData[0]);

//				if(SPI2_Buffer_Rx[0] == )

			
			
				myTape.tsReceiveData[0] = 0;
				myTape.tsReceiveData[1] = 0;
			
			
			

        return task_event ^ TAPE_RECE_EVENT; //处理完后需要清除事件位
    }
    if(task_event & TAPE_IDLE_EVENT)
    {

	
			
				printf(" %x\n",myTape.tsReceiveData[0]);

				myTape.tsReceiveData[0] = 0;
				myTape.tsReceiveData[1] = 0;
			

        return task_event ^ TAPE_IDLE_EVENT; //处理完后需要清除事件位
    }		
		
    if(task_event & TAPE_PLAY_EVENT)
    {
				TAPE_ONOFF(TAPE_HIGHT);
				HAL_Delay(300);
				TAPE_ONOFF(TAPE_LOW);
				HAL_Delay(337);
				TAPE_ONOFF(TAPE_HIGHT);
				HAL_Delay(77);
				TAPE_ONOFF(TAPE_LOW);
				osal_set_event(tape_task_id, TAPE_PLAYING_EVENT);
				myTape.tsStatus = 1;

        return task_event ^ TAPE_PLAY_EVENT; //处理完后需要清除事件位
    }	
    if(task_event & TAPE_PLAYING_EVENT)
    {
			
						TAPE_CLK(TAPE_LOW);
						HAL_Delay(1);
						TAPE_CLK(TAPE_HIGHT);

						if(myTape.tsStatus == 1)			//开机发送脉冲
						{
							osal_start_reload_timer(tape_task_id, TAPE_PLAYING_EVENT, 25 / TICK_PERIOD_MS);
						}else if(myTape.tsStatus == 2)			//快进发送脉冲
						{
							
							osal_start_reload_timer(tape_task_id, TAPE_PLAYING_EVENT, 2 / TICK_PERIOD_MS);

						
						}
							

        return task_event ^ TAPE_PLAYING_EVENT; //处理完后需要清除事件位
    }
    if(task_event & TAPE_FF_FAST_EVENT)
    {

							sendTapeMsg(U_COMMEND_NEXT);

							printf("FF \n");
							myTape.tsStatus = 2;

        return task_event ^ TAPE_FF_FAST_EVENT; //处理完后需要清除事件位
    }
    if(task_event & TAPE_FR_FAST_EVENT)
    {

							sendTapeMsg(U_COMMEND_PRE);

							printf("FR \n");
							myTape.tsStatus = 2;
			

        return task_event ^ TAPE_FR_FAST_EVENT; //处理完后需要清除事件位
    }
    if(task_event & TAPE_STOP_EVENT)
    {
				myTape.tsStatus = 0;
				TapePowerOff();

        return task_event ^ TAPE_STOP_EVENT; //处理完后需要清除事件位
    }
		
		
    return 0;
		
		
}

定义结构体 用于保存车机播放音乐相关信息。

/**
 * @brief 当前任务的事件回调处理函数
 * @param task_id       [任务ID]
 * @param task_event    [收到的本任务事件]
 * @return uint16       [未处理的事件]
 */
uint16 userApp_task_event_process(uint8 task_id, uint16 task_event)
{

	
	
    if(task_event & SYS_EVENT_MSG)       //判断是否为系统消息事件
    {
       osal_sys_msg_t *msg_pkt;
			 msg_pkt = (osal_sys_msg_t *)osal_msg_receive(task_id);      //从消息队列获取一条消息
			 
//			uBUTTON_ProcessOSALMsg(task_id,msg_pkt);
			uCommend_ProcessOSALMsg(task_id,msg_pkt);

        // return unprocessed events
        return (task_event ^ SYS_EVENT_MSG);
    }
	
	
	
	
    if(task_event & USERAPP_INIT_EVENT)
    {
			
			
				osal_start_reload_timer(userApp_task_id, USERAPP_EVENT, 500 / TICK_PERIOD_MS);
			
			


			

        return task_event ^ USERAPP_INIT_EVENT; //处理完后需要清除事件位
    }
		
    if(task_event & BLE_UART_RX_EVENT)
    {
			
				BLE_UART_Rx.lenth = BLE_UART_Rx.u8RxCnt;
				BLE_UART_Rx.flag = 1;
				BLE_UART_Rx.u8RxCnt = 0;
				

			

        return task_event ^ BLE_UART_RX_EVENT; //处理完后需要清除事件位
    }
	
    if(task_event & USERAPP_EVENT)
    {


			

			
			#ifndef WDEBUG
				WDOG_Feed();									// 喂狗
			#endif	
			
        return task_event ^ USERAPP_EVENT; //处理完后需要清除事件位
    }
		

		
		
    return 0;
}

5、焊接调试

根据原理图将电路板焊接好,下载程序。
在这里插入图片描述

将解码模块插入到卡带机上
在这里插入图片描述

开机上电,按mode键,进入卡带模式。

视频演示如下

https://live.csdn.net/v/325082

6、结语

有朋友反馈,找不到我,今打油诗一首

加流一壶真千金
微云澹日映寒流
信意麾毫无点误
KING_SONGING
唱奇腾怪可删修
歌咏康衢了此生
的然民仰如父母
国家涵养自建隆
王俭归来幕府非

有朋自远方来,不亦说乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/960981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于共享内存 实现Python 和c++ 传输图片

需求:c 将图片写入共享内存,python读取。将c写的共享内存的操作封装为一个so库,c 和python共同调用这个库,便于双方的操作,省去信号量的管理操作。 一,c写入端 int main(int argc, char **argv) {SharedMemoryOption…

D358周赛复盘:哈希表模拟⭐⭐+链表乘法翻倍运算(先反转)⭐⭐⭐

文章目录 2815.数组中的最大数对和思路完整版 2816.翻倍以链表形式表示的数字(先反转,再处理进位)思路完整版 补充:206.反转链表(双指针法)完整版 2817.限制条件下元素之间的最小绝对差(cpp不知…

每秒百万级高效C++异步日志实践

一个高效可拓展的异步C日志库:RING LOG,本文分享了了其设计方案与技术原理等内容 详细代码见github路径:点击打开链接 导论 同步日志与缺点 传统的日志也叫同步日志,每次调用一次打印日志API就对应一次系统调用write写日志文件…

国际音标学习笔记

目录 1.单元音2.双元音3.辅音4.音节5.自然拼读法则5.1辅音字母的音标 1.单元音 我觉得单纯的音标并不好记住,所以就跟着老师整,根据单词记住音标的发音,以下是我的理解 音标对应的单词汉化iis衣əer饿ɔorigin奥u/ʊwoman五ʌart啊eanything哎…

哪个视觉语言模型更优?InstructBLIP、MiniGPT-4?全面评估基准LVLM-eHub告诉你

夕小瑶科技说 原创 作者 | 王思若 LLaMA、GPT-3等大型语言模型实现了对自然语言强大的理解和推理能力,为AI社区构筑了强大的语言基座模型。进而,继续迭代的GPT-4,更是赋予了模型处理图像的视觉能力。 如今,构建强大的多模态模型…

有源医疗器械技术要求编写要求之附录内容

目录 一、附录A中主要安全特征内容 二、附录内容简介 1、按防电击类型分类: 2、按防电击的程度分类: 3.按对进液的防护程度进行分类: 4.按在与空气混合的易燃麻醉气或与氧或氧化亚氮混合的易燃麻醉气况下使用时的安全程度分类: 6.设备的额定电压和频率 7.设备的输入功率…

QT 发布软件基本操作

一、配置环境变量 找到Qt安装时的bin目录的路径:D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin,将目录拷贝至下述环境变量中。 打开计算机的高级系统设置 选中环境变量-->系统变量-->Path 点击编辑-->新建-->粘贴 二、生成发布软件的可执行程序 …

【Python从入门到进阶】34、selenium基本概念及安装流程

接上篇《33、使用bs4获取星巴克产品信息》 上一篇我们介绍了如何使用bs4来解析星巴克网站,获取其产品信息。本篇我们来了解selenium技术的基础。 一、什么是selenium? Selenium是一种用于自动化Web浏览器操作的开源工具。它提供了一组API(应…

SpringBoot——整合Mongodb

简单介绍 Mongdb是一个开源,高性能,无模式的文档型数据库,NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库。 使用场景 用户数据 存储位置:数据库特征:永久性存储,修改频率极低游…

【C++】C++ 引用详解 ⑩ ( 常量引用案例 )

文章目录 一、常量引用语法1、语法简介2、常引用语法示例 二、常量引用语法1、int 类型常量引用示例2、结构体类型常量引用示例 在 C 语言中 , 常量引用 是 引用类型 的一种 ; 借助 常量引用 , 可以将一个变量引用 作为实参 传递给一个函数形参 , 同时保证该值不会在函数内部被…

可观测性用观测云,观测云护航「杭州亚运会」

2023 年亚洲运动会定于 2023 年 9 月 23 日至 10 月 8 日在中国杭州举办,这是在党的二十大召开后,我国疫情防控措施优化调整后举办的最大规模、最高水平的国际综合性运动会,意义十分重大。杭州亚组委以「举办一届史上最成功的亚运会」为工作目…

【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动

目录 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 2.2 处理键盘事件完成圆形的移动 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 void Widget::on_saveBtn_clicked() {QString filename QFileDialog::getSaveFileName(this,&…

MySQL数据库学习【进阶篇】

MySQL数据库学习进阶篇 MySQL进阶篇已经更新完毕,点击网址查看👉:MySQL数据库进阶篇

【点击checkbox复选框,显示or隐藏某区域】

功能&#xff1a; 1. 选中复选框&#xff0c;显示隐藏的区域&#xff1b; 2. 取消选中&#xff0c;再隐藏该显示的区域。 方法1&#xff1a;在layui jquery框架下 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta char…

接口测试系列 —— 什么是接口测试?

接口测试系列 为什么要做这个事情&#xff1f; 对自己过往在接口测试上的经验&#xff0c;写一个小结的系列文章&#xff0c;是一个系统性的思考和知识构建。发布的同时&#xff0c;也是希望获得更多感兴趣的同学的意见和反馈&#xff0c;可以把这个部分做的更好。 接口测试概…

充电比加油还快?一秒一公里,全液冷超充项目试点,5 年全覆盖?

华为中国数字能源旗舰峰会广西站在桂林举行&#xff0c;标志着桂林在数字能源领域的迈进。与此同时&#xff0c;桂林市和华为数字能源展开了合作&#xff0c;启动了全液冷超充示范项目&#xff0c;为城市的电动车充电基础设施添砖加瓦。 根据华为数字能源技术有限公司副总裁何波…

如何解决微信收款异常问题

一、自查原因 当您遇到微信收款异常问题时&#xff0c;首先需要了解异常的原因。可能的原因包括违反微信支付相关规定、存在异常交易行为、账户安全问题等。了解原因后&#xff0c;您可以采取相应的措施进行处理。 二、联系客服 您可以通过微信支付官方客服渠道咨询具体的问题&…

Is f(z)=1/z truly an analytic function

https://math.stackexchange.com/questions/755566/is-fz-1-z-truly-an-analytic-function

react快速开始(三)-create-react-app脚手架项目启动;使用VScode调试react

文章目录 react快速开始(三)-create-react-app脚手架项目启动&#xff1b;使用VScode调试react一、create-react-app脚手架项目启动1. react-scripts2. 关于better-npm-runbetter-npm-run安装 二、使用VScode调试react1. 浏览器插件React Developer Tools2. 【重点】用 VSCode …

Mediasoup在node.js下多线程实现

mediasoup基于socket.io的交互消息来完成join-room的请求过程。Join的过程&#xff0c;实际就是获取stream的过程&#xff0c;也就是视频加载时间(video-load-speed)。在RTMP系统&#xff0c;视频加载时间是秒开。Mediasoup给出的第一个frame是I-frame&#xff0c;但由于交互的…