电子说
TPS929120是TI公司在2019年4月份发布的具有FlexWire接口的12通道汽车级40V高边LED驱动芯片,其主要特点如下:
笔者用来调试TPS929120所制作的DEMO板,整体框图如下:
DEMO板分为驱动板和灯板两部分,接近客户的实际使用情况。其中,
另外,该Demo板也预留了MCU的UART引脚作为测试点,方便查看S32K144和TPS929120的通信数据,从而在调试时更快地锁定问题。
灯板原理图参考如下官方demo板进行设计:
参考电流计算公式如下,其中Vref为1.235V(数据手册典型值),Kref默认值为512(可以通过修改寄存器CONF_MISC1中的CONF_REFRANGE进行调整)。
根据查表,此电路中TPS929120默认的参考电流为50mA(灯板上TPS929120贴的REF电阻为12.4K,计算值为51mA)。
TPS929120可以使用外部地址,也可以使用内部EEPROM预烧写的地址,此次DEMO使用外部地址。两片TPS929120的ADDR0,ADDR1,ADDR2引脚电压分别为000,100;根据下面的器件地址设置表格可以知道(EEP_DEVADDR[3:0]的默认值为0000b),两片TPS929120的地址分别为0和1。
TPS929120使用的通信方式,TI称之为FlexWire,其实就是UART(数据链路层)+CAN物理层,然后在传输层增加一些自定义的帧格式,目前其他厂家新出的多通道LED Driver基本都是采用这种通信方式。
FlexWire的物理层使用CAN收发器,主要的作用就是将普通的串行信号转换成差分信号(时序图如下),比较常用的有TJA1044,TCAN1042等。
FlexWire的数据链路层使用的是UART通信,因为TPS929120内部的时钟最高为1MHz,为了通信稳定,所以MCU内部的UART配置的波特率为500K;其它配置为8bit数据位,无奇偶校验,1bit停止位。
需要注意的是,如果加了CAN收发器,由于CAN收发器自带的回环功能,实际上主机也会收到他自身发的数据,所以实际主机收到的数据应该是 自身发的数据 + TPS929120响应的数据 。
当一次性写8个寄存器数据时,MCU的UART_RX收到的数据最多,为MCU发出的12字节+2字节
DEV_ADDR
的组成元素较多,如下所示,其他都是单一元素组成。配置其他寄存器之前需要先配置CONF_LOCK Register(61h)进行解锁,主要是如下四个4bit,这4个bit上电之后默认为1,处于lock状态,需要清0进行unlock。
这4个bit分别能够lock与unlock的寄存器如下图:
根据上面的分析,如果只配置通道使能,其他寄存器不设置,使能的通道会输出50mA的电流。
TPS929120在配置通道使能的情况下,即使配置PWM占空比为0,也会有微亮的情况。
接下来,将基于S32K144介绍如何使用MCU驱动TPS929120,实现一些基本的灯光控制功能。
写寄存器的帧格式如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
读寄存器的帧格式和写寄存器的帧格式相近,这里就不赘述了。
硬件上使用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<
实现写寄存器的函数之后,就可以基于该函数实现一些基本的操作TPS929120函数了,主要是如下几个:
如下代码中包含了很多寄存器的宏定义,没有进行展开,读者可以借助数据手册进行对比。
1.unlock与lock寄存器的函数实现如下:
3.清除错误状态和标志的函数实现如下:
实现了上述基本控制函数之后,接下来就是控制TPS929120实现基本的灯效了。
首先需要对TPS92910进行初始化,主要流程参考如下代码:
然后就是在主循环中实现灯效,这里以呼吸效果为例,代码如下:
下面代码在测试TPS92910竞品更改过,PWM占空比为0时仍有漏电流的问题被修复了。如果驱动TPS929120,建议在PWM占空比到0时,增加关闭通道的操作。
全部0条评论
快来发表一下你的评论吧 !