目录
一.芯片基本介绍(不过多展开,网上也有相应文章了)
二.功能及接口
1.芯片寄存器操作(读和写接口)
2.芯片初始化配置(用于工作参数配置及初始化PWM输出)
3.芯片错误管脚获取
4.芯片12路通道状态返回(返回输出状态、开路、短路、过温、通讯失败、控制器初始化状态、欠压等)
5.芯片12路通道PWM频率输出(12路频率统一配置,并非单独可设)
6.芯片12路通道PWM占空比输出(12路占空比单独可设, 占空比范围0~100%)
三.接口实现及关键寄存器说明
1.读/写寄存器
1)SYNC为同步字节,为0x55
2)DEV_ADDR读写数据控制字节,也是协议重要参数所在,其定义如下:
3)REG_ADDR寄存器地址(参见芯片手册)
4)DATA_1…DATA_N读/写入寄存器数据
5)CRC协议校验字节,从DEVICE_ADDR到DATA_N的CRC值
6)STATUS状态字节
7)从上图可以看出,执行写操作命令后,LED控制器会返回控制器的FLAG0寄存器值作为对写指令的响应其中也包含控制工作状态;执行读操作后,LED控制器会返回相应请求寄存器的值。
2.芯片初始化配置
3.芯片错误管脚获取
4.芯片12路通道状态返回(返回输出状态、开路、短路、过温、通讯失败、控制器初始化状态、欠压等)
5.芯片12路通道PWM频率输出(12路频率统一配置,并非单独可设)
6.芯片12路通道PWM占空比输出(12路占空比单独可设, 占空比范围0~100%)
四.故障检测
1.开路故障
2.短路故障(LED主要是对地故障为主)
近期开发一个项目用到了TPS929120 LED控制器芯片,开发过程中有了些许体会,下面将其整理成文,以帮助使用该芯片的科技开发人。如有描述不当还请包含指正。
一.芯片基本介绍(不过多展开,网上也有相应文章了)
先简单描述下此芯片的功能:12路LED PWM输出控制,掉电重启恢复(EEPROM配置加载,目前项目中未使用,所以不需要配置EEPROM),具备故障诊断功能,通讯方式采用类似串口的Flexwire方式。

默认情况下控制器通讯地址由外部ADDR0~ADDR2(0~15)决定。对于MCU驱动开发主要关心其中TX,RX,ERR,REF,OUT0~OUT11这几个管脚基本就可以。
TX,RX:Flexwire通讯管脚
ERR:错误通知管脚
REF:参考电阻,与通道输出限流相关,之后会讲到
OUT0~OUT11:LED PWM输出通道。
二.功能及接口
废话不多说,直接上干货,通过对该芯片手册的理解,开发LED控制器驱动主要完成如下这些主要功能及接口(使用伪代码),基本可以覆盖其他功能的拓展,此处先简单罗列稍后展开:
1.芯片寄存器操作(读和写接口)
LedChip_TPS929120_Read_Register(StartRegisterAddr, *Rxbuf, ByteSize)
LedChip_TPS929120_Write_Register(StartRegisterAddr, *Txbuf, ByteSize)
2.芯片初始化配置(用于工作参数配置及初始化PWM输出)
LedChip_TPS929120_Init()
3.芯片错误管脚获取
LedChip_TPS929120_Err_Pin_Get_Status()
4.芯片12路通道状态返回(返回输出状态、开路、短路、过温、通讯失败、控制器初始化状态、欠压等)
LedChip_TPS929120_Outx_Get_Status(OutPin, *Status)
5.芯片12路通道PWM频率输出(12路频率统一配置,并非单独可设)
LedChip_TPS929120_Set_Frequency(PwmFrequency)
6.芯片12路通道PWM占空比输出(12路占空比单独可设, 占空比范围0~100%)
LedChip_TPS929120_Outx_Set_Duty(OutPin, Duty)
三.接口实现及关键寄存器说明
1.读/写寄存器
在实现读写寄存器接口前我们必须先了解控制器的通讯协议,其有两种协议格式,一种为单字节模式,一种是多字节模式(顾名思义,连续读/写入多个连续寄存器),我们这里主要针对多字节模式进行展开讨论,协议格式如下:

