本章节主要讨论基于L9963x的电池管理系统初始化流程,以及在通讯异常情况下恢复通讯问题。
下图是典型的L9963x电池管理系统实例。主处理器通过SPI通信方式连接L9963T,多个L9963E以菊花链方式连接,通过变压器隔离接口与主处理器通信,具有高速、低电磁干扰、远距离、可靠的数据传输特点。
基于L9963x的高压蓄电池管理系统应用实例
上一篇 ST新能源汽车BMS解决方案__L9963调试笔记(一)中提到,L9963E重新上电后,在初始化状态,并且ID为0。在初始化状态下,只可以配置DEV_GEN_CFG寄存器 中的chip_ID,isotx_en_h和iso_freq_sel三个值(原文):
chip_ID:L9963E芯片ID(1,2,3,…,31),配置后,无法更改其他ID
isotx_en_h:菊花链高侧口,写1使能后,可以将数据透传出去
iso_freq_sel:数据传输速度,写1配置成高速,通讯速度可达2.66Mbps;写0配置成低速模式,通讯速度333 kbps
L9963T芯片也分为高速模式和低速模式两种,通过ISOFREQ管脚高低状态切换。ISOFREQ拉高后,L9963T发送的第一帧还是低速帧,从第二帧开始是才是高速帧。也可以在ISOFREQ拉高后,重新拉低再拉高下DIS管脚(L9963T休眠唤醒一下),这样操作后发送的第一帧就是高速帧。
需要注意的是L9963E和L9963T高低速模式需要一致。为了避免在比特率/幅度切换时丢失帧,必须遵循以下原则(原文):
虽然初始化状态,可以配置DEV_GEN_CFG寄存器 中的chip_ID,isotx_en_h和iso_freq_sel,但是强烈建议检查代码中,是否有未配置ID的情况下,先配置了isotx_en_h和iso_freq_sel,这样也会导致配置ID失败从而造成通讯异常原文:
系统重新上电后,L9963x初始化如下图,配置最后一片L9963E后,开始去读电池电压电流值。
L9963x初始化框图
但是,在工况复杂的环境中,汽车BMS线束由于受到震动,有可能会导致L9963E芯片的供电断开,导致整个系统中某个L9963E芯片重新处于初始化状态,比如用4片L9963E为例,当整个系统初始化完毕后,状态如下所示,1#~4#的DEV_GEN_CFG中的寄存器值。
若此时受到震动,3#掉电又重新恢复后,状态如下:
由于3#的ID为0,此时MCU和3#通讯不上,需要重新初始化这片L9963E。3#在低速模式,需要把1#和2#也切换成低速模式,不然3#也无法收到命令配置。最简单的方式是MCU不发送任何消息,等待通讯超时时间CommTimeout,这样可以使得整个系统进入休眠状态,这样有ID的L9963E被唤醒后是低速模式,省去了切换速度的麻烦。
另外,有些场景也是提出要保证配置的ID和实际的L9963E物理顺序要保持一致。比如当3#的L9963E断电恢复后,MCU在配置ID3时候,2#设备又出现断电上电,这时有可能把2#的L9963E设置成ID3,3#的L9963E设置成ID2,导致实际ID号与物理顺序不一致情况。
这样建议整个系统做逐次配置ID流程,比如需要4个L9963E:
所有L9963E进入低速模式(重新上电/休眠唤醒等);
读取ID1,未读到,配置1#的L9963E为ID1,读取ID1(未成功,配置读取ID1过程循环 3次),如果失败重新开始;
读取ID1,已读到,读取ID2,未读到,配置2#的L9963E为ID2,读取ID2(未成功,配置读取ID2过程循环 3次),如果失败重新开始;
读取ID1,已读到,读取ID2,已读到,读取ID3,未读到,配置3#的L9963E为ID3,读取ID3(未成功,配置读取ID3过程循环 3次),如果失败重新开始;
……依次如此;
所有L9963E都有ID后,将最后一片的L9963E高侧口关闭,广播切成高速模式;
开始读取转换电压电流值。
这样操作可以极大避免了ID号配置与物理顺序不符合的情况。
最后,附上推荐逻辑框图(可以根据实际情况完善)。