# MCU 接口测试报告（含回复原始数据）

测试时间: 2026-05-16
测试环境: 192.168.0.66 / /dev/ttyS7 @ 460800

---

## 测试总结

### 总体统计

| 方向 | 总数 | 已测 | 待测 | 跳过 | 说明 |
|------|------|------|------|------|------|
| **A2M (ARM→MCU)** | **44** | **35** | **0** | **9** | 主动发送命令测试 |
| **M2A (MCU→ARM)** | **34** | **9** | **0** | **25** | 通过A2M触发观察，需CAN的25条不可达 |
| **合计** | **78** | **44** | **0** | **34** | |

### A2M 细分

| 分类 | 总数 | 已测 | 待测 | 跳过 | 说明 |
|------|------|------|------|------|------|
| Public A2M | 30 | 24 | 0 | 6 | 已测含sleep/arm_reset; 跳过含4条死锁+factory+force_upgrade |
| Radio A2M | 7 | 7 | 0 | 0 | 全部已测（含AMS/FWD/BWD/STOP/SWITCH） |
| Update A2M | 7 | 4 | 0 | 3 | 已测: upgrade_run+req+begin+end; 跳过: data/boot_* |

### M2A 细分

| 分类 | 总数 | 已观测 | 需CAN | 说明 |
|------|------|--------|-------|------|
| Public M2A | 26 | 8 | 13(+5休眠) | 已观测: LINE_DETECT/MCU_VERSION/TIME_INFO/SYS_STATUS/KEY_PWR/BP_PWR/TFT_DUTY/VERSION_STRING |
| Radio M2A | 5 | 1 | 4 | 已观测: RADIO_M2A_FREQ(设频后回传) |
| Update M2A | 3 | 3 | 0 | 升级流程中全部观测到(UPDATE_ACK/LEN/IND_AQUIRE) |

### 测试观察
- **Radio 0x81 SEEK_MODE**: AMS(0x01) 和 FWD(0x02) ACK 正常；BWD(0x03) 和 STOP(0x00) 无显式 ACK 但 MCU 未死锁。
- **Radio 0x82 SWITCH_ON_OFF(0,1)**: 实测通过，未死锁。其他参数组合待测。
- **音频无输出**: 收音机调频/功放/静音/通道切换全部收到ACK，但无音频输出。可能依赖 Android HAL 层音频路由或 CAN 信号。
- **设备掉线**: 测试过程中多次掉线（尤其升级后），需断电重启恢复。

---

## PASS ✅ (21条，含MCU返回帧)

### 1. mcu_req_init_info (0x81)
  TX: FF AA 00 09 02 06 01 81 6C  → 发送 REQ_INIT_INFO
  RX: FF AA 00 0A 02 06 01 05 00 E7  → DATA MT=0x01 Cmd=0x05 SYS_STATUS(上电状态)

### 2. mcu_req_mute (0x82 + 0x00)
  TX: FF AA 00 0A 03 06 01 82 00 DF  → 发送 REQ_MUTE(OFF)
  RX: FF AA 00 0A 02 06 01 05 00 E7  → DATA Cmd=0x05 SYS_STATUS
  RX: FF AA 00 0B 03 06 01 01 46 00 A3  → DATA Cmd=0x01 LINE_DETECT(检测状态 F\x00)

### 3. mcu_send_time_info (0x83)
  TX: FF AA 00 10 04 06 01 83 25 05 10 0A 14 1B 1E 00 XX  → 发送当时时间
  RX: FF AA 00 0B 03 06 01 01 46 00 A3  → DATA Cmd=0x01 LINE_DETECT
  RX: FF AA 00 0A 04 06 01 06 01 E3  → DATA Cmd=0x06 KEY_PWR(按键电源)
  MCU 收到时间信息后主动推送状态

### 4. mcu_set_tft_duty_cycle (0x84 + 0x32)
  TX: FF AA 00 0A 05 06 01 84 32...  → 设置背光 50%
  RX: FF AA 00 0A 05 06 01 07 00 E2  → DATA Cmd=0x07 BP_PWR_ABNORMAL(电池状态)

### 5. mcu_req_type_info(MCU_VERSION) (0x86 + 0x02)
  TX: FF AA 00 0A 06 06 01 86 02 E6  → 请求 MCU 版本
  RX: FF AA 00 1B 06 06 01 02 45 31 31 32 43 30 36 39 58 5A 41 30 31 32 30 30 31 35 CE
      → DATA Cmd=0x02 MCU_VERSION
      → payload ASCII: "E112C069XZA0120015" ← 版本号
  RX: FF AA 00 17 07 06 01 13 00 30 33 30 32 5F 32 30 32 36 30 35 31 34 0F
      → DATA Cmd=0x13 VERSION_STRING
      → payload ASCII: "\x000302_20260514" ← 固件编译日期

### 6. mcu_set_tft_on_off (0x88 + 0x09)
  TX: FF AA 00 0A 07 06 01 88 09 D6  → TFT 背光开
  RX: FF AA 00 17 07 06 01 13 00 30 33...  → DATA Cmd=0x13 VERSION_STRING
  RX: FF AA 00 0C 08 06 01 13 01 30 33 6D  → DATA Cmd=0x13 子版本 "03"

