<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://photonicat.com/index.php?action=history&amp;feed=atom&amp;title=Photonicat_2_MCU_%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE</id>
	<title>Photonicat 2 MCU 通讯协议 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://photonicat.com/index.php?action=history&amp;feed=atom&amp;title=Photonicat_2_MCU_%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE"/>
	<link rel="alternate" type="text/html" href="https://photonicat.com/index.php?title=Photonicat_2_MCU_%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE&amp;action=history"/>
	<updated>2026-07-26T13:09:24Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://photonicat.com/index.php?title=Photonicat_2_MCU_%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE&amp;diff=1024&amp;oldid=prev</id>
		<title>C2h2：​Create: full Photonicat 2 MCU UART protocol (frame format, status frame field table, battery info v9, charge limit, fan/thermal, beep, OTA)</title>
		<link rel="alternate" type="text/html" href="https://photonicat.com/index.php?title=Photonicat_2_MCU_%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE&amp;diff=1024&amp;oldid=prev"/>
		<updated>2026-07-26T09:42:04Z</updated>

		<summary type="html">&lt;p&gt;Create: full Photonicat 2 MCU UART protocol (frame format, status frame field table, battery info v9, charge limit, fan/thermal, beep, OTA)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;本页描述 &amp;#039;&amp;#039;&amp;#039;Photonicat 2&amp;#039;&amp;#039;&amp;#039; 主机（RK3576）与电源管理 MCU（Renesas RA2E1）之间的&lt;br /&gt;
