我正在编写一个基本的发光二极管程序,以便使用STM32L0xx芯片和TI TLC59116F点亮定制电路板上的LED,但我在解释数据表时遇到了一些问题。
我使用STM32CubeMX来设置初始I2C和初始化pins,并根据我找到的一些示例提出了以下内容。
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "led.h"
/* Private variables ---------------------------------------------------------*/
void TLC59116_Init(void)
{
// Set default register values
TLC59116_WriteReg(TLC59116_MODE1, TLC59116_MODE1_DEFAULT);
TLC59116_WriteReg(TLC59116_MODE2, TLC59116_MODE2_DEFAULT);
// Set all PWM values to 0x00 (OFF)
uint8_t aTXBuffer[] = { TLC59116_PWM0_AUTOINCR, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF,
TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF,
TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF,
TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF,
TLC59116_LEDOUT_OFF, TLC59116_LEDOUT_OFF };
TLC59116_WriteStream(sizeof(aTXBuffer), aTXBuffer);
// Set all LEDs to PWM Control
TLC59116_WriteReg(TLC59116_LEDOUT0, TLC59116_LEDOUT_ON);
TLC59116_WriteReg(TLC59116_LEDOUT1, TLC59116_LEDOUT_ON);
TLC59116_WriteReg(TLC59116_LEDOUT2, TLC59116_LEDOUT_ON);
TLC59116_WriteReg(TLC59116_LEDOUT3, TLC59116_LEDOUT_ON);
}
static void TLC59116_WriteReg(uint8_t reg, uint8_t val)
{
uint8_t aTXBuffer[] = { reg, val };
while(HAL_I2C_Master_Transmit(&hi2c1, TLC59116_ADDR, aTXBuffer, sizeof(aTXBuffer), 100) != HAL_OK)
{
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
}
static void TLC59116_WriteStream(uint8_t len, uint8_t *pData)
{
if (len == 0)
{
Error_Handler();
}
while(HAL_I2C_Master_Transmit(&hi2c1, TLC59116_ADDR, pData, len, 100) != HAL_OK)
{
if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
}
void TLC59116_LED(uint8_t led, uint8_t state)
{
if ((led < 0) || (led > 15)) {
Error_Handler();
} else {
TLC59116_WriteReg(led + TLC59116_PWM0, state);
}
}
void TLC59116_SLEEP(void)
{
TLC59116_WriteReg(TLC59116_MODE1, TLC59116_MODE1_SLEEP);
}
void TLC59116_WAKE(void)
{
TLC59116_WriteReg(TLC59116_MODE1, TLC59116_MODE1_DEFAULT);
HAL_Delay(5);
}然后在main.c中
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USB_PCD_Init();
TLC59116_Init();
TLC59116_LED(TLC59116_PWM5, 0x01); // Sets LED 5 to ON
}编辑:这是一个包含HAL错误检查等功能的更完整的代码示例。
发布于 2019-09-05 10:06:17
假设您已经让STM32CubeMX为您的I2C总线生成了正确的初始化,那么您可以使用您引用的轮询方法来评估TLC59116:
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);设置DevAddress的值在数据手册的第23页定义,因此在写入寄存器时,您必须查看原理图并将位0设为0。假设电路板上的A3:0 = 0x0,DevAddress将变为:
读取(readAddr)
接下来,您需要设置包含要设置的寄存器地址和寄存器值的有效负载。例如(参见数据表的第18页):
uint8_t aTxBuffer[2] = {};
aTxBuffer[0] = 0x14; /* LEDOUT0 register */
aTxBuffer[1] = 0x05; /* Turn on LED 0 and LED 1 */
HAL_I2C_Master_Transmit(hi2c1, writeAddr, aTxBuffer, sizeof(aTxBuffer), 100);但是,在执行上述操作之前,请务必查看MODE1寄存器。您需要清除OSC位,否则您将永远不会点亮LED。
uint8_t aTxBuffer[2] = {};
aTxBuffer[0] = 0x00; /* MODE1 register */
aTxBuffer[1] = 0x00; /* Example only, review each bit */
HAL_I2C_Master_Transmit(hi2c1, writeAddr, aTxBuffer, sizeof(aTxBuffer), 100);上面说明了如何写入单个寄存器,以将数据流式传输到多个寄存器位置:
void TLC59116_WriteStream(uint8_t len, uint8_t *pData)
{
if (len == 0)
{
ErrorHandler();
}
HAL_I2C_Master_Transmit(&h12c1, TLC59116_ADDR, pData, len, 100);
}其中TLC59116_ADDR = 0xC0和pData指向要发送到TI设备的消息的基地址。
要将所有16个PWM寄存器设置为0x00或off:
uint8_t aTXBuffer[] = { TLC59116_PWM0_AUTOINCR, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
TLC59116_WriteStream(sizeof(aTXBuffer), aTXBuffer);Where TLC59116_PWM0_AUTOINCR = 0x82;
https://stackoverflow.com/questions/57796932
复制相似问题