0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于S32K144实现TPS929120的基本控制功能

冬至子 来源:Auto FAE进阶之路 作者:Yingming 2023-05-30 10:49 次阅读

1.TPS92910简介

TPS929120是TI公司在2019年4月份发布的具有FlexWire接口的12通道汽车级40V高边LED驱动芯片,其主要特点如下:

  • 12路高边精确电流输出通道
    • 供电电压4.5V到40V
    • 电阻预设电流最高到75mA
    • 2bit全局的,6bit独立的电流设置
    • 输出电流在5mA到75mA时,精度可达±5%
    • 输出电流在1mA时,精度为±10%
    • 输出电流50mA时的压降为0.5V
    • 12bit独立PWM调光
    • 编程的PWM频率最高可达20kHz
    • 支持线性和指数两种调光方式
  • FlexWire控制接口
    • 最高1MHz的时钟频率
    • FlexWire总线最多可挂16个器件
    • 一帧命令最多可以传输8字节的寄存器数据
    • 内部集成5V LDO可以给CAN收发器供电
  • 诊断和保护功能
    • 可编程的fail-safe状态
    • LED开路检测
    • LED短路检测
    • 单颗LED短路诊断
    • 可编程的欠压检测
    • 开漏模式的ERR引脚,可以通知主机是否发生故障
    • 用于判断FlexWire通信是否正常的看门狗和CRC校验
    • 用于引脚电压测量的8bit的ADC
    • 过温保护

2.硬件调试平台

笔者用来调试TPS929120所制作的DEMO板,整体框图如下:

图片

DEMO板分为驱动板和灯板两部分,接近客户的实际使用情况。其中,

  • 驱动板上面主要是给灯板供电的DCDC,给S32K和TJA1044供电的LDO;
  • 灯板上面主要是灯驱TPS929120和LED灯驱;
  • 驱动板和灯板之间通过差分总线进行通信,抗干扰能力相比传统的I2C,SPI提高很多;
  • 由于给灯板供电只有6.5V,所以TPS929120的整体功耗相比正常的12V供电系统能降低不少。

另外,该Demo板也预留了MCUUART引脚作为测试点,方便查看S32K144和TPS929120的通信数据,从而在调试时更快地锁定问题。

2.1 灯板原理图

灯板原理图参考如下官方demo板进行设计:

图片

2.2 参考电流

参考电流计算公式如下,其中Vref为1.235V(数据手册典型值),Kref默认值为512(可以通过修改寄存器CONF_MISC1中的CONF_REFRANGE进行调整)。

图片

根据查表,此电路中TPS929120默认的参考电流为50mA(灯板上TPS929120贴的REF电阻为12.4K,计算值为51mA)。

图片

2.3 器件地址

TPS929120可以使用外部地址,也可以使用内部EEPROM预烧写的地址,此次DEMO使用外部地址。两片TPS929120的ADDR0,ADDR1,ADDR2引脚电压分别为000,100;根据下面的器件地址设置表格可以知道(EEP_DEVADDR[3:0]的默认值为0000b),两片TPS929120的地址分别为0和1。

图片

3.TPS929120通信协议

TPS929120使用的通信方式,TI称之为FlexWire,其实就是UART(数据链路层)+CAN物理层,然后在传输层增加一些自定义的帧格式,目前其他厂家新出的多通道LED Driver基本都是采用这种通信方式。

3.1 物理层

FlexWire的物理层使用CAN收发器,主要的作用就是将普通的串行信号转换成差分信号(时序图如下),比较常用的有TJA1044,TCAN1042等。

图片

3.2 数据链路层

FlexWire的数据链路层使用的是UART通信,因为TPS929120内部的时钟最高为1MHz,为了通信稳定,所以MCU内部的UART配置的波特率为500K;其它配置为8bit数据位,无奇偶校验,1bit停止位。

3.3 传输层

2.3.1 读写时序

  • 主机向TPS929120写数据:
    图片
  • 主机从TPS929120读数据:

图片

需要注意的是,如果加了CAN收发器,由于CAN收发器自带的回环功能,实际上主机也会收到他自身发的数据,所以实际主机收到的数据应该是 自身发的数据 + TPS929120响应的数据

当一次性写8个寄存器数据时,MCU的UART_RX收到的数据最多,为MCU发出的12字节+2字节

2.3.2 帧格式说明

  • 总体格式如下:

图片

  • 其中DEV_ADDR的组成元素较多,如下所示,其他都是单一元素组成。

图片

2.3.3 寄存器lock与unlock

配置其他寄存器之前需要先配置CONF_LOCK Register(61h)进行解锁,主要是如下四个4bit,这4个bit上电之后默认为1,处于lock状态,需要清0进行unlock。

图片

这4个bit分别能够lock与unlock的寄存器如下图:

图片