### 7. mcu_set_amp_pwr (0x8A + 0x01)
  TX: FF AA 00 0A 08 06 01 8A 01 D4  → 功放开
  RX: FF AA 00 0C 08 06 01 13 01 30 33 6D  → DATA Cmd=0x13
  RX: FF AA 00 10 09 06 01 03 00 19 01 01 00 04 01 BC
      → DATA Cmd=0x03 TIME_INFO(时间同步回显) payload: \x00\x19\x01\x01\x00\x04\x01

### 8. mcu_set_key_backlight (0x8B + 0x32)
  TX: FF AA 00 0A 09 06 01 8B 32...  → 按键背光 50%
  RX: FF AA 00 0A 0A 06 01 08 00 DC  → DATA Cmd=0x08 TFT_DUTY(背光状态)

### 9. mcu_radio_set_freq_range (Radio 0x85)
  TX: FF AA 00 14 02 06 05 85 00 02 0A 06 86 22 2E 2A 30 09 0A XX
      → 频率范围: AM 531-1602kHz, FM 87.5-108MHz, 步进 AM=9 FM=1
  校验: ~(00+14+02+06+05+85+00+02+0A+06+86+22+2E+2A+30+09+0A)=0x04
  RX: ACK only

### 10. mcu_radio_set_band (Radio 0x83, FM=0x00)
  TX: FF AA 00 0A 02 06 05 83 00 64
  RX: 收到 MCU 主动推送的 Radio M2A 帧 (RADIO_M2A_FREQ):
      FF AA 00 10 02 06 05 01 2C 61 00 00 10 00 00 44
      → MT=0x05(Radio) Cmd=0x01(FREQ) freq=0x2C61(=113.61MHz?) status flags
      MCU 回传了当前频率状态

### 11. mcu_radio_set_ant_pwr (Radio 0x86, ON=0x01)
  TX: FF AA 00 0A 02 06 05 86 01 5F
  RX: ACK only

### 12. mcu_radio_set_reg_mute (Radio 0x87, OPEN=0x00 / CLOSE=0x01)
  TX(0x00): FF AA 00 0A 02 06 05 87 00 62
  TX(0x01): FF AA 00 0A 02 06 05 87 01 61
  RX: ACK only（两种值均收到 ACK）

### 13. mcu_radio_set_freq(Radio 0x84, 103.7MHz / 101.7MHz)
  TX(103.7MHz=10370=0x2882): FF AA 00 0B 02 06 05 84 28 82 B8
  RX: FF AA 00 07 02 02 F4 → ACK seq=0x02
      同时 MCU 回推 RADIO_M2A_FREQ 确认频率:
      FF AA 00 10 02 06 05 01 28 82 00 00 00 00 00 37
      → payload 0x2882=10370=103.7MHz ✅
  TX(101.7MHz=10170=0x27BA): FF AA 00 0B 02 06 05 84 27 BA 82
  RX: FF AA 00 07 02 02 F4 → ACK seq=0x02

### 14. mcu_req_type_info(LINE_DETECT) (0x86 + 0x01)
  TX: FF AA 00 0A 03 06 01 86 01 E7
  RX: ACK only（与 MCU_VERSION 共用命令码，子类型不同）

### 15. mcu_radio_set_seek(AMS=0x01) (Radio 0x81)
  TX: FF AA 00 0B 02 06 05 81 01 00 65 → AMS 自动记忆搜台
  RX: FF AA 00 07 02 02 F4 → ACK seq=0x02 ✅
  MCU 未死锁，搜台后继续发 SET_FREQ 正常响应
  注：之前标记为"已知死锁"的 Radio 0x81 在 AMS(0x01) 模式下验证通过。

### 16. mcu_radio_set_seek(FWD=0x02) (Radio 0x81)
  TX: FF AA 00 0B 02 06 05 81 02 00 64 → SEEK 前向搜台
  RX: FF AA 00 07 02 02 F4 → ACK seq=0x02 ✅
  搜台后继续发 SET_FREQ 正常响应，MCU 未死锁。

### 17. mcu_radio_set_seek(BWD=0x03) (Radio 0x81)
  TX: FF AA 00 0B 02 06 05 81 03 00 64 → SEEK 后向搜台
  RX: 5秒超时无 ACK，但 MCU 未死锁（后续 Setup 正常响应）
  该模式下 MCU 可能不回复显式 ACK。

### 18. mcu_radio_set_seek(STOP=0x00) (Radio 0x81)
  TX: FF AA 00 0B 02 06 05 81 00 00 67 → SEEK 停止搜台
  RX: 5秒超时无 ACK，但 MCU 未死锁（后续 Setup 正常响应）
  该模式下 MCU 可能不回复显式 ACK。

