全网首发!奔驰宝马奥迪卡带机卡带通道激活模块,无损安装可以接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. 概述 概念:相当于是一本书的目录,是以‘列’为维度进行建立的使用场景:如果我们要查询一个表中的某个…...

部署问题集合(二十三)设置Docker容器内的中文字符集,解决某些情况下中文乱码的问题
前言: 同事给了一个服务,在Windows环境下怎么跑都正常,但一到Linux虚拟机里就中文乱码起初就想到了可能是字符集的问题,但调整了半天也没见效果,最后隔了几天突然想到,我是构建Docker跑的,而且…...

Web AP—PC端网页特效
PC端网页特效 代码下载 元素偏移量 offset 系列 offset 翻译过来就是偏移量, 我们使用 offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。 获得元素距离带有定位父元素的位置获得元素自身的大小(宽度高度&#x…...

Spring线程池ThreadPoolTaskExecutor使用
为什么使用线程池? 降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行…...

spring mvc的执行流程
请求拦截。用户发起请求,请求先被sevlet拦截,转发给spring mvc框架请求转发。spring mvc里面的DispcherServlet会接收到请求并转发给HandlerMapping匹配接口。HandlerMapping负责解析请求,根据请求信息和配置信息找到匹配的controller类&…...

docker作业
目录 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 1.1启动镜像 1.2启动cloud镜像 1.3浏览器访问 编辑 2、安装搭建私有仓库 Harbor 2.1下载docker-compose 2.2 磁盘挂载,保存harbor 2.3 修改配置文件 2.4安装 2.5浏览器访问 2.6 新…...

java实现本地文件转文件流发送到前端
java实现本地文件转文件流发送到前端 Controller public void export(HttpServletResponse response) {// 创建file对象response.setContentType("application/octet-stream");// 文件名为 sresponse.setHeader("Content-Disposition", "attachment;…...
2020ICPC南京站
K K Co-prime Permutation 题意:给定n和k,让你构造n的排列,满足gcd(pi, i)1的个数为k。 思路:因为x和x-1互质,1和任何数互质,任何数和它本身不互质 当k为奇数时,p11,后面k-1个数…...

Linux 中的 chsh 命令及示例
介绍 bash shell 是 Linux 最流行的登录 shell 之一。但是,对于不同的命令行操作,可以使用替代方法。chshLinux 中的( change shell )命令使用户能够修改登录 shell 。 以下教程...

JavaScript 数组如何实现冒泡排序?
冒泡排序是一种简单但效率较低的排序算法,常用于对小型数据集进行排序。它的原理是多次遍历数组,比较相邻元素的大小,并根据需要交换它们的位置,将最大(或最小)的元素逐渐“冒泡”到数组的一端。这个过程会…...

ZooKeeper集群环境搭建
🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...