1. 前言
原始测量值先做有效性筛选。 开线、量程、反馈状态先在驱动层转成标准化数据。 上层只获取数据库中的统一数据块,而不是直接碰芯片寄存器。
AFE 测量链,以 meas.c 和 ltc_6813-1.c 为主。 Interlock 反馈链,以 interlock.c 为主。
1.1 先用一张图把数据路径看清

MEAS_Control()在当前源码里只是AFE_TriggerIc()的统一入口。上层长期调用的主测量块,不是 AFE 刚读到的底层测量结果,而是再经过 MRC_ValidateAfeMeasurement()处理后的主数据块。
2.meas.c 的角色:测量框架入口
2.1 MEAS_Initialize()
MEAS_Initialize() {return AFE_Initialize();}
2.2MEAS_Control() 更像调度点
MEAS_Control();MEAS_Control() {AFE_TriggerIc();}
发起转换 等待 ADC 完成 读取寄存器 校验 PEC 结果进数据库
3. LTC6813 驱动
3.1 初始化时就写入多类数据块
cellVoltages cellTemperatures balancingFeedback openWire balancingControl slaveControl
数据块一定存在。 只是其中的数值是否已经被真实测量刷新,要由时间戳和状态位去判断。
3.2 这里更准确地说,是先建结构,再等后续刷新
数据结构已经就位; 后续状态机可以在固定位置持续更新; 上层不需要等对象创建,只需要判断值是否已经有效和新鲜。
3.3 这也解释了为什么上层很少直接判断指针是否为空
数值是否有效 数据是否更新过 某个通道是否被标成开线或无效
4.LTC_SaveVoltages():真正的测量链
4.1 先对每个电芯值逐路处理
当前 open-wire 标记 电压是否落在 AFE 允许范围 当前通道是否应计为 valid
被计入 nrValidCellVoltages 被加进 string total voltage
4.2 openWire会直接影响哪些电压
上层读到的 string 电压不会轻易被无效通道污染。 有效 cell 数量本身就成了状态信息。
4.3 这里还隐含了一层局部融合
单体电压到 string 总压 单点有效性到 string 级有效计数
5.LTC_SaveTemperatures():温度链
电压链经常直接参与预充、接触器控制、过压欠压等关键路径。 温度链更多参与运行期保护、均衡允许条件和热状态判定。
6.LTC_GetBalancingControlValues():均衡
6.1 算法模块不直接改芯片寄存器
LTC_GetBalancingControlValues()6.2 这层分离非常好
算法层只表达要均衡哪些 cell,不关心底层硬件位布局。 如果以后 AFE 芯片换型,均衡策略层几乎不需要改,只要驱动把数据库命令重新映射到新芯片上即可。
7.LTC_SaveBalancingFeedback():执行反馈单独成链
算法想让哪些 cell 均衡。 驱动实际给硬件下发了什么。 硬件最终反馈了什么状态。
8. Interlock:FoxBMS 的高压安全链
8.1 ILCK_GetInterlockFeedback() 同时读数字量和模拟反馈
互锁输入 ADC 高侧反馈 ADC 低侧反馈
8.2 为什么要数字量和模拟量同时看
接触器反馈是否真的对应命令状态。 是否存在焊死、粘连、反馈线异常。 高侧和低侧回路的实际反馈是否一致。
8.3 Interlock 数据为什么也要写数据库
状态机不应直接依赖底层驱动函数。 Interlock 结果要在 10ms 主控制路径中被稳定使用。 诊断和记录模块也可能需要读同一份反馈。
8.4 Interlock 反馈链图

9. 局部关键数据块索引
| 数据块 | 主要生产者 | 主要消费者 | 更新节拍 | 本篇用途 |
|---|---|---|---|---|
DATA_BLOCK_CELL_VOLTAGE_BASEDATA_BLOCK_CELL_VOLTAGE_REDUNDANCY0 | LTC AFE 驱动读取完成后的保存路径 | MRC_ValidateAfeMeasurement() | 1ms(AFE 状态机推进、测量完成后写入) | 承载底层电压测量与有效位 |
DATA_BLOCK_CELL_TEMPERATURE_BASEDATA_BLOCK_CELL_TEMPERATURE_REDUNDANCY0 | LTC AFE 驱动读取完成后的保存路径 | MRC_ValidateAfeMeasurement() | 1ms(AFE 状态机推进、测量完成后写入) | 承载底层温度测量与有效位 |
DATA_BLOCK_CELL_VOLTAGE | MRC_ValidateAfeMeasurement() | BMS_GetMeasurementValues()、均衡策略、SOA、SOC 相关模块 | 10ms 任务中每 50ms 校验后更新 | 给上层提供主消费电压块 |
DATA_BLOCK_CELL_TEMPERATURE | MRC_ValidateAfeMeasurement() | SOA、均衡允许条件等温度消费者 | 与 AFE 校验同节拍 | 给上层提供主消费温度块 |
DATA_BLOCK_MIN_MAX | MRC_ValidateAfeMeasurement() | BMS_GetMeasurementValues()、BAL_ActivateBalancing()、SOC/SOE/SOF 相关模块 | 与 AFE 校验同节拍 | 汇总最值,避免上层重复扫描全量通道 |
DATA_BLOCK_BALANCING_CONTROL | 均衡策略模块 | LTC_GetBalancingControlValues() | 按策略更新 | 把“要均衡哪些 cell”从策略层传给驱动执行层 |
DATA_BLOCK_BALANCING_FEEDBACK_* | LTC_SaveBalancingFeedback() | 诊断、状态发送等后续消费者 | balancing feedback 读回后更新 | 区分“要求均衡”和“硬件反馈均衡” |
DATA_BLOCK_INTERLOCK_FEEDBACK | ILCK_GetInterlockFeedback() | DIAG / 互锁相关上层逻辑 | 10ms 周期 | 保存 pin + ADC 组合后的互锁反馈事实 |
10. 这一篇真正要建立的认识
电压不是原始 ADC 结果,而是带 open-wire 与有效性判定的电芯和电池串数据。 均衡不是算法直连硬件,而是数据库命令经过驱动执行。 Interlock 不是一个引脚,而是一组反馈被整形成了统一状态。
小结
meas.c是测量框架入口,AFE 驱动才是电压、温度、开线、均衡反馈落库的真正实现者。Interlock 模块通过数字量和模拟反馈的组合,向系统提供高压路径的情况。
推荐阅读顺序
先看 MEAS_Initialize()和MEAS_Control(),确认meas模块只是框架入口而不是具体芯片实现。再看 LTC_InitializeDatabase(),理解驱动初始化时为什么先建立数据库初始镜像。接着读 LTC_SaveVoltages()和LTC_SaveTemperatures(),把 AFE 原始测量如何落到 base / redundancy 数据块看清楚。再读 MRC_ValidateAfeMeasurement(),并补看LTC_GetBalancingControlValues()与LTC_SaveBalancingFeedback(),确认哪些块才是上层真正消费的主测量块,以及均衡命令和反馈如何通过数据库闭环。最后读 ILCK_Trigger()、ILCK_GetInterlockFeedback()和DIAG_ErrorInterlock(),把高压互锁反馈到诊断的链补完整。
夜雨聆风