NXP HVBMS 网关 MC33665 双路 SPI 波特率探究

一、简介

        在 400V/800V 高压 BMS 中,需要使用多个 MC33774 检测 108S/216S 电池电芯状态,同时也需要 2/4 个 MC33772 去检测继电器、充放电路径上的高压参数。由此可见如此庞大的设备及数据,势必需要一个专门的路由来接管。MC33665 就是 NXP 特别设计的,可以获取菊花链路上复数个电芯检测单元信息,然后通过 SPI、CAN 等通讯方式与主控 MCU 交互。本文将会对 NXP HVBMS Demo 中使用到的双路 SPI(后面将会简称 DSPI)进行介绍。


二、DSPI 中控 MCU 配置说明

        在目前的 DSPI 工程中,用户需要使用 EB Tresos 配置 S32K344 这类主控 SPI 组件。由于是 DSPI,所以在这里需要配置两路 SPI,一路作为主机只发送写命令、读请求;另一路作为从机,专门接收来自 MC33665 的响应。

        而在 S32K3 的用户手册中,则说明了 LPSPI 在做从机时,其时钟是由外部主机提供的。


        也就是说对于 EB 中 S32K344 从机 SPI 波特率的设置可能并不会被 S32K344 使用:


        为了验证这一猜测,我们使用对应的 DSPI 工程进行验证,因为 S32K3 LPSPI 的波特率是针对 LPSPI 模组的功能时钟分频得到的,由于本人使用的是 LPSPI2 作为 MCU 从机:


        所以时钟源是 AIPS_SLOW_CLK(此处使用的时钟为 40MHz):

        而实际波特率的计算需要结合 TCR 寄存器的 PRESCALE 以及 CCR 的 SCKDIV(CCR.SCKDIV = CCR1.SCKSET + CCR1.SCKHLD)共同计算得到:

        所以如果要进行 SPI 通讯,势必会对上述寄存器进行更新,以 8MHz 为例,如果 AIPS_SLOW_CLK 为 40MHz,那么  TCR.PRESCALE = 0,CCR1.SCKSET= 2(CCR.SCKDIV ÷ 2 向上取整),CCR1.SCKHLD = 1(CCR.SCKDIV ÷ 2 向下取整),就能得到目标波特率。

        将断点打在获取 MC33665 UID 的部分(已涉及到双路 SPI 的收发),可以观察到 S32K344 的主 SPI CCR1.SCKSET 以及 CCR1.SCKHLD 等值均有更新,但是从 SPI 确并没有更新。也就是说 EB Tresos 中 SPI 设为从机时,其波特率的设定是没有效果的,只是为了保证 EB 生成代码的时候不报错写一个数据上去。



        为了进一步证实我们的结论,我们只需要更改 S32K344 从 SPI 波特率(从 8MHz 减为 2MHz),可以发现生成的配置代码是有更改的(40MHz ÷ 2^0 ×(18+2)=2MHz):

/* Lpspi_Ip_DeviceAttributes_SpiExternalDevice_RX_VS_0 Device Attribute Configuration of Spi*/
const Lpspi_Ip_ExternalDeviceType Lpspi_Ip_DeviceAttributes_SpiExternalDevice_RX_VS_0 =

{
2U, /* Instance */
(uint32)(LPSPI_CCR_SCKPCS(79U) | LPSPI_CCR_PCSSCK(79U) | LPSPI_CCR_SCKDIV(18U) | LPSPI_CCR_DBT(14U)), /* CCR */
/* Normal Mode TCR */
(uint32)LPSPI_TCR_WIDTH(0U) | (LPSPI_TCR_CPOL(0U) | LPSPI_TCR_CPHA(1U) | LPSPI_TCR_PRESCALE(0U) | LPSPI_TCR_PCS(0U) | LPSPI_TCR_CONT(1U)) /* TCR */

#if (STD_ON == LPSPI_IP_HALF_DUPLEX_MODE_SUPPORT)

/*HalfDuplexCfgr1*/
, LPSPI_CFGR1_OUTCFG(1u) | LPSPI_CFGR1_PINCFG(1u)
#endif

,&Lpspi_Ip_DeviceParamsCfg_VS_0[1U]
};


        但是,该配置代码并没有写入到实际的寄存器中,S32K344 是基于 MC33665 的 8MHz 时钟频率进行数据解析的:




        并且也能够抓取到单节电池 0.8V(测试环境):



        如此一来已经基本说明,在 Slave 模式下,EB 波特率设置是不会写入 S32K3 寄存器的,数据接收依靠外部 MC33665 提供时钟参考。其实我们可以再狠一点,调整一下 MC33665 SPI 时钟,看看 S32K3 不变是否能够正确解析 SPI Response。

        不过在 EB 中,MC33665 DSPI 作为主机时的 SPI 波特率只有两种选择:



        如果我们需要修改其他值可以在生成的配置文件 CDD_Phy_665a_Cfg.c 中调整 SYS_SPI_CFG 的数值:



        对于 MC33665 使用内部 RC 的情况,其 SPI 频率就是 48MHz ÷ RSPSPIDIV,所以只需要将其从原本的 0x6 修改成 0xC 即可:

{
.unsigned_access = 0xC01 /*Sys_Spi_Reg*/
},

 

         结果,S32K3 依然能够获取正确的 MC33665 回传的 UID。




        综上所述, Slave 模式下,EB 波特率设置是不会写入 S32K3 寄存器的,数据接收依靠外部 MC33665 提供时钟参考。


三、参考文档

[1] ds686430 - MC33665A Datasheet (3.0).pdf
[2] S32K3xx Reference Manual Rev. 8, 01/2024

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论