2.3.4 输出通道控制

  • CONF_EN0(50h),CONF_EN1(51h)分别控制通道0-7,8-11的使能;默认值为0h。
  • IOUT0(00h)到IOUT11(0Bh)分别通道0到11的电流,一共64-step,实际的通道输出电流的计算公式如下,其中此电路板的I(FULL_RANGE)为50mA;这些寄存器在reset之后加载对应的EEPROM中EEPIx寄存器的值,EEPIx默认为3Fh。

图片

  • PWM0(20h)到PWM11(2Bh),PMWL0(40h)到PWML11(4Bh)都是控制通道0到11的PWM占空比,前者用于粗调,后者用于微调,计算公式如下;前者在reset之后加载对应的EEPROM中EEPPx寄存器的值,为FFh,后者的默认值为Fh。

图片

根据上面的分析,如果只配置通道使能,其他寄存器不设置,使能的通道会输出50mA的电流。

TPS929120在配置通道使能的情况下,即使配置PWM占空比为0,也会有微亮的情况。

4.使用S32K144驱动TPS92910

接下来,将基于S32K144介绍如何使用MCU驱动TPS929120,实现一些基本的灯光控制功能。

4.1 实现命令帧格式

4.1.1 写寄存器的帧格式

写寄存器的帧格式如2.3.2章节所述,先发SYNC(0x55),然后是DEV_ADDR(由4种元素组成),然后是REG_ADDR(数据手册中寄存器的地址),然后是DATA(要写入寄存器的数据),最后是CRC

整体实现代码如下:

void FlexWrite(uint8_t DEV_ADDR_x, uint8_t registerAddr, uint8_t DATA_BYTES[], uint8_t DATA_LENGTH_x, uint16_t checkResponse)
{
    uint8_t DEV_ADDR=0x00, REG_ADDR;
    uint8_t commandFrame[12] = {0};// one longest command frame length is 12
    uint8_t dataLength=0, frameLength=0, responseLength = 0;
    uint16_t i;

    DEV_ADDR = (FLEX_Write | DATA_LENGTH_x | DEV_ADDR_x);
    REG_ADDR = registerAddr;

    commandFrame[0] = 0x55; //SYNC byte
    commandFrame[1] = DEV_ADDR;
    commandFrame[2] = REG_ADDR;

    switch (DATA_LENGTH_x)
    {
    case 0:
        {
            dataLength = 1;
            break;
        }
    case 16:
        {
            dataLength = 2;
            break;
        }
    case 32:
        {
            dataLength = 4;
            break;
        }
    case 48:
        {
            dataLength = 8;
            break;
        }
    default : break;
    }

    for(i=0;i

4.1.1 读寄存器的帧格式

读寄存器的帧格式和写寄存器的帧格式相近,这里就不赘述了。

4.2 实现Uart串口收发

硬件上使用LPUART1模块,引脚选择PTC8和PTC9,软件配置为波特率500K,8N1。同时,因为使用了CAN收发器,所以串口实际接收到的数据是发送的数据加上TPS929120响应的数据。

整体实现代码如下:

/*********************************************************************************************************
** Function name:       uartWrite
** Descriptions:        N/A
** input parameters:    N/A
** output parameters:   N/A
** Returned value:      N/A
*********************************************************************************************************/
void uartWrite(uint8_t commandFrame[], uint16_t frameLength, uint16_t checkResponse, uint16_t responseLength)
{
    uint8_t i =0;

    /* Enable  the receiver and receive data full interrupt of LPUART1*/
    LPUART_DRV_ReceiveData(INST_LPUART1, responseData, 1u);
    /* The function does not return until the transmit is complete or timeout(2ms) occured*/
    LPUART_DRV_SendDataBlocking(INST_LPUART1, commandFrame, frameLength, 2);
    if(checkResponse == TRUE)
    {
        /* launch timer and set wait time = 2000us
        * This time should be larger than the time to receive all the response bytes,
        * And the response receiving time depends on the buard rate and the number of response byte,
        * For example, baurd rate = 500000, 2 response byte, so the wait time should be larger than 2*10*1/500000 = 40us
        * Why 2*10 because for each byte there are additional 1 start bit and 1 stop bit
        */
        timeOut(2000);
 
        /* received all response byte or the wait time exceeds the specified time */
        while(!((timeOutFlag == 1) || (receiveByteNum == responseLength)));

        /*Take some action when successfully received response*/
        if(receiveByteNum == responseLength)
        {
            /* Turn off Red LED and turn on Green LED*/
            PINS_DRV_WritePin(LED_PORT, RED_LED, 1);
            PINS_DRV_TogglePins(LED_PORT, 1<

4.3 实现基本的控制功能

4.3.1 操作TPS92910的基本函数

实现写寄存器的函数之后,就可以基于该函数实现一些基本的操作TPS929120函数了,主要是如下几个:

如下代码中包含了很多寄存器的宏定义,没有进行展开,读者可以借助数据手册进行对比。

1.unlock与lock寄存器的函数实现如下:

图片

3.清除错误状态和标志的函数实现如下:

图片

  1. 配置通道电流的函数实现如下:

图片

  1. 打开通道的函数实现如下:

图片

  1. 关闭通道的函数实现如下:

图片

  1. 配置通道的PWM占空比的函数实现如下:

图片

4.3.1 TPS929120控制流程

实现了上述基本控制函数之后,接下来就是控制TPS929120实现基本的灯效了。

首先需要对TPS92910进行初始化,主要流程参考如下代码:

图片

然后就是在主循环中实现灯效,这里以呼吸效果为例,代码如下:

下面代码在测试TPS92910竞品更改过,PWM占空比为0时仍有漏电流的问题被修复了。如果驱动TPS929120,建议在PWM占空比到0时,增加关闭通道的操作。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5292

    浏览量

    119798
  • EEPROM
    +关注

    关注

    9

    文章

    1008

    浏览量

    81321
  • LED驱动芯片
    +关注

    关注

    8

    文章

    168

    浏览量

    25682
  • CAN收发器
    +关注

    关注

    2

    文章

    162

    浏览量

    25587
  • PWM调光
    +关注

    关注

    2

    文章

    206

    浏览量

    33809
收藏 人收藏

    评论

    相关推荐

    S32k144底层程序

    S32k144底层程序
    发表于 01-23 14:13

    S32k144底层程序

    S32k144底层程序
    发表于 02-26 10:19

    如何实现S32K144的中断接收?

    如何实现S32K144的中断接收?
    发表于 02-07 07:16

    如何通过s32k144定时器从VLPS唤醒?

    我想实现 VLPS 模式,然后在 s32K144 上通过定时器唤醒。我可以将 s32k144 设置为 VLPS 模式,并通过中断 GPIO 唤醒。但是不知道如何通过定时器唤醒。你能为我的目的与我分享一些经验吗?
    发表于 03-20 06:29

    如何在S32DS3.5上使用Jlink对S32K144片上FLASH进行所有操作?

    我用的是S32DS3.5,想用Jlink擦除S32K144的所有片上FLASH,但是在S32DS3.5的界面上找不到实现这个功能的选项。我应
    发表于 03-22 06:56

    启用S32K144上的Csec功能时问题求解

    我在尝试启用 S32K144 上的 Csec 功能时遇到了问题,为此,我尝试的第一步是将 flexNVM 分区为 32K/32K,我发现当 FCCOB1 设置为非零时,其余的FCCOB
    发表于 03-23 06:49

    如何知道S32K144中使用了多少RAM?

    我如何知道 S32K144 中使用了多少 RAM?RAM = Data + Bss,如何知道软件运行时S32K144使用了多少RAM?S32K144 现在在不固定的点重新启动。
    发表于 03-23 07:04

    无法将S32k144更改为48 针怎么解决?

    我的IDE版本是ARMv2.2,SDK:RTM3.0.0。我想为我的 48-LQFP S32K144 板使用 SPI 程序。当我选择示例项目或创建新项目时,我无法将 S32k144 更改为 48 针。.S32 CPU
    发表于 03-31 07:27

    S32K144解锁问题

    S32K144芯片用Jlink的commander操作解锁成功后,仍然无法进行擦除和连接,有没有大佬知道原因
    发表于 04-01 14:08

    求分享S32k144 Modbus示例

    我们正在使用 S32K144 板开发 Modbus RTU。我已经购买了评估板,但是S32DS V3.4 SDK 4.0.3 中没有Modbus RTU 示例。只有 Uart 存在,但我想获得有关 modbus RTU 的支持,有没有合适的例子?
    发表于 04-04 07:28

    可以为S32K144配置电子邮件吗?

    我在配置S32K144的can邮箱的时候,是不是应该配置这个寄存器来配置S32K144的最大邮箱数?CAN0->MCR = 0x0000000F | CAN_MCR_SRXDIS(1
    发表于 04-18 07:37

    S32K144 CAN失败的原因?如何解决?

    现在我的设计是TI MCU+ S32K144。TI为主,S32K144为从。一开始,The can 工作正常。大约十五小时后,CAN 出现故障。S32K144 TX实测波形如下图:另外,在向S
    发表于 04-19 08:19

    S32K144三相如何预充?

    S32K144三相如何预充。有软件案例 无
    发表于 05-18 06:32

    s32k144有哪些可用的诊断?

    我们在设计中使用 S32k144 uC。能告诉我 uC (S32K144) 有哪些可用的诊断吗?
    发表于 05-25 07:29

    TPS929120的CRC校验的三种实现方法

    最近在帮客户编写基于S32K144编写TPS929120的软件驱动时,需要在发送数据的末端增加8bit的CRC校验码。
    的头像 发表于 05-30 10:39 991次阅读
    <b class='flag-5'>TPS929120</b>的CRC校验的三种<b class='flag-5'>实现</b>方法