串口通讯协议。协议同样适用于一代（RK3568），但一代的电压阈值是单节锂电语义，&lt;br /&gt;
详见下方&amp;quot;与一代的差异&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
相关页面：[[Photonicat 2 sysfs]]（内核已经把电源/RTC 数据导出成标准接口，&lt;br /&gt;
一般应用&amp;#039;&amp;#039;&amp;#039;不需要&amp;#039;&amp;#039;&amp;#039;自己解析本协议）、[[Photonicat 2 SOC 计算]]（状态帧里的&lt;br /&gt;
电量是怎么算出来的）、[[Photonicat 2 LED 指示灯]]、[[Photonicat 2 提示音说明]]。&lt;br /&gt;
&lt;br /&gt;
== 先读这里：你可能不需要这个协议 ==&lt;br /&gt;
&lt;br /&gt;
绝大多数应用不应该直接收发本协议。主机侧已经有两层封装：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 你想做的事 !! 推荐用法&lt;br /&gt;
|-&lt;br /&gt;
| 读电量/电压/电流/充电器状态 || &amp;lt;code&amp;gt;/sys/class/power_supply/*&amp;lt;/code&amp;gt;，见 [[Photonicat 2 sysfs]]&lt;br /&gt;
|-&lt;br /&gt;
| 读写时间 || &amp;lt;code&amp;gt;hwclock&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;/dev/rtc&amp;lt;/code&amp;gt;（MCU 就是硬件 RTC）&lt;br /&gt;
|-&lt;br /&gt;
| 风扇转速、温度 || &amp;lt;code&amp;gt;/sys/class/hwmon/*&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;/sys/class/thermal/*&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 网页界面里的各种设置 || pcat-manager 的 REST API，见 [[Photonicat 2 开发者 API]]&lt;br /&gt;
|-&lt;br /&gt;
| 上面都覆盖不到的功能 || 才需要本页的协议&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
串口本身由内核驱动 &amp;lt;code&amp;gt;photonicat-pm&amp;lt;/code&amp;gt; 和用户态守护进程&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;pcat-manager&amp;#039;&amp;#039;&amp;#039; 占用。第三方程序直接抢串口会和它们冲突。&lt;br /&gt;
&lt;br /&gt;
== 物理层 ==&lt;br /&gt;
&lt;br /&gt;
* 串口，&amp;#039;&amp;#039;&amp;#039;115200&amp;#039;&amp;#039;&amp;#039; 波特率，8 数据位，无校验，1 停止位（8N1）&lt;br /&gt;
* 主机侧设备：一代为 &amp;lt;code&amp;gt;/dev/ttyS4&amp;lt;/code&amp;gt;；二代由设备树绑定给&lt;br /&gt;
  &amp;lt;code&amp;gt;photonicat-pm&amp;lt;/code&amp;gt; 驱动（serdev），不再以裸 tty 暴露&lt;br /&gt;
&lt;br /&gt;
== 帧格式 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 字节 !! 字段 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 起始位 || 固定 &amp;#039;&amp;#039;&amp;#039;0xA5&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 源地址 || 见地址表&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 目的地址 || 见地址表&lt;br /&gt;
|-&lt;br /&gt;
| 3–4 || 帧序号 || 小端 uint16，主动发送方每发一帧加一，溢出回零；应答沿用请求的帧序号&lt;br /&gt;
|-&lt;br /&gt;
| 5–6 || 数据长度 || 小端 uint16，指&amp;quot;命令号 + 命令内容 + 是否需要回复&amp;quot;三段的总字节数&lt;br /&gt;
|-&lt;br /&gt;
| 7–8 || 命令号 || 小端 uint16&lt;br /&gt;
|-&lt;br /&gt;
| 9… || 命令内容 || 变长，见各命令说明&lt;br /&gt;
|-&lt;br /&gt;
| 倒数第 4 || 是否需要回复 || 1 = 需要应答，0 = 不需要&lt;br /&gt;
|-&lt;br /&gt;
| 倒数第 3、2 || CRC16 || 对&amp;#039;&amp;#039;&amp;#039;从字节 1 到&amp;quot;是否需要回复&amp;quot;为止&amp;#039;&amp;#039;&amp;#039;的所有字节计算，小端&lt;br /&gt;
|-&lt;br /&gt;
| 最后 1 || 结束位 || 固定 &amp;#039;&amp;#039;&amp;#039;0x5A&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
一帧总长 = 数据长度 + 10。接收方据此校验，长度对不上直接丢弃。&lt;br /&gt;
&lt;br /&gt;
=== 地址表 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 值 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 第一块 CPU 板（目前只有一块，主机固定用 0x01）&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 / 0x03 || 第二、三块 CPU 板（预留）&lt;br /&gt;
|-&lt;br /&gt;
| 0x80 || 广播给所有 CPU 板&lt;br /&gt;
|-&lt;br /&gt;
| 0x81 || 电源管理 MCU（RA2E1）&lt;br /&gt;
|-&lt;br /&gt;
| 0xFE || 广播给所有 RA2E1&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF || 广播给系统内所有设备&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 命令号约定 ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;奇数 = 请求，偶数 = 对应的应答&amp;#039;&amp;#039;&amp;#039;（应答号 = 请求号 + 1）。这条规则贯穿整个&lt;br /&gt;
协议，MCU 内部就是按 &amp;lt;code&amp;gt;命令号 % 2&amp;lt;/code&amp;gt; 来分发的。&lt;br /&gt;
&lt;br /&gt;
== 命令一览 ==&lt;br /&gt;
&lt;br /&gt;
=== 基础与版本 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; / 2 || CPU → MCU || 无 || 心跳。超过 1 分钟没有收到任何数据，MCU 会重启主机&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039; / 4 || CPU → MCU || 应答含 8 字节字符串 || 读硬件版本，例如 &amp;lt;code&amp;gt;NT2421A4&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;5&amp;#039;&amp;#039;&amp;#039; / 6 || CPU → MCU || 应答含 14 字节字符串 || 读软件版本，例如 &amp;lt;code&amp;gt;RA2E1260726005&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;139&amp;#039;&amp;#039;&amp;#039; / 140 || CPU → MCU || —— || 读硬件 ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;159&amp;#039;&amp;#039;&amp;#039; / 160 || CPU → MCU || —— || 读 bootloader 版本号&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 状态上报（7） ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MCU → CPU&amp;#039;&amp;#039;&amp;#039;，周期性主动上报，是整个协议里最重要的一帧。数据长度 56。&lt;br /&gt;
下表偏移量以&amp;#039;&amp;#039;&amp;#039;命令内容&amp;#039;&amp;#039;&amp;#039;首字节为 0（即整帧的字节 9）：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 偏移 !! 长度 !! 字段 !! 单位 / 说明&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 2 || 电池电压 || mV，小端&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2 || 充电器接口电压 || mV，小端&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 2 || 输入 GPIO 状态 || 位域&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 || 输出 GPIO 状态 || 位域&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || 系统时间 || 年(2) 月 日 时 分 秒 星期，各 1 字节&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1 || RTC 状态 || 0 正常，1 初始化异常，2 无秒中断，3 无分钟中断&lt;br /&gt;
|-&lt;br /&gt;
| 17 || 1 || 板子温度 || &amp;#039;&amp;#039;&amp;#039;实际温度 = 本字节 − 100&amp;#039;&amp;#039;&amp;#039;（℃）&lt;br /&gt;
|-&lt;br /&gt;
| 18 || 2 || 电池电流 || mA，&amp;#039;&amp;#039;&amp;#039;有符号&amp;#039;&amp;#039;&amp;#039;小端。正 = 放电，负 = 充电&lt;br /&gt;
|-&lt;br /&gt;
| 20 || 2 || 剩余容量 || mAh&lt;br /&gt;
|-&lt;br /&gt;
| 22 || 1 || 电量 || %（1–100，算法见 [[Photonicat 2 SOC 计算]]）&lt;br /&gt;
|-&lt;br /&gt;
| 23 || 4 || 当前能量 || mWh，小端&lt;br /&gt;
|-&lt;br /&gt;
| 27 || 4 || 满电能量 || mWh，小端（学习值，可与标称对比看老化）&lt;br /&gt;
|-&lt;br /&gt;
| 31 || 4 || 累计开机时长 || 秒，小端&lt;br /&gt;
|-&lt;br /&gt;
| 35 || 4 || 加速度 X || 1/16384 g，有符号小端&lt;br /&gt;
|-&lt;br /&gt;
| 39 || 4 || 加速度 Y || 同上&lt;br /&gt;
|-&lt;br /&gt;
| 43 || 4 || 加速度 Z || 同上&lt;br /&gt;
|-&lt;br /&gt;
| 47 || 1 || 加速度数据就绪 || 非 0 表示有效&lt;br /&gt;
|-&lt;br /&gt;
| 48 || 4 || 风扇转速 || RPM，小端&lt;br /&gt;
|-&lt;br /&gt;
| 52 || 1 || 充电状态 || 0 未充电，1 小电流充电，2 大电流充电，3 已充满&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;向后兼容&amp;#039;&amp;#039;&amp;#039;:这一帧只在尾部追加字段，从不改动已有偏移。解析时应按&lt;br /&gt;
&amp;quot;长度至少为 N 才读第 N 个字段&amp;quot;的方式写，不要假设固定总长。&lt;br /&gt;
&lt;br /&gt;
=== 时间与定时开机 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;9&amp;#039;&amp;#039;&amp;#039; / 10 || CPU → MCU || 年(2) 月 日 时 分 秒，共 7 字节 || 设置 MCU 时间&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;11&amp;#039;&amp;#039;&amp;#039; / 12 || CPU → MCU || 见下 || 设置定时开机&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
定时开机每条 8 字节：年(2) 月 日 时 分 星期，再加 1 字节匹配掩码。&lt;br /&gt;
掩码 bit0 年、bit1 月、bit2 日、bit3 时、bit4 分、bit5 星期，&lt;br /&gt;
置 1 表示该项参与匹配。&amp;#039;&amp;#039;&amp;#039;分匹配必须为 1&amp;#039;&amp;#039;&amp;#039;，否则该条被忽略。&lt;br /&gt;
星期按位匹配，例如 &amp;lt;code&amp;gt;0b00000101&amp;lt;/code&amp;gt; 表示周日和周二。&lt;br /&gt;
一次最多 6 条，覆盖之前的设置，故该段最长 48 字节。&lt;br /&gt;
&lt;br /&gt;
=== 关机与复位 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;13&amp;#039;&amp;#039;&amp;#039; / 14 || MCU → CPU || 1 字节关机事件 || MCU 通知主机即将关机&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;15&amp;#039;&amp;#039;&amp;#039; / 16 || CPU → MCU || 无 || 主机请求关机&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;17&amp;#039;&amp;#039;&amp;#039; / 18 || MCU → CPU || 无 || MCU 通知主机复位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
关机事件取值：0 按键强制关机，1 电池低电压关机，2 升级前关机，3 其他。&lt;br /&gt;
&lt;br /&gt;
=== 开机原因（27） ===&lt;br /&gt;
&lt;br /&gt;
CPU → MCU 查询，应答 1 字节：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 值 !! 含义&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 按键开机&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 定时开机&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 车载模式：插入充电器开机&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 低电压关机后，插入充电器且电压满足条件开机&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 无电池开机&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 家庭模式：充电器电压满足条件开机&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 看门狗与电源策略 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;19&amp;#039;&amp;#039;&amp;#039; / 20 || CPU → MCU || 3 字节：开机超时、关机超时、喂狗超时（秒） || 设置软件看门狗时间&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;21&amp;#039;&amp;#039;&amp;#039; / 22 || CPU → MCU || 1 字节 || 0 = 插充电器不自动开机，1 = 插充电器开机。（低电压关机的机器即使设 0 也会开机）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;157&amp;#039;&amp;#039;&amp;#039; / 158 || CPU → MCU || 1 字节 || 硬件看门狗开关&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;161&amp;#039;&amp;#039;&amp;#039; / 162 || CPU → MCU || 1 字节 || 设置设备模式（车载 / 家庭等）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 电压阈值（23） ===&lt;br /&gt;
&lt;br /&gt;
CPU → MCU，&amp;#039;&amp;#039;&amp;#039;18 字节&amp;#039;&amp;#039;&amp;#039;，9 个 uint16 小端。二代为 2S 电池组，单位 mV，&lt;br /&gt;
数值是&amp;#039;&amp;#039;&amp;#039;整包&amp;#039;&amp;#039;&amp;#039;电压：&lt;br /&gt;
&lt;br /&gt;
# 电压高指示阈值&lt;br /&gt;
# 电压中指示阈值&lt;br /&gt;
# 电压低指示阈值&lt;br /&gt;
# 插充电器开机电压&lt;br /&gt;
# 充电器在位判定电压&lt;br /&gt;
# 充电器不在时关机电池阈值&lt;br /&gt;
# 工作中低电压提示阈值&lt;br /&gt;
# 大电流充电电压阈值&lt;br /&gt;
# 开机后持续 15 分钟判定满电的电压阈值&lt;br /&gt;
&lt;br /&gt;
超出默认值 ±1000 mV 的设置视为无效，MCU 会退回默认值。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意&amp;#039;&amp;#039;&amp;#039;:一代文档里的 3850 / 3700 / 3600 等是&amp;#039;&amp;#039;&amp;#039;单节&amp;#039;&amp;#039;&amp;#039;数值。二代是 2S，&lt;br /&gt;
默认值不同（例如低电告警 6500、强制关机 6300），不要照搬一代的数字。&lt;br /&gt;
各阈值的实际效果见 [[Photonicat 2 LED 指示灯]]。&lt;br /&gt;
&lt;br /&gt;
=== 温度阈值（145） ===&lt;br /&gt;
&lt;br /&gt;
CPU → MCU，2 字节：&lt;br /&gt;
&lt;br /&gt;
* 第 1 字节：主机断电温度（℃），有效范围 &amp;#039;&amp;#039;&amp;#039;55–80&amp;#039;&amp;#039;&amp;#039;，默认 75&lt;br /&gt;
* 第 2 字节：充电指示灯关闭温度（℃），有效范围 &amp;#039;&amp;#039;&amp;#039;50–60&amp;#039;&amp;#039;&amp;#039;，默认 53&lt;br /&gt;
&lt;br /&gt;
超范围返回错误，不生效。温度过高触发断电时会播放提示音，&lt;br /&gt;
见 [[Photonicat 2 提示音说明]]。&lt;br /&gt;
&lt;br /&gt;
=== 风扇 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;147&amp;#039;&amp;#039;&amp;#039; / 148 || CPU → MCU || 1 字节占空比（0–100） || 主机直接接管风扇。&amp;#039;&amp;#039;&amp;#039;一旦下发，MCU 内部的温控 PID 不再控制风扇&amp;#039;&amp;#039;&amp;#039;；超过 100 返回错误&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;151&amp;#039;&amp;#039;&amp;#039; / 152 || CPU → MCU || 目标温度 || 设置风扇 PID 的目标温度，默认 47 ℃&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;153&amp;#039;&amp;#039;&amp;#039; / 154 || CPU → MCU || —— || 读取当前目标温度&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
未被主机接管时，MCU 用增量式 PID 控制风扇：目标温度 47 ℃，&lt;br /&gt;
充电时占空比上限 85 %，纯电池运行时上限 40 %。&lt;br /&gt;
&lt;br /&gt;
=== 指示灯与声音 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;25&amp;#039;&amp;#039;&amp;#039; / 26 || CPU → MCU || 6 字节 || 设置网络指示灯：高电平时长(2)、低电平时长(2)、变换次数(2)，时长单位 10 ms，次数 0 表示一直闪&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;155&amp;#039;&amp;#039;&amp;#039; / 156 || CPU → MCU || 1 字节 || 声光模式：0x00 全关，0x01 关声音开灯光，0x02 开声音关灯光，0x03 全开；传 &amp;#039;&amp;#039;&amp;#039;0xFF&amp;#039;&amp;#039;&amp;#039; 为查询当前值&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;163&amp;#039;&amp;#039;&amp;#039; / 164 || CPU → MCU || 见下 || 播放自定义蜂鸣器序列&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;自定义蜂鸣器序列（163）&amp;#039;&amp;#039;&amp;#039;载荷格式：&lt;br /&gt;
&lt;br /&gt;
  [步进 1][步进 2]…[步进 N][循环模式 1 字节]&lt;br /&gt;
&lt;br /&gt;
每个步进 4 字节：频率 uint16 小端（Hz，0 = 休止）+ 时长 uint16 小端（ms）。&lt;br /&gt;
循环模式 0 = 播放一次，1 = 循环。时长为 0 会被当作 1 ms。&lt;br /&gt;
声音被关闭时该命令不执行。内置提示音见 [[Photonicat 2 提示音说明]]。&lt;br /&gt;
&lt;br /&gt;
=== 电池与充电 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 方向 !! 内容 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;165&amp;#039;&amp;#039;&amp;#039; / 166 || CPU → MCU || 1 字节百分比 || 设置充电上限，有效范围 &amp;#039;&amp;#039;&amp;#039;50–100&amp;#039;&amp;#039;&amp;#039;，100 = 不限制。超范围返回错误&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;167&amp;#039;&amp;#039;&amp;#039; / 168 || CPU → MCU || 应答 1 字节 || 读取当前充电上限&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;169&amp;#039;&amp;#039;&amp;#039; / 170 || CPU → MCU || 应答见下 || 读取电池详细信息&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;141&amp;#039;&amp;#039;&amp;#039; / 142 || CPU → MCU || 1 字节 || &amp;#039;&amp;#039;&amp;#039;已废弃&amp;#039;&amp;#039;&amp;#039;，保留解析以兼容老主机，行为等同空操作&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
充电上限自固件 &amp;#039;&amp;#039;&amp;#039;RA2E1260726005&amp;#039;&amp;#039;&amp;#039; 起持久化在 MCU 侧，复位和 OTA 后不丢失。&lt;br /&gt;
到达上限后 MCU 断开充电 MOSFET，回落约 2 % 后恢复充电。&lt;br /&gt;
&lt;br /&gt;
==== 电池信息（169）应答格式 ====&lt;br /&gt;
&lt;br /&gt;
应答是&amp;#039;&amp;#039;&amp;#039;逐版本向尾部追加&amp;#039;&amp;#039;&amp;#039;的结构，当前长度 59 字节。偏移以应答的命令内容&lt;br /&gt;
首字节为 0，全部小端：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 偏移 !! 长度 !! 字段 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 2 || 学习到的满容量 || mAh&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2 || 循环次数 || ——&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 2 || 标称满容量 || mAh&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1 || 标志位 || bit0 = 容量为学习值，bit1 = 学习窗口进行中&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 2 || 内阻 || mΩ，整包串联值，归一到 25 ℃&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 4 || 累计开机秒数 || ——&lt;br /&gt;
|-&lt;br /&gt;
| 13 || 2 || 电池中点电压 || mV（2P2S 中心抽头）&lt;br /&gt;
|-&lt;br /&gt;
| 15 || 2 || 内部 SOC || ×10，显示修饰前&lt;br /&gt;
|-&lt;br /&gt;
| 17 || 1 || 学习到的显示空点 || %，0 = 未学习&lt;br /&gt;
|-&lt;br /&gt;
| 18 || 2 || 显示变换 a || ×1000&lt;br /&gt;
|-&lt;br /&gt;
| 20 || 2 || 显示变换 b || ×100，有符号&lt;br /&gt;
|-&lt;br /&gt;
| 22 || 2 || 充电电流增益 || ×1000&lt;br /&gt;
|-&lt;br /&gt;
| 24 || 2 || 电流微调 a || ×1000&lt;br /&gt;
|-&lt;br /&gt;
| 26 || 2 || 电流微调 b || mA，有符号&lt;br /&gt;
|-&lt;br /&gt;
| 28 || 2 || 估算剩余容量 || mAh&lt;br /&gt;
|-&lt;br /&gt;
| 30 || 4 || 累计消耗能量 || mWh&lt;br /&gt;
|-&lt;br /&gt;
| 34 || 4 || 累计充入能量 || mWh&lt;br /&gt;
|-&lt;br /&gt;
| 38 || 1 || &amp;#039;&amp;#039;&amp;#039;协议版本号&amp;#039;&amp;#039;&amp;#039; || 当前 9&lt;br /&gt;
|-&lt;br /&gt;
| 39 || 1 || 电池健康度 || %，0xFF = 尚未学习&lt;br /&gt;
|-&lt;br /&gt;
| 40 || 2 || 预计可用时间 || 分钟，0xFFFF = 非稳定放电&lt;br /&gt;
|-&lt;br /&gt;
| 42 || 2 || 预计充满时间 || 分钟，0xFFFF = 非稳定充电&lt;br /&gt;
|-&lt;br /&gt;
| 44 || 1 || 库仑计在用温度 || ℃，有符号&lt;br /&gt;
|-&lt;br /&gt;
| 45 || 1 || 低温空点上移 || ×10 %，常温 = 0&lt;br /&gt;
|-&lt;br /&gt;
| 46 || 2 || 内阻温度倍率 k(T) || ×1000，25 ℃ = 1000&lt;br /&gt;
|-&lt;br /&gt;
| 48 || 1 || 回路寄生电阻 || mΩ（线缆+接插件+MOSFET）。电芯本体内阻 = 偏移 7 的值 − 本值&lt;br /&gt;
|-&lt;br /&gt;
| 49 || 4 || MCU 总运行秒数 || 自 MCU 复位起，看门狗/异常复位会清零&lt;br /&gt;
|-&lt;br /&gt;
| 53 || 4 || 距上次休眠唤醒秒数 || 从未休眠则等于总运行秒数&lt;br /&gt;
|-&lt;br /&gt;
| 57 || 2 || 进入待机次数 || 饱和计数&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
偏移 38 之前的版本靠&amp;#039;&amp;#039;&amp;#039;应答长度&amp;#039;&amp;#039;&amp;#039;区分（≥7、≥13、≥15、≥28、≥38…）；&lt;br /&gt;
从版本 9 起有显式版本号字段，建议新代码优先读它。这些字段的物理含义见&lt;br /&gt;
[[Photonicat 2 SOC 计算]]。&lt;br /&gt;
&lt;br /&gt;
=== 抬腕唤醒（149） ===&lt;br /&gt;
&lt;br /&gt;
MCU → CPU 主动上报抬腕/移动事件。对应 sysfs 的&lt;br /&gt;
&amp;lt;code&amp;gt;/sys/kernel/photonicat-pm/movement_trigger&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
=== MCU 固件升级 ===&lt;br /&gt;
&lt;br /&gt;
这一组命令由 pcat-manager 的升级工具使用，&amp;#039;&amp;#039;&amp;#039;不建议手工调用&amp;#039;&amp;#039;&amp;#039;——&lt;br /&gt;
中断升级流程可能使 MCU 无法启动。正常升级方式见&lt;br /&gt;
[[Photonicat 2 MCU 手动更新]]。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 命令 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;129&amp;#039;&amp;#039;&amp;#039; / 130 || 请求进入升级模式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;203&amp;#039;&amp;#039;&amp;#039; / 204 || 开始 OTA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;205&amp;#039;&amp;#039;&amp;#039; / 206 || 传送版本号&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;207&amp;#039;&amp;#039;&amp;#039; / 208 || OTA 结束&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;209&amp;#039;&amp;#039;&amp;#039; / 210 || 回报&amp;quot;已收到结束&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;211&amp;#039;&amp;#039;&amp;#039; / 212 || 传输 OTA 数据&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;213&amp;#039;&amp;#039;&amp;#039; / 214 || 接收就绪&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;215&amp;#039;&amp;#039;&amp;#039; / 216 || 长度校验正确&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;217&amp;#039;&amp;#039;&amp;#039; / 218、&amp;#039;&amp;#039;&amp;#039;219&amp;#039;&amp;#039;&amp;#039; / 220 || 新区域拷贝到备份区 / 拷贝完成&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;221&amp;#039;&amp;#039;&amp;#039; / 222、&amp;#039;&amp;#039;&amp;#039;223&amp;#039;&amp;#039;&amp;#039; / 224 || 擦除 SPI 最新区 / 备份区&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 错误上报（201） ===&lt;br /&gt;
&lt;br /&gt;
MCU → CPU，用于上报解析或执行错误。&lt;br /&gt;
&lt;br /&gt;
== 与一代的差异 ==&lt;br /&gt;
&lt;br /&gt;
* 一代主机是 RK3568，二代是 RK3576&lt;br /&gt;
* 一代是单节锂电，命令 23 的阈值是单节电压（3850 / 3700 / 3600 等）；&lt;br /&gt;
  二代是 2S 电池组，同样的字段是整包电压（约为一代的两倍）&lt;br /&gt;
* 一代只有命令 1–28；二代在 129 以上扩展了 ID、风扇、温度、声光、&lt;br /&gt;
  电池信息、充电上限等&lt;br /&gt;
* 一代靠 pcat-manager 的 socket 对外提供数据；二代已集成进内核，&lt;br /&gt;
  推荐直接读 sysfs，见 [[Photonicat 2 sysfs]]&lt;br /&gt;
&lt;br /&gt;
== 参考实现 ==&lt;br /&gt;
&lt;br /&gt;
* 主机侧用户态：pcat-manager &amp;lt;code&amp;gt;src/pmu-manager.c&amp;lt;/code&amp;gt;&lt;br /&gt;
* 主机侧内核：&amp;lt;code&amp;gt;photonicat-pm&amp;lt;/code&amp;gt;（power_supply + RTC）&lt;br /&gt;
* 一代参考：[https://github.com/photonicat/rockchip_rk3568_pcat_manager/blob/master/src/pmu-manager.c rockchip_rk3568_pcat_manager]&lt;/div&gt;</summary>
		<author><name>C2h2</name></author>
	</entry>
</feed>