角色:你是一位熟悉 Renesas RA 系列的嵌入式专家
语言:C11
环境:
● MCU:R7FA4M3AD3CFB
● IDE:e² Studio 2021-07
● FSP:3.2.0自动生成 HAL/LL 驱动)
● 主频:100 MHz
● 编译器:GCC for Renesas (arm-none-eabi-gcc)
硬件连接:三片TLC5927级联控制 请评估一下下面TLC驱动代码有什么风险
/**
@file TLC5927.c
@brief RA 系列 MCU 驱动 TI TLC5927 16 通道恒流 LED 驱动器
@author XXX
@date 2025-08-26
功能:
GPIO 初始化
48 bit 灰度数据发送
全局亮度调节(0~10 级)
故障回读(开路/短路检测)
工作模式切换(Normal / Config / Error Detect / Switch)
*/
#include "TLC5927.h"
#include "hal_data.h"
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
/======================= 1. 底层引脚宏 =========================/
#define TLC5927_SIN_HIGH()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH)
#define TLC5927_SIN_LOW()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW)
#define TLC5927_SCLK_HIGH()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_HIGH)
#define TLC5927_SCLK_LOW()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_LOW)
#define TLC5927_OE_HIGH()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH)
#define TLC5927_OE_LOW()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW)
#define TLC5927_LE_HIGH()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH)
#define TLC5927_LE_LOW()
g_ioport.p_api->pinWrite(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW)
#define TLC5927_SOUT_READ(lv)
g_ioport.p_api->pinRead(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_06, (lv))
/*======================= 3. 模式表(最终锁定版) ==================*/
/* 所有波形由 TI 官方定义,禁止修改! */
/* Normal 模式:5 行,以 {-1,-1,-1} 结束 */
const int NORMAL_MODE_PATTERN[5][3] = {
{0, 1, 0},
{1, 1, 0},
{0, 1, 0},
{1, 1, 0},
{-1,-1,-1}
};
/* Switch 模式:7 行,以 {-1,-1,-1} 结束 */
const int SWITCH_MODE_PATTERN[7][3] = {
{0, 1, 0},
{1, 1, 0},
{0, 0, 0},
{1, 0, 0},
{0, 1, 0},
{1, 1, 0},
{-1,-1,-1}
};
/* Error Detect 模式:9 行,以 {-1,-1,-1} 结束 */
const int ERROR_DETECT_MODE_PATTERN[9][3] = {
{0, 1, 1},
{1, 1, 1},
{0, 1, 0},
{1, 1, 0},
{0, 0, 0},
{1, 0, 0},
{0, 0, 0},
{1, 0, 0},
{-1,-1,-1}
};
/* Error Detect Ready:3 行,以 {-1,-1,-1} 结束 */
const int ERROR_DETECT_READY[4][3] = {
{0, 0, 0},
{1, 0, 0},
{0, 1, 0},
{-1,-1,-1}
};
/* Configuration 模式:5 行,以 {-1,-1,-1} 结束 */
const int CONFIGURATION_MODE_PATTERN[5][3] = {
{0, 1, 1},
{1, 1, 1},
{0, 1, 0},
{1, 1, 0},
{-1,-1,-1}
};
/======================= 4. 亮度查找表 ==========================/
const uint8_t tlc5927_brightness_lut[11] = {
0x00, /* 0 0 % /
0x40, / 1 ~20 % /
0x80, / 2 ~33 % /
0xC0, / 3 ~47 % /
0xD4, / 4 ~65 % /
0x83, / 5 ~75 % /
0x4B, / 6 ~80 % /
0xEB, / 7 ~85 % /
0xB7, / 8 ~95 % /
0x4F, / 9 ~90 % */
0xFF /*10 ~100% */
};
/======================= 5. 静态函数声明 =========================/
static inline void send_bit(uint8_t bit);
static inline void digitalWrite(uint8_t pin, uint8_t val);
static void tlc5927_do_clk_ioe_le(const int state_list[][3]);
/================================================================/
void TLC5927_Init(void)
{
/* 数据输入(回读) */
g_ioport.p_api->pinCfg(g_ioport.p_ctrl, BSP_IO_PORT_04_PIN_06,
IOPORT_CFG_PORT_DIRECTION_INPUT);
}
/================================================================/
static inline void send_bit(uint8_t bit)
{
if (bit) TLC5927_SIN_HIGH();
else TLC5927_SIN_LOW();
}
void tlc5927_send_multiple_data(const uint16_t *data, size_t count)
{
for (size_t i = 0; i < count; ++i)
{
uint16_t val = data[i];
for (int8_t bit = 15; bit >= 0; --bit)
send_bit((val >> bit) & 1U);
}
}
/================================================================/
static inline void digitalWrite(uint8_t pin, uint8_t val)
{
/* pin 映射:1=SIN 2=CLK 3=OE 4=LE(仅兼容旧代码) */
switch (pin)
{
case 1: val ? TLC5927_SIN_HIGH() : TLC5927_SIN_LOW(); break;
case 2: val ? TLC5927_SCLK_HIGH() : TLC5927_SCLK_LOW(); break;
case 3: val ? TLC5927_OE_HIGH() : TLC5927_OE_LOW(); break;
case 4: val ? TLC5927_LE_HIGH() : TLC5927_LE_LOW(); break;
default: break;
}
}
static void tlc5927_do_clk_ioe_le(const int state_list[][3])
{
for (int i = 0; state_list[i][0] != -1; ++i)
{
digitalWrite(2, state_list[i][0]); /* CLK /
digitalWrite(3, state_list[i][1]); / OE /
digitalWrite(4, state_list[i][2]); / LE */
}
}
/================================================================/
void tlc5927_switch_mode(const int pattern[][3])
{
tlc5927_do_clk_ioe_le(SWITCH_MODE_PATTERN);
tlc5927_do_clk_ioe_le(pattern);
}
void tlc5927_normal_mode(void)
{
tlc5927_switch_mode(NORMAL_MODE_PATTERN);
TLC5927_OE_LOW(); /* 打开输出 */
}
void TLC5927_Write(uint16_t RM, uint16_t RH, uint16_t RL)
{
uint16_t data[3] = { RM, RH, RL };
tlc5927_send_multiple_data(data, 3);
TLC5927_LE_HIGH();
TLC5927_LE_LOW();
}
/================================================================/
void tlc5927Config(uint8_t voltage_gain)
{
if (voltage_gain > 127) voltage_gain = 127;
}
/================================================================/
uint16_t TLC5927_ReadError(uint16_t *Data3, uint16_t *Data2, uint16_t *Data1)
{
if (!Data3 || !Data2 || !Data1) return 1;
}
/================================================================/
uint16_t TLC5927_ReadSingle(void)
{
uint16_t ret = 0;
bsp_io_level_t lv;
}
/================================================================/
void TLC5927_SetBrightness(uint8_t level)
{
if (level > 10) level = 10;
tlc5927Config(tlc5927_brightness_lut[level]);
}