ok3506测评(一) 一、前言 在智能工业、物联网及边缘计算领域的开发需求持续攀升的背景下,开发者对开发板的核心诉求逐渐聚焦于 “性能均衡、成本可控、开发高效” 三大关键点。飞凌嵌入式 OK3506-S12 Mini 开发板(基于瑞芯微 RK3506 处理器)的推出,恰好精准命中这一市场痛点 —— 以含税 ¥88 起的极致价格,实现三核 Cortex-A7 架构的高性能输出,同时兼顾低功耗、丰富接口与完善软件生态,成为嵌入式开发领域 “性价比标杆” 级产品。无论是高校学生的课程实践、工程师的原型验证,还是中小企业的产品预研,这款尺寸仅 65mm×105mm 的 Mini 开发板都能以 “低成本高回报” 的优势降低开发门槛,其 10~15 年的生命周期保障更能为长期项目提供稳定支撑。本文将从开销测评、性能解析、Xshell 连接实操三大维度,全面拆解这款开发板的核心价值与使用方法。 二、开销测评:极致性价比的成本优势 OK3506-S12 Mini 开发板的成本优势体现在 “硬件定价 + 开发降本” 双重层面: 硬件开销 :提供两种高性价比配置,256MB 内存 + 256MB 存储版本含税仅 ¥88,512MB 内存 + 512MB 存储版本含税 ¥128,相较于同性能级别的工业开发板(普遍定价 200 元以上),价格降低 50% 以上。包装标配开发板主体、Type-A to Type-C 转接线及配件包,无需额外采购基础配件,进一步压缩初期投入。 开发降本 :板载树莓派 40Pin GPIO 接口,可直接兼容树莓派生态的传感器、执行器等外设,避免定制化接口的开发成本;矩阵 IO 设计支持 98 个功能信号任意映射,减少 PCB 布线的修改成本;深度优化的存储驱动与 eMMC 健康诊断工具,能降低因存储故障导致的后期维护开销。对于批量开发场景,其低成本特性可大幅摊薄原型验证阶段的物料成本,助力产品快速上市。 三、性能介绍:均衡高效的硬件与软件表现 (一)核心硬件性能 处理器与功耗 :搭载三核 ARM Cortex-A7 架构的 RK3506 处理器,专为智能工业应用设计,集成 2D 硬件引擎与显示输出引擎,可有效降低 CPU 开销,满足图像显示与多任务处理需求;核心板满载运行实测功耗仅 0.7W,无需额外散热装置,适配低功耗场景需求。 接口扩展性 :集成 2 路原生 CAN-FD 接口、RMII、UART、USB2.0 OTG、Display 等丰富接口,支持连接 ADC、DAC 芯片、DVP 摄像头及 QSPI LCD 显示屏;高速并行总线 DSMC 支持 ARM 与 FPGA 主从模式通信,进一步拓展硬件连接场景。 存储与稳定性 :通过深度存储驱动优化提升读写效率,搭配 eMMC 健康诊断工具,可实时监测存储状态,延长设备使用寿命,减少因存储耗尽导致的系统故障。 (二)软件生态性能 全面支持 Linux 6.1 操作系统、LVGL 9.2 图形库、AMP 架构及 Linux RT 实时系统,具备强大的软件兼容性,可轻松应对从显示控制到实时任务处理的多样化开发需求;官方提供完整的开发资料包(含镜像源码、硬件手册、原理图等),缩短开发适配周期。 四、Xshell 连接过程:分步实操指南 (一)连接前准备 硬件:OK3506-S12 Mini 开发板、Type-A to Type-C 转接线、网线(可选)、电脑; 软件:Xshell 客户端(建议使用 5.0 及以上版本); 前提:开发板已刷入官方提供的 Linux 镜像,电脑安装串口驱动(可通过设备管理器查看端口)。 (二)具体连接步骤 串口连接(初始配置) 用 Type-A to Type-C 转接线连接开发板与电脑,接通开发板电源; 打开 Xshell,点击「文件」→「新建」,协议选择「SERIAL」(串口); 配置串口参数:Port 选择电脑设备管理器中显示的 USB 端口(如 COM3),Baud Rate 设置为 115200,其余参数保持默认(数据位 8、停止位 1、校验位无); 点击「连接」,成功后将显示开发板的启动日志,进入命令行界面。 关于如何实现开发板联网 这个厂商的用户手册中提到的 为了确保电脑和开发板在同一网段 下面是解决办法: 注意:以下以太网2是你可以上网的一个以太网 步骤 1:开启电脑 “以太网 2” 的网络共享功能 右键任务栏网络图标 → 选择「打开网络和 Internet 设置」→ 点击「更改适配器选项」。 找到「以太网 2」(能上网的网卡),右键 → 「属性」→ 切换到「共享」选项卡。 勾选「允许其他网络用户通过此计算机的 Internet 连接来连接」。 在「家庭网络连接」下拉框中,选择「以太网」(连接开发板的网卡)→ 点击「确定」。 此时,系统会自动为「以太网」分配 共享网段 IP (通常为 192.168.137.1,子网掩码 255.255.255.0)。 步骤 2:验证电脑 “以太网” 的 IP(开发板的网关) 打开 命令提示符 / PowerShell ,执行 ipconfig,找到「以太网」的信息: 确认其 IPv4 地址 为 192.168.137.1(这是开发板的 默认网关 )。 步骤 3:配置开发板的网络参数 开发板需配置「同网段 IP」「默认网关」「DNS 服务器」,才能通过电脑共享网络。 3.1 配置网卡 IP(与电脑以太网同网段) 登录开发板终端(如串口 / SSH),执行命令: bash ifconfig eth0 down# 关闭网卡,清除旧配置 ifconfig eth0 192.168.137.100 netmask 255.255.255.0 up# 设置IP为192.168.137.100(同网段) 执行 ifconfig eth0 验证:确认 inet addr 显示为 192.168.137.100,且网卡状态为 UP。 3.2 设置默认网关(指向电脑以太网的 IP) 执行命令: bash route add default gw 192.168.137.1# 网关指向电脑以太网的IP 执行 route -n 验证:确认 Destination 0.0.0.0 对应的 Gateway 为 192.168.137.1。 3.3 配置 DNS 服务器(解决域名解析) 执行命令: bash echo \"nameserver 114.114.114.114\" > /etc/resolv.conf# 使用国内常用DNS 步骤 4:测试网络连通性(逐层验证) 4.1 测试 “开发板 ↔ 电脑以太网” 的连接 bash ping 192.168.137.1 -c 4# 只ping4次,方便测试 若显示 64 bytes from 192.168.137.1...,说明 开发板与电脑网络层连通 。 4.2 测试 “开发板 ↔ DNS 服务器” 的连接 bash ping 114.114.114.114 -c 4 若能收到回复,说明 DNS 服务器可达 。 4.3 测试 “开发板 ↔ 外网域名” 的连接 bash ping www.baidu.com -c 4 若能解析出 IP 并收到回复,说明 开发板已成功上网 。 (可选)持久化配置(解决重启丢失) OK3506B - S12 根文件系统为只读,需将配置命令加入 开机自启脚本 (如 /etc/profile): bash echo \"ifconfig eth0 192.168.137.100 netmask 255.255.255.0 up\" >> /etc/profile echo \"route add default gw 192.168.137.1\" >> /etc/profile echo \"echo \'nameserver 114.114.114.114\' > /etc/resolv.conf\" >> /etc/profile source /etc/profile# 立即生效 关键注意点 若步骤 1 后,电脑 “以太网” 的 IP 不是 192.168.137.1,而是其他网段(如 192.168.97.x),需将开发板的 IP、网关 同步改为对应网段(例:IP 设为 192.168.97.100,网关设为 192.168.97.152)。 若测试不通,可临时关闭电脑防火墙(控制面板→Windows Defender 防火墙→关闭),排除防火墙拦截。 按以上步骤,从 “共享配置” 到 “开发板参数设置”,逐层验证后,开发板即可通过电脑共享网络上网。
2025-10-19 14:55
【国庆中秋礼品 Milk-V Duo RISC-V开发板】开箱、介绍、环境搭建、工程测试 感谢电子发烧友论坛 【贺华诞 庆中秋 | 一起来为祖国母亲送祝福吧!留言有礼】 活动的支持~ 活动礼品收到啦~ 倍思 PPAP20K-X 移动电源 Milk-V Duo V1.2 RISC-V 开发板 本文介绍了 Milk-V Duo 开发板的相关信息,包括外观展示、参数特点、主控资源、原理图等,之后进行了固件上传和工程测试。 介绍 Milk-V Duo 是一款基于 CV1800B 芯片的超紧凑型嵌入式开发平台。 它可以运行 Linux 和 RTOS,为专业人士、工业 ODM、AIoT 爱好者、DIY 爱好者和创作者提供可靠、低成本、高性能的平台。 包装 开发板的外观包装非常精致 外观 主控 CV1800B 是一款高性能、低功耗芯片,适用于住宅消费监控 IP 摄像机、家庭智能等众多产品,集成 H.264/H.265 视频压缩编码器和 ISP;支持数字宽动态、3D降噪、去雾、镜头畸变校正等图像增强和校正算法,为客户提供专业级的视频图像质量。 该芯片集成了自主研发的智能参考解决方案(人体检测、区域检测、运动检测),内置 DDR 以及完整的外围设备和外围设备,为支持客户产品开发和量产提供了高度集成且简单的解决方案。 引脚定义 原理图 硬件框图 外设 供电 摄像头 详见:Duo | Milk-V 工程测试 固件上传 下载安装并运行 balenaEtcher 软件; 加载官方最新镜像,选择 SD 卡,点击烧录按钮; 待提示烧录成功,取下 SD 卡并安装至 Milk-V Duo 板卡; 上电效果 使用 Type-C 数据线连接电脑,板载 LED 蓝色闪烁; SSH 登录 同时设备管理器显示 CDC-NCM 设备(需要手动安装驱动,详见官方文档) 打开 CMD 终端或 PowerShell,输入指令 ssh root@192.168.42.1 连接并登录板端系统,默认密码 milkv 终端执行指令 uname -a 查询系统内核 [root@milkv-duo]~# uname -a Linux milkv-duo 5.10.4-tag- #1 PREEMPT Fri Nov 22 11:31:04 CST 2024 riscv64 GNU/Linux 详见:设置工作环境 | Milk-V . 串口连接 使用 USB 转 TTL 串口线连接开发板对应引脚 Milk-V Duo USB 转 TTL 串口 TX (pin 16) RXD RX (pin 17) TXD GND (pin 18) GND 串口参数 baudrate: 115200 data bit: 8 stop bit: 1 parity: none flow control: none 使用 MobaXterm 软件连接串口,可实现相关调试。 总结 本文介绍了 Milk-V Duo 开发板的相关信息,包括外观展示、参数特点、主控资源、原理图等,之后进行了固件上传和工程测试,为该产品的快速开发和应用提供了参考。 再次感谢电子发烧友论坛【 贺华诞 庆中秋 | 一起来为祖国母亲送祝福吧!留言有礼】 活动的大力支持~
2025-10-19 13:06
纯小白,昨天弄坏个步进电机控制板,有个芯片击穿了,要用什么办法查出这个芯片的功能!,或者麻烦大佬提供维修思路2847b7e7bad9ec03dabb303ede68680b.jpg
2025-10-19 12:30
目前正在做一个移相全桥电路,副边采用同步整流,实测时变压器原边电压震荡得厉害 上图图中黄色为变压器原边波形,蓝色为副边整流MosVds波形,绿色为原边电流波形。想请教一下出现这种情况的原因以及解决办法。 上图图中为未开同步整流时的波形,黄色为变压器原边波形,蓝色为两桥臂中点波形,绿色为原边电流波形。
2025-10-19 00:58
TKB-623评估板的基础使用,非常的简单,直接用Type-C连接到电脑,就会自动有串口生成,可以用来和开发板通信。 另外,TKB-623评估板上的RX、TX引脚,也可以用USB2TTL连接到电脑来与电脑挺通信,也可以连接到其他MCU设备进行通信。 为了方便后续的测试,我研究了道生物联提供的文档,开发了一个通讯测试程序。 一、硬件连线 为了方便简单测试,我用了两个一样的USB2TTL,来连接两个TKB-623评估板到同一个USB HUB,然后连接到电脑: 等测试程序开发完成后,后续将会进行远距离通讯测试。 二、串口工具测试 我使用的是macOS系统,串口工具使用了友善串口调试助手。 简单测试过程中,同时打开了两个友善串口调试助手,左则的选择1号板的串口,右则的选择2号板的串口,然后波特率选115200,其他参考途中选择即可。 另外,需要在设置里面,设置发送的时候,自动添加\\\\r\\\\n: 设置完成,开启串口,发送AT指令,就可以看到类似途中AT_OK的返回了。 能看到AT_OK,说明和电脑的通讯正常了。 三、配对测试 在两个串口工具中,分别发送AT命令: AT+FREQ=490300000,490300000,490300000 AT+TXP=15 AT+RATE=6 AT+WORKMODE=21 通过上面的命令,就能设置TKB-623评估板进入P2P点对点通信模式。 然后,用下面的命令,就可以发送数据了: # 1号评估板 AT+SEND=I am Board-1 # 2好评估板 AT+SEND=I am Board-2 发送后,对方评估板,就能收到对应的信息: 将右则2号板收到的数据,放到工具里面转换一下,可以看到,转换后的结果,就是1号板发送的数据: 同样的,1号板收到的数据,就是2号板发送的: 四、通信测试程序开发 了解了基本的通信流程后,再仔细阅读《TK8620基于SDK2.0的AT指令使用说明_V1.3》,就可以进行实际的通讯测试程序的开发了。 为了统计传输过程中的数据丢包情况,以及准确率,我对发送的数据包,做了简单的规范: 发送过程中,会进行数据的统计分析: 然后,发送程序的逻辑如下: 接收程序的逻辑如下: 五、通信测试程序测试 分别启动发送程序和接收程序: 接收程序会自动做好配置,而发送程序,则需要一些简单的配置,根据提示操作即可: 发送程序设置完成后,就会自动开始数据发送: 发送的过程中,接收程序会及时统计收到的数据包的情况: 为了模仿丢包情况下,接收程序统计分析数据,我把间隔时间设置为了1s: 接收程序就会统计失败无效的情况: 经过反复的测试调整,通讯测试程序能够稳定运行和统计分析结果了。 后续将进行分离部署,以便进行远距离的通讯测试,并分析不同情况下的数据包发送接受情况。
2025-10-18 23:54
DBC文件是一种集成了CAN和CANFD报文格式帧的数据库,和整车厂合作开发项目时,必定会接触到DBC文件,解析DBC文件是考验一个汽车诊断工程师的终极水平题目!!!!!! 手头上刚好有和宝马公司合住的一个项目,宝马释放了一个DBC文件,本期就来用RA8D1进行DBC解析,破解整车厂通信奥秘! 板子连接,如下图所示 这里我是用了Vector公司的CANoe工具,通过连接到RA8D1开发板上的CANFD接口,只需要连接CAN_H和CAN_L就可以通信了。 1。打开RA Smart 配置软件进行CANFD配置 时钟配置如下 2。配置CANFD时钟 选择40MHZ 3。配置CANFD模块 这里有两路CANFD,只需要选择其一即可 4。以CANFD1为列子 至此配置完毕 生成代码,打开KEIL工程 5。按照如下代码封装号CANFD1接口 #ifndef __BSP_CANFD_1_H #define__BSP_CANFD_1_H #include \"hal_data.h\" #include \"stdio.h\" // CANFD1模块的调试信息输出控制 #define CANFD1_DEBUG1 #if (1 == CANFD1_DEBUG) #define CANFD1_MSG_PRINTF(format, ...)printf(\"[CANFD1 Operation] \"format\"\\\\r\\\\n\", ##VA_ARGS) #else #define CANFD1_MSG_PRINTF(format, ...) #endif #define WAIT_TIME(0xFFFF) void CANFD1_Init(void); void CAN1_Operation(void); void CANFD1_Operation(void); void CANFD_SendMessage(uint32_t U32_transmitCANid, uint8_t *U8_dataarr, uint8_t U8_DLC); void CAN_SendMessage(uint32_t U32_transmitCANid, uint8_t *U8_dataarr, uint8_t U8_DLC); #endif #include \"bsp_canfd1.h\" /* CAN 初始化函数 */ void CANFD1_Init(void) { fsp_err_t err = R_CANFD_Open(&g_canfd1_ctrl, &g_canfd1_cfg); assert(FSP_SUCCESS == err); } /* CANFD Channel 1 Acceptance Filter List (AFL) rule array / const canfd_afl_entry_t p_canfd1_afl[CANFD_CFG_AFL_CH1_RULE_NUM] = { { .id = { / 指定要接受的ID、ID类型和帧类型。 */ .id= 0xfff, .frame_type = CAN_FRAME_TYPE_DATA, .id_mode = CAN_ID_MODE_STANDARD }, .destination = { /* 如果启用了DLC检查,则任何短于以下设置的消息都将被拒绝。 */ .minimum_dlc = CANFD_MINIMUM_DLC_0, /* 也可以指定接收消息缓冲区(RX MB)来存储接受的帧。 * RX MB没有中断或重写保护,必须使用R_CANFD_INFO Get和R_CANFD_READ进行检查。 */ .rx_buffer= CANFD_RX_MB_0, /* 指定要将筛选的消息发送到的FIFO。多个FIFO可以一起进行或运算。 */ .fifo_select_flags = CANFD_RX_FIFO_0 } }, }; /* CAN 帧 */ can_frame_t canfd1_tx_frame; //CAN transmit frame can_frame_t canfd1_rx_frame; /* 保存帧接收状态信息 */ can_info_t canfd1_rx_info; /* 要在回调函数中设置的标志 */ volatile bool canfd1_tx_complete_flag = false; volatile bool canfd1_rx_complete_flag = false; volatile bool canfd1_err_status_flag = false; volatile canfd_error_t canfd1_err_status = (canfd_error_t) 0; static uint32_t CANFD_LengthToDLC(uint8_t length); /* CANFD1 中断回调函数 */ void canfd1_callback(can_callback_args_t * p_args) { switch (p_args->event) { case CAN_EVENT_RX_COMPLETE://接收完成中断 { canfd1_rx_complete_flag = true; //canfd1接收到数据 /* 读取接收帧 */ memcpy(&canfd1_rx_frame, &(p_args->frame), sizeof(can_frame_t)); break; } case CAN_EVENT_TX_COMPLETE://传输完成中断 { canfd1_tx_complete_flag = true; //canfd0数据发送完成 break; } case CAN_EVENT_ERR_WARNING: //error warning event case CAN_EVENT_ERR_PASSIVE: //error passive event case CAN_EVENT_ERR_BUS_OFF: //error Bus Off event case CAN_EVENT_BUS_RECOVERY://Bus recovery error event case CAN_EVENT_MAILBOX_MESSAGE_LOST: //overwrite/overrun error event case CAN_EVENT_ERR_BUS_LOCK://Bus lock detected (32 consecutive dominant bits). case CAN_EVENT_ERR_CHANNEL: //Channel error has occurred. case CAN_EVENT_TX_ABORTED://Transmit abort event. case CAN_EVENT_ERR_GLOBAL://Global error has occurred. case CAN_EVENT_TX_FIFO_EMPTY://Transmit FIFO is empty. { canfd1_err_status_flag = true;//设置标志位 /* 获取错误状态 */ canfd1_err_status = (canfd_error_t) p_args->error; break; } default: { break; } } } static uint32_t CANFD_LengthToDLC(uint8_t length) { uint32_t dlc_result; if (length <= 8) { // 对于0-8字节,DLC直接等于长度值,位移到正确位置 dlc_result = ((uint32_t)length); } else if (length <= 12) { dlc_result = CANFD_MINIMUM_DLC_12; } else if (length <= 16) { dlc_result = CANFD_MINIMUM_DLC_16; } else if (length <= 20) { dlc_result = CANFD_MINIMUM_DLC_20; } else if (length <= 24) { dlc_result = CANFD_MINIMUM_DLC_24; } else if (length <= 32) { dlc_result = CANFD_MINIMUM_DLC_32; } else if (length <= 48) { dlc_result = CANFD_MINIMUM_DLC_48; } else { dlc_result = CANFD_MINIMUM_DLC_64; } // 精简调试输出 - 减少堆栈使用 // 移除调试输出避免堆栈问题 return dlc_result; } /* Transmit a CAN message. */ void CAN_SendMessage(uint32_t U32_transmitCANid, uint8_t *U8_dataarr, uint8_t U8_DLC) { fsp_err_t err = FSP_SUCCESS; uint32_t time_out = WAIT_TIME; /* 更新传输帧的参数 */ canfd1_tx_frame.id = U32_transmitCANid; canfd1_tx_frame.id_mode = CAN_ID_MODE_STANDARD; canfd1_tx_frame.type = CAN_FRAME_TYPE_DATA; canfd1_tx_frame.data_length_code = U8_DLC; canfd1_tx_frame.options = 0; /* 填充将要传输的帧数据 */ memcpy(canfd1_tx_frame.data, U8_dataarr, canfd1_tx_frame.data_length_code); CANFD1_MSG_PRINTF(\"CANID: 0x%x 传输CAN数据\",canfd1_tx_frame.id); /* 通过 mail box #0 传输数据 */ err = g_canfd_on_canfd.write(&g_canfd1_ctrl, CAN_MAILBOX_NUMBER_0, &canfd1_tx_frame); assert(FSP_SUCCESS == err); } /* Transmit a CANFD message. */ void CANFD_SendMessage(uint32_t U32_transmitCANid, uint8_t *U8_dataarr, uint8_t U8_DLC) { fsp_err_t err = FSP_SUCCESS; uint32_t time_out = WAIT_TIME; /* 更新 FD 帧的参数 */ canfd1_tx_frame.id = U32_transmitCANid; canfd1_tx_frame.id_mode = CAN_ID_MODE_STANDARD; canfd1_tx_frame.type = CAN_FRAME_TYPE_DATA; canfd1_tx_frame.data_length_code = 64;//CANFD_LengthToDLC(U8_DLC); canfd1_tx_frame.options = CANFD_FRAME_OPTION_FD | CANFD_FRAME_OPTION_BRS; /* 填充将要在 FD 帧中发送出去的帧数据 */ for( uint16_t j = 0; j < canfd1_tx_frame.data_length_code; j++) { canfd1_tx_frame.data[j] = (uint8_t) U8_dataarr[j]; } /* 通过 mail box #0 传输数据 */ err = R_CANFD_Write(&g_canfd1_ctrl, CAN_MAILBOX_NUMBER_0, &canfd1_tx_frame); assert(FSP_SUCCESS == err) } 6。解析DBC文件 首先让大家见识下DBC到底长啥样 用软件打开 上面就是DBC文件了 这些就是它包含的CAN报文 7。在主函数中解析DBC文件 #include \"hal_data.h\" #include \"bsp_debug_uart.h\" #include \"bsp_canfd1.h\" #include \"CANFD_A2B.h\" extern volatile bool uart_send_complete_flag; //CAN extern volatile bool canfd1_rx_complete_flag; extern can_frame_t canfd1_rx_frame; extern can_frame_t canfd1_tx_frame; FSP_CPP_HEADER void R_BSP_WarmStart(bsp_warm_start_event_t event); FSP_CPP_FOOTER static const uint8_ttxData[10] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x70, 0x80,0xff,0xaa}; /*******************************************************************************************************************//** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.This function is called by main() when no RTOS is used. *********************************************************************************************************************/ void hal_entry(void) { / TODO: add your own code here */ Debug_UART9_Init(); CANFD1_Init(); printf(\"RA8D1 CANFD解析DBC文件报文信息\\\\r\\\\n\"); while(1) { //R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS); //CAN_SendMessage(0x112, txData, 2); //CANFD_SendMessage(0x223, txData,10); if (true == canfd1_rx_complete_flag) { canfd1_rx_complete_flag = false; #if 0 printf(\"Canfd6 Last Receive Pdu: \\\\r\\\\n\"); printf(\"ID: 0x%08x \\\\r\\\\n\", canfd1_rx_frame.id); printf(\"DataLength: %d \\\\r\\\\n\", canfd1_rx_frame.data_length_code); printf(\"Data: \\\\r\\\\n\"); for (uint32_t i = 1; i <= canfd1_rx_frame.data_length_code; i++) { printf(\"%d\", canfd1_rx_frame.data[i - 1]); if (i % 8 == 0) { printf(\"\\\\r\\\\n\"); } else { } } printf(\"\\\\r\\\\n\"); #endif if (canfd1_rx_frame.id == CANFD_A2_B_EAMP_1_FRAME_ID)//0x461 { canfd_a2_b_eamp_1_unpack(&EAMP_1,canfd1_rx_frame.data, canfd1_rx_frame.data_length_code); printf(\"STAT_AMPNaviVolume:0x%x \\\\r\\\\n\",EAMP_1.stat_amp_navi_volume);//反馈-导航音量设定 printf(\"STAT_AMPVRVolume:0x%x \\\\r\\\\n\",EAMP_1.stat_ampvr_volume);//反馈语音音量设定 printf(\"STAT_AMPKeyTone: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_key_tone);//反馈按键音开关 printf(\"STAT_AMPMediaVolume: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_media_volume);//反馈媒体音量设定 printf(\"STAT_AMPPhoneVolume: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_phone_volume);//反馈电话音量设定 printf(\"STAT_AMPSoundFocus:0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_focus);//反馈音场(最佳听音位)设定 printf(\"STAT_AMPSoundEffect: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_effect);//反馈-音效设定(预设EQ) printf(\"STAT_AMPSoundEffectBass: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_effect_bass);//反馈-低音设定(用户自定义EQ下) printf(\"STAT_AMPSoundEffectMidrange: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_effect_midrange);//反馈-中音设定(用户自定义EQ下) printf(\"STAT_AMPSoundEffectTreble:0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_effect_treble);//反馈-高音设定(用户自定义EQ下) printf(\"STAT_AMPSoundFieldBalance:0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_field_balance);//反馈-Balance设定(用户自定义声场) printf(\"STAT_AMPSoundFieldFader: 0x%x \\\\r\\\\n\",EAMP_1.stat_amp_sound_field_fader);//反馈-反馈-Fader设定(用户自定义声场) printf(\"STAT_REQ_AMPA2BMediaSound:0x%x \\\\r\\\\n\",EAMP_1.stat_req_ampa2_b_media_sound);//媒体音源需求状态 printf(\"STAT_REQ_AMPA2BNaviSound:0x%x \\\\r\\\\n\",EAMP_1.stat_req_ampa2_b_navi_sound); //导航音源需求状态 printf(\"STAT_REQ_AMPA2BVRSound:0x%x \\\\r\\\\n\",EAMP_1.stat_req_ampa2_bvr_sound);//VR/Siri音源需求状态 printf(\"STAT_REQ_AMPA2BTTSSound: 0x%x \\\\r\\\\n\",EAMP_1.stat_req_ampa2_btts_sound);//TTS音源需求状态 printf(\"STAT_REQ_AMPA2BPhoneSound:0x%x \\\\r\\\\n\",EAMP_1.stat_req_ampa2_b_phone_sound);//电话/Tbox音源需求状态 printf(\"STAT_REQ_AMPAlarm:0x%x \\\\r\\\\n\",EAMP_1.stat_req_amp_alarm);//警报音需求状态 } else if (canfd1_rx_frame.id == CANFD_A2_B_EAMP_2_FRAME_ID)//0x474 { canfd_a2_b_eamp_2_unpack(&EAMP_2,canfd1_rx_frame.data, canfd1_rx_frame.data_length_code); printf(\"STAT_AMPMediaDuck:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_media_duck); //发送媒体降音反馈给主机 printf(\"STAT_AMPSpeedVolume: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_speed_volume);//反馈-随速补偿等级设定 printf(\"STAT_AMPMute:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_mute);//反馈-媒体音量开关 printf(\"STAT_AMPRestoreDefaults: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_restore_defaults);//恢复默认音频参数设置状态 printf(\"STAT_AMPAlarmVolume: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_alarm_volume);//警报音量值状态 printf(\"STAT_Headrest_Mode:0x%x \\\\r\\\\n\",EAMP_2.stat_headrest_mode);//头枕模式状态 printf(\"STAT_AMPSoundEffectMegaBass: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_sound_effect_mega_bass); //重低音设定值反馈 printf(\"STAT_AMPSoundEffectMidBass:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_sound_effect_mid_bass);//中低音设定值反馈 printf(\"STAT_AMPSoundEffectMidTreble:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_sound_effect_mid_treble);//中高音设定值反馈 printf(\"STAT_VirtualSbwfrOnOff:0x%x \\\\r\\\\n\",EAMP_2.stat_virtual_sbwfr_on_off);//虚拟现场设定状态 printf(\"STAT_SurndFnOnOff:0x%x \\\\r\\\\n\",EAMP_2.stat_surnd_fn_on_off);//3D环绕设定状态 printf(\"STAT_AMPBackgroundVolume:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_background_volume);//背景音(迎宾音)音量值状态 printf(\"STAT_AMPSoundBypass: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_sound_bypass);//第三方APP打开时,外置功放做音效bypass处理状态 printf(\"STAT_AMPPwrRdySts:0x%x \\\\r\\\\n\",EAMP_2.stat_amp_pwr_rdy_sts);//A2B交互成功并支持出声后,反馈Ready printf(\"STAT_AMPVersion: 0x%x \\\\r\\\\n\",EAMP_2.stat_amp_version);//版本号 } } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } /*******************************************************************************************************************//** This function is called at various points during the startup process.This implementation uses the event that is called right before main() to set up the pins. @param[in]event Where at in the start up process the code is currently at **********************************************************************************************************************/ void R_BSP_WarmStart (bsp_warm_start_event_t event) { if (BSP_WARM_START_RESET == event) { #if BSP_FEATURE_FLASH_LP_VERSION != 0 /* Enable reading from data flash. */ R_FACI_LP->DFLCTL = 1U; /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */ #endif } if (BSP_WARM_START_POST_C == event) { /* C runtime environment and system clocks are setup. */ /* Configure pins. */ R_IOPORT_Open(&g_ioport_ctrl, &IOPORT_CFG_NAME); } } #if BSP_TZ_SECURE_BUILD FSP_CPP_HEADER BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable (); /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */ BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable () { } FSP_CPP_FOOTER #endif 8。打开Vector的CANoe软件上位机 加载DBC文件进行发送 这里,我们发送报文0X461 每间隔500ms周期发送一次 打开串口助手 我们可以修改其中的 把它改为1 至此,DBC解析正确完成!!!!!! 破解了整车厂的奥秘——————
2025-10-18 18:12
新手小白,想请懂的帮忙看一看这样设计升压电路可以吗,有没有什么问题,电路有一个VIN(5V),两个VOUT(一个还是输出5V,另一个输出9V,同时输出使用),升压用的MT3608和SS34A,接口都是XH2.54 2P,谢谢谢谢。
2025-10-18 17:06
咨询一下各位大佬!这怎么解决啊
2025-10-18 16:56
请教一下各位用启臣微CR5843AS这个芯片的电源适配器,在8脚HV引脚上的二极管和电阻的选型有没有要求,客户应用的二极管出现了短路现象导致零火线LN也出现了短路炸机现象
2025-10-18 15:02
我们正在开发一款通过手势实时控制音乐的嵌入式可穿戴设备(架构如图:nRF5340主控 + ICM-42607 IMU)。希望重构听众与音乐之间的关系。在早期小批量生产中,我们面临两个核心挑战,希望与各位硬件同仁探讨: PCBA成本优化:当前BOM成本中定制软硬结合板占比过高(约120元)。在保证可靠性的前提下,是否有更优的方案(如采用常规FR-4 PCB+柔性连接线)?对于0402/0201封装元件的小批量贴片,如何有效控制加工损耗与成本? 低延迟手势识别:目标是将传感器数据采集、姿态解算到蓝牙指令发出的端到端延迟控制在10ms以内。在软件层面,除优化传感器FIFO与中断服务程序(ISR)外,是否需在MCU上部署轻量级AI模型(如TinyML)进行本地手势识别,以替代传统滤波算法,平衡实时性与准确性 最终的核心目标是在控制早期延迟的情况下,早期的PCBA成本(元器件+生产)单个控制在100以内。 诚邀各位嵌入式开发与硬件设计高手不吝赐教,共同解决这些实际工程问题。
2025-10-18 13:04