全网首发!奔驰宝马奥迪卡带机卡带通道激活模块,无损安装可以接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 | 使能 |
| GND | gnd |
| CLOCK-CC | 时钟线 |
| VCC 12V | 12V |
| 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 状态的服务端最后会怎么样呢? 服务端给客户端发消息了:客户端连接已被关闭ÿ…...
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题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。一种情况…...
【已解决】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. 概述 概念:相当于是一本书的目录,是以‘列’为维度进行建立的使用场景:如果我们要查询一个表中的某个…...
淘金币自动化脚本:每天节省20分钟,解放双手的终极指南
淘金币自动化脚本:每天节省20分钟,解放双手的终极指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinb…...
武汉大学等高校联手揭露AI助手的“记忆盲区“:它们真的记得你吗?
这项由武汉大学、香港中文大学和香港科技大学联合开展的研究以预印本形式于2026年5月发表,论文编号为arXiv:2605.06527,有兴趣深入了解的读者可以通过该编号查询完整论文。你有没有试过这样一件事:你和手机里的AI助手聊了很久,告诉…...
第八篇:《软件测试的经济学:投入与回报》
在商业环境中,测试不是“免费”的——它需要人力、工具、时间。但缺陷也不是免费的——它可能导致损失、赔偿、用户流失。如何让管理者理解“投入测试是投资,而不是成本”?本文将从经济学角度分析测试的投资回报率(ROI)…...
如何告别模组管理噩梦:XXMI启动器的3个革命性解决方案
如何告别模组管理噩梦:XXMI启动器的3个革命性解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为管理多个游戏的模组而感到头疼?每个游…...
CANN 模型转换与适配:从 PyTorch 到 Ascend OM 的完整指南
模型转换是昇腾落地的第一道坎。不管你用 PyTorch、TensorFlow 还是 MindSpore,最终都要变成 Ascend 的 .om 模型才能在 NPU 上跑。 这篇文章讲清楚:模型转换的完整流程、常见问题和优化技巧。 为什么需要模型转换? 昇腾 NPU 不能直接运行 Py…...
3分钟彻底清理Windows系统:Win11Debloat让你的电脑重获新生
3分钟彻底清理Windows系统:Win11Debloat让你的电脑重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter a…...
3个核心功能:用HSTracker将炉石传说数据转化为你的制胜优势
3个核心功能:用HSTracker将炉石传说数据转化为你的制胜优势 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 在炉石传说的竞技场上,每一张卡牌的抽…...
Photoshop图层批量导出终极指南:告别手动操作的时代
Photoshop图层批量导出终极指南:告别手动操作的时代 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址: https…...
.9017R 座充充电管理 IC
概述 .9017R 是恒流/恒压座充充电管理芯片,主要应用于单节锂电池充电。应用电路无需外接检测电阻,其内部为MOSFET 结构,因此也无需外接反向二极管。 .9017R 在大功率和高环境温度下可以自动调节充电电流以限制芯片温度。它的充电电压固定在4.…...
极域电子教室破解终极指南:如何重获电脑控制权而不被老师发现
极域电子教室破解终极指南:如何重获电脑控制权而不被老师发现 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在学校机房上课时,面对老师全屏广播…...
