当前位置: 首页 > news >正文

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

文章目录

    • 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);}elseif ((myTape.tsReceiveData[0] == 0x52) || (myTape.tsReceiveData[0] == 0x62))		//关机{osal_set_event(tape_task_id, TAPE_STOP_EVENT);}elseif (((myTape.tsReceiveData[0]&0xf0) == 0xf0)&&(preData==0xda)){osal_set_event(tape_task_id, TAPE_INIT_EVENT);}elseif ((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);}elseif ((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);}elseif ((myTape.tsReceiveData[0] ==0xe7)&&(preData==0xea))			//切换箭头向下{TAPE_MEFE(TAPE_HIGHT);}	elseif ((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);							//关闭外部中断1HAL_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 eventsreturn (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 WDEBUGWDOG_Feed();									// 喂狗#endif	return task_event ^ USERAPP_EVENT; //处理完后需要清除事件位}return 0;
}

5、焊接调试

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

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

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

视频演示如下

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

6、结语

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

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

有朋自远方来,不亦说乎

相关文章:

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

文章目录 1.前言2.时序逆向分析2.1协议分析2.2卡带音频通道引出 3、PCB设计4、程序设计5、焊接调试6、结语 1.前言 ​ 之前写过四篇关于车机增加音频输入的方法。 1、07宝来经典车机CD收音机(RC668)改装增加蓝牙播放音乐 2、全网首发!老大…...

反弹shell总结

反弹shell总结 讲在前面说的话:反弹shell总结nc反弹shell正向shell反向shell正向shell(服务端被攻击):反向shell(客户端被攻击):无nc反弹shellpython反弹shellbash反弹shellPHP反向shellPerl反向shellJava反弹shellsocat 反弹shellRuby反弹shellLua反弹shellAwk 反弹she…...

[机缘参悟-103] :IT人关于接纳的思考与感悟

目录 前言: 一、接纳 1.1 什么是接纳 1.2 对接纳的误解 1.3 接纳的含义 1.4 "存在即合理" VS 接纳 1.5 接纳 VS 躺平 VS 随遇而安 1.6 为什么现实总是那么不尽人意 1.7 现实世界的多样性 1.8 接纳与认命 1.9 不接纳的表现 前言: …...

甄知携AIGC新升级产品参与首届人工智能生成内容国际会议,共探AIGC最前沿技术

首届人工智能生成内容国际会议(2023The 1st International Conference on AI-generated Content (AIGC2023)于2023年8月25-26日在中国上海举行。本次会议得到了复旦大学、中国科技大学、同济大学、上海交通大学、上海人工智能实验室、香港中文大学等知名院校和研究机构的大力支…...

4.9 已建立连接的TCP,收到SYN会发生什么?

1. 客户端的 SYN 报文里的端口号与历史连接不相同 此时服务端会认为是新的连接要建立,于是就会通过三次握手来建立新的连接。 旧连接里处于 Established 状态的服务端最后会怎么样呢? 服务端给客户端发消息了:客户端连接已被关闭&#xff…...

leetcode 365 水壶问题

有一个水壶容量或者两个水壶加起来总容量为目标容量 总共有八种选择:第一种倒满x,第二种倒满y,第三种清空x,第四种清空y,第五种x 倒给 y y能装满 ,第六种 x 倒给 y x倒完, 。。。。 这里用深度遍历,时间超时 class Solution {public boole…...

django/CVE-2017-12794XSS漏洞复现

docker搭建漏洞复现环境 漏洞原理看帮助文档 # Django debug page XSS漏洞(CVE-2017-12794)分析Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评…...

【学习笔记】计算机视觉对比学习综述

计算机视觉对比学习综述 前言百花齐放InstDiscInvaSpreadCPCCMC CV双雄MoCoSimCLRMoCo v2SimCLR v2SwAV 不用负样本BYOLSimSiam TransformerMoCo v3DINO 总结参考链接 前言 本篇对比学习综述内容来自于沐神对比学习串讲视频以及其中所提到的论文和博客,对应的链接详…...

【Linux】fork函数的基础知识

文章目录 前言一、fork的返回值二、常见问题 1.为什么fork要给子进程返回0,给父进程返回子进程pid?2.一个函数返回两次值怎么理解? 3.一个变量怎么会有不同的内容? 4.fork函数干了什么? 前言 fork初识: …...

代码随想录算法训练营day48 | LeetCode 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

198. 打家劫舍(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台) 思路:dp题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。一种情况&#xf…...

【已解决】Java 后端使用数组流 Array.stream() 将数组格式的 Cookie 转换成字符串格式

🎉工作中遇到这样一个场景:远程调用某个接口,该接口需要用户的 Cookie 信息进行权限认证,认证通过之后才可以打通并返回数据。 在后端拿到 httpServletRequest 后,调用 getCookies() 方法,返回的是一个 Coo…...

Redis——》如何评估锁过期时间

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

完整开发实现公众号主动消息推送,精彩内容即刻到达

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…...

获取ip(公网和内网) 前端通过高德api获取位置信息

获取ip(公网和内网) 前端通过高德api获取位置信息 获取ip //获取公网ip getIp() {this.$axios.get(http://api.ipify.org).then((res) > {if (res) {console.log(res, 公网ip);}}).catch((e) > {console.log(e, e);}); },//获取内网ip this.getIP(…...

linux打开端口命令是什么

linux打开端口命令是什么 linux开启端口的命令是 1 firewall-cmd --zonepublic --add-port端口/通讯协议 --permanent 需要注意的是,我们在开启指定端口后需要重启防火墙。 示例如下: 1、开启防火墙 1 systemctl start firewalld 2、开放指定端…...

从《孤注一掷》出发,聊聊 SSL 证书的重要性

你去看《孤注一掷》了吗?相信最近大家的朋友圈和抖音都被爆火电影《孤注一掷》成功刷屏。取材于上万真实案例的《孤注一掷》揭露了缅甸诈骗园区残暴的统治,以及电信诈骗中系统性极强的诈骗技巧,引发了大量讨论。 图片来源于电影《孤注一掷》…...

专题:曲面的切平面、法线

假设曲面方程为隐函数 F ( x , y , z ) 0 ,点 M ( x 0 , y 0 , z 0 ) 是其上一点 又在点 M 处任意引一条在曲面上的曲线,设该曲线参数方程为: { x φ ( t ) y ψ ( t ) z ω ( t ) ,且当 t t 0 时, x x 0 , y y…...

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…...

Revit SDK:AutoJoin 自动合并体量

前言 Revit 有一套完整的几何造型能力,每一个体量都是一个GenericForm,这些体量可以通过拉伸、扫掠等创建。这个例子介绍如何将他们合并成一个体量。 内容 合并体量的关键接口: // Autodesk.Revit.DB.Document public GeomCombination Com…...

MYSQL(索引、事务)

文章目录 一、索引二、事务 一、索引 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系 1. 概述 概念:相当于是一本书的目录,是以‘列’为维度进行建立的使用场景:如果我们要查询一个表中的某个…...

Cursor实现用excel数据填充word模版的方法

cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

day36-多路IO复用

一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

Bean 作用域有哪些?如何答出技术深度?

导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答&#xff0c…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...