1.TPS92910簡介
TPS929120是TI公司在2019年4月份發布的具有FlexWire接口的12通道汽車級40V高邊LED驅動芯片,其主要特點如下:
- 12路高邊精確電流輸出通道
- FlexWire控制接口
- 診斷和保護功能
2.硬件調試平臺
筆者用來調試TPS929120所制作的DEMO板,整體框圖如下:
DEMO板分為驅動板和燈板兩部分,接近客戶的實際使用情況。其中,
- 驅動板上面主要是給燈板供電的DCDC,給S32K和TJA1044供電的LDO;
- 燈板上面主要是燈驅TPS929120和LED燈驅;
- 驅動板和燈板之間通過差分總線進行通信,抗干擾能力相比傳統的I2C,SPI提高很多;
- 由于給燈板供電只有6.5V,所以TPS929120的整體功耗相比正常的12V供電系統能降低不少。
另外,該Demo板也預留了MCU的UART引腳作為測試點,方便查看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.清除錯誤狀態和標志的函數實現如下:
- 配置通道電流的函數實現如下:
- 打開通道的函數實現如下:
- 關閉通道的函數實現如下:
- 配置通道的PWM占空比的函數實現如下:
4.3.1 TPS929120控制流程
實現了上述基本控制函數之后,接下來就是控制TPS929120實現基本的燈效了。
首先需要對TPS92910進行初始化,主要流程參考如下代碼:
然后就是在主循環中實現燈效,這里以呼吸效果為例,代碼如下:
下面代碼在測試TPS92910競品更改過,PWM占空比為0時仍有漏電流的問題被修復了。如果驅動TPS929120,建議在PWM占空比到0時,增加關閉通道的操作。
-
寄存器
+關注
關注
31文章
5322瀏覽量
120020 -
EEPROM
+關注
關注
9文章
1010瀏覽量
81411 -
LED驅動芯片
+關注
關注
8文章
170瀏覽量
25711 -
CAN收發器
+關注
關注
2文章
165瀏覽量
25606 -
PWM調光
+關注
關注
2文章
206瀏覽量
33839
發布評論請先 登錄
相關推薦
評論