图中RX为控制器接受管脚,即MCU发送管脚;TX为控制器发送管脚,即MCU接受管脚
1)SYNC为同步字节,为0x55
2)DEV_ADDR读写数据控制字节,也是协议重要参数所在,其定义如下:

DEVICE_ADDR:
LED控制器在flexwire上的地址,可以认为是设备的ID范围0~15,即上文提到的ADDR0~ADDR2决定,也可以通过EEPROM进行配置。
DATA_LENGTH:
写入数据的长度(单位:字节),需要注意这个长度并非任意,而是特定长度,同时也是区分单字节工作模式,还是多字节工作模式关键,只能选择1(单字节模式),2,4,8(多字节模式)
BROADCAST:
广播模式还是单设备模式
READ/WRITE:
读/写选择位
3)REG_ADDR寄存器地址(参见芯片手册)
4)DATA_1…DATA_N读/写入寄存器数据
5)CRC协议校验字节,从DEVICE_ADDR到DATA_N的CRC值
6)STATUS状态字节
即控制器的FLAG0寄存器值
7)从上图可以看出,执行写操作命令后,LED控制器会返回控制器的FLAG0寄存器值作为对写指令的响应其中也包含控制工作状态;执行读操作后,LED控制器会返回相应请求寄存器的值。
通过这样的分析是否这个芯片的驱动变得简单明了不少,无非就是固定的协议字节+读/写寄存器值。哈哈!
下面我将提供这两个接口的伪代码逻辑:
LedChip_TPS929120_Read_Register(StartRegisterAddr, *Rxbuf, ByteSize)
{
/* 定义一个足够长的缓冲区buf */
/* 根据StartRegisterAddr和ByteSize值,组读指令:
同步+设备地址(读写位R,读长度)+读寄存器地址+CRC,将其放入buf中。*/
/* 调用MCU串口驱动发送buf数据 */
/* 调用MCU串口驱动接受控制器回复数据 */
/* 判断接受数据有效性,赋值RxBuf */
}
LedChip_TPS929120_Write_Register(StartRegisterAddr, *Txbuf, ByteSize)
{
/* 定义一个足够长的缓冲区buf */
/* 根据StartRegisterAddr和ByteSize值,组写指令:
同步+设备地址(读写位W,写长度)+写寄存器地址+DATA1~N+CRC,将其放入buf中。*/
/* 调用MCU串口驱动发送buf数据 */
/* 调用MCU串口驱动接受控制器回复状态字节 */
/* 检查状态字节有效性,返回发送是否成功 */
}
2.芯片初始化配置
初始化配置大体流程,其中会调用读写寄存器接口,同时需要注意Led控制器寄存器有写防护锁,配置部分寄存器需要打开防护锁,如下:

LedChip_TPS929120_Init()
{
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全0,配置关闭防护锁 */
/* 调用上文的写寄存器接口,写CONF_EN0~1寄存器,使能通道 */
/* 调用上文的写寄存器接口,写CONF_MISC0~1寄存器, 配置输出总频率,K(ref) */
/* 调用上文的写寄存器接口,写IOUT0~11寄存器, 配置各路限流参数 */
/* 调用上文的写寄存器接口,写CONF_DIAGEN0~1寄存器, 配置各路故障诊断开启 */
/* 调用上文的写寄存器接口,写PWM0~11及PWML0~11寄存器, 配置各路占空比为0 */
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全1,配置开启防护锁 */
}
3.芯片错误管脚获取
通过系统GPIO读取接口获取Err Pin状态
LedChip_TPS929120_Err_Pin_Get_Status()
{
/* 通过读GPIO管脚接口获取Err PIN 状态 */
/* 返回Err PIN 状态 */
}
4.芯片12路通道状态返回(返回输出状态、开路、短路、过温、通讯失败、控制器初始化状态、欠压等)
LedChip_TPS929120_Outx_Get_Status(OutPin, *Status)
{
/* 调用上文的读寄存器接口,获取FLAG0~1,CONF_EN0~1,FLAG11~14等的寄存器值状态 */
/* 将对应值状态整合到Status中 */
}
5.芯片12路通道PWM频率输出(12路频率统一配置,并非单独可设)
其芯片总频率有几个档位可以选择