### 19-27. 以下接口 PASS，MCU 无额外回复（含 Update 握手）:
  mcu_set_sub_mute (0x8C)       → ACK only
  mcu_send_key_pwr_status (0x8D) → ACK only
  mcu_set_reverse (0x8E)        → ACK only
  mcu_set_speed_ratio (0x8F)    → ACK only
  mcu_req_trip_clear (0x91)     → ACK only
  mcu_set_switch_status (0x92)  → ACK only
  mcu_send_bt_error (0x93)      → ACK only
  mcu_send_gps_info (0x94)      → ACK only
  mcu_req_vehicle_cfg (0x98)    → ACK only
  mcu_send_arm_sw_version (0x99) → ACK only
  mcu_send_arm_hw_version (0x9A) → ACK only
  mcu_auto_clear_meter_type (0x9B) → ACK only
  mcu_response_factory_cmd (0xA0) → ACK only
  mcu_update_req (Update 0x80)  → ACK only（通过完整升级 flow 验证）
  mcu_update_begin (Update 0x81) → ACK only（通过完整升级 flow 验证）
  mcu_update_end (Update 0x83)  → ACK only（通过完整升级 flow 验证）

注: "ACK only" 表示 MCU 回复了 ACK(0x02) 确认收到命令，
     但命令本身无需 MCU 推送额外 DATA 帧。

## 跳过命令（36条）

### A2M 危险/死锁命令（11条，不解锁不测）

| 命令 | 原因 |
|------|------|
| ~~mcu_req_sleep (0x85)~~ | ✅ ACK 收到（MCU协议栈正常），设备未关机（可能需 CAN ACC 信号配合） |
| ~~mcu_req_arm_reset (0x87)~~ | ✅ 已测：ACK收到 + 设备关机但未自动重启（需手动上电） |
| mcu_set_tot_miles (0x95) | 💀 参数未知，实测导致 MCU 死锁需重新刷固件 |
| mcu_set_work_mode (0x95) | 💀 参数未知，实测 0x03/0x00 均死锁需重新刷固件 |
| mcu_set_fuel_cal (0x96) | 💀 参数未知，实测死锁需重新刷固件 |
| mcu_set_vehicle_cfg (0x97) | 💀 参数未知，实测死锁需重新刷固件 |
| mcu_factory_restore (0x89) | ⚠️ 恢复出厂设置 |
| mcu_req_arm_force_upgrade (0x90) | ⚠️ 强制升级 |
| mcu_boot_update_begin/data/checksum (Update 0x84-0x86) | ⚠️ 刷boot变砖 |

### M2A 需 CAN 环境（25条，无 CAN 总线信号无法触发）

这些 M2A 帧需要真实的车辆 CAN 总线信号才能让 MCU 主动推送，桌面测试环境无法模拟：

| 命令 | 说明 |
|------|------|
| PUBLIC_M2A_REQ_PWR_OFF (0x04) | 电源管理信号 |
| PUBLIC_M2A_BATT_INFO (0x09) | 电池信息→需CAN |
| PUBLIC_M2A_CAR_SPEED (0x0A) | 车速→需CAN |
| PUBLIC_M2A_MILEAGE (0x0B) | 里程→需CAN |
| PUBLIC_M2A_SWITCH_STATUS (0x0C) | 开关状态→需CAN |
| PUBLIC_M2A_VOLTAGE (0x0D) | 电压→需CAN |
| PUBLIC_M2A_FUEL_CAL (0x0E) | 燃油校准→需CAN |
| PUBLIC_M2A_VEHICLE_CFG (0x10) | 车辆配置→需CAN |
| PUBLIC_M2A_INS_FUEL_CONSUME (0x11) | 瞬时油耗→需CAN |
| PUBLIC_M2A_FACTORY_CMD (0x40) | 工厂命令→需CAN |
| PUBLIC_M2A_FACTORY_CMD_FROM_CAN (0x41) | CAN 工厂命令→需CAN |
| PUBLIC_M2A_STOP_CHARGE (0x9D) | 停止充电→需CAN |
| PUBLIC_M2A_RUN_NORMALLY (0x9E) | 正常运行→需CAN |
| RADIO_M2A_FREQ (0x01) | 频率上报→需RDS信号 |
| RADIO_M2A_PS_PTY (0x02) | 电台PS/PTY→需RDS |
| RADIO_M2A_RT (0x03) | RadioText→需RDS |
| RADIO_M2A_TA_PTY_TIPS (0x04) | TA/PTY提示→需RDS |
| RADIO_M2A_WORK_STATUS (0x05) | 收音机工作状态→需硬件 |

---

## 关键发现

1. **MCU 版本**:
   - 升级前: `E112C069XZA0120015`，固件日期 `0302_20260514`
   - 升级后: `E112C069XZA0120016`（确认升级生效）
2. **MCU 主动推送**: TIME_INFO 发送后 MCU 会回推 KEY_PWR 状态
3. **ACK 确认**: 所有 27 条安全命令都收到 ACK，MCU 协议栈正常



 命令                     已发参数                   
`REQ_MUTE (0x82)`       `0x00` 和 `0x01` 
`AMP_PWR (0x8A)`        `0x01`（开）            
`SUB_MUTE (0x8C)`       `0x00`（关）             
`RADIOREGMUTE (0x87)`   `0x00` 和 `0x01` 