LedChip_TPS929120_Set_Frequency(PwmFrequency)
{
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全0,配置关闭防护锁 */
/* 调用上文的写寄存器接口,根据PwmFrequency写CONF_MISC1 */
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全1,配置开启防护锁 */
}
6.芯片12路通道PWM占空比输出(12路占空比单独可设, 占空比范围0~100%)
设置每路通道占空比主要依据手册中的占空比转换公式,如下:

其中CONF_PWMOUTx和CONF_PWMLOWOUTx分别为配置PWMx和PWMLx寄存器位,即占空比的高位和低位。
LedChip_TPS929120_Outx_Set_Duty(OutPin, Duty)
{
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全0,配置关闭防护锁 */
/* 调用上文的写寄存器接口,根据OutPin, Duty选择对应通道寄存器PWMx和PWMLx */
/* 调用上文的写寄存器接口,写CONF_LOCK寄存器为全1,配置开启防护锁 */
}
四.故障检测
故障检测功能是此LED控制芯片中比较重要的点,是为防止线路短路、开路。我们在项目中开始也遇到了开路误报的情况,通过一番研究才理解其工作的大致原理,解决了开路误报的问题。所以单独列一个章节进行描述。
我这里尽量用通俗易懂的方式进行描述,便于大家更好的理解。先贴上判断短路开路的依据,这里需要仔细阅读芯片手册,芯片对两种状态下短路开路等诊断类型进行详细定义描述,如下:


我们主要讨论正常模式时的短路和开路,这两个比较常用。
1.开路故障

从上图中可以看出其开路判断条件主要是根据压差检测得到的,在讨论这个条件之前,我们先仔细看下芯片手册,其中有这样的描述,这也充分说明了Led控制器每路的最大电流限制,如下:
(1)
(2)
这两个公式是Led控制器上每路通道最大输出电流,为了便于理解,公式(1)可以认为是LED控制器电流最大值,公式(2)为单路分流电压限制。其中部分参数是硬件设计决定,我们假设将其固定:
V(REF) = 1.235 V
K(Ref)这个参数在前文有所提及,是重要参数之一

当我们选择R(ref)=12.7kΩ(硬件决定),K(ref)=512时,带入公式(1)则I(full_range)= 1.235V/12.7kΩ*512 = 0.0497A,即50mA。也就意味led控制器电流被限定在了50mA(类似于粗调电流档位)。而每路输出根据公式(2),CONF_IOUTx 在分子位置,所以其类似于单路限流器,可以将电流分为64档,0~63。
好了,让我们回过来看这个开路条件,假设V(supply)= 12V,V(open_th_rising)=?,再仔细阅读手册,你会发现

选取中值V(open_th_rising)= 400mV,好了,我们发现开路判定条件变为了12V-V(OUTx)<400mV,即V(OUTx)> 11.6V,就会满足开路故障上报条件,然后再看V(supply)> V(ADCLOWSUPTH) ,其中5V<V(ADCLOWSUPTH) < 20V,可配置,默认值8V,所以V(supply)> V(ADCLOWSUPTH)成立。那么当CONF_IOUTx选为63时,11.6V/50mA=232Ω。这样我们可以得出当外接负载电阻<232Ω,不会上报开路,>232欧姆,会上报故障。
2.短路故障(LED主要是对地故障为主)
短路相对简单,当接地时电阻接近0,输出V(OUTx)接近0,满足对地短路条件,会上报短路故障


至此本次驱动开发历程结束,谢谢大家耐心看完,你的支持就是我最大的创作动力!