0

我正在编写一个基本的 LED 程序,以使用 STM32L0xx 芯片和 TI TLC59116F 在定制板上点亮 LED,但我在解释数据表时遇到了一些麻烦。

我使用 STM32CubeMX 设置初始引脚和初始化 I2C,并根据我找到的一些示例提出以下内容。

/* 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 错误检查等。

4

1 回答 1

1

假设您有 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 写入寄存器时。假设板上的 A[3:0] = 0x0,DevAddress 将变为:

  • 0xC0 用于写入 (writeAddr) 到 TLC59116
  • 0xC1 用于从 TLC59116 读取 (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);
}

whereTLC59116_ADDR = 0xC0和 pData 指向要发送到 TI 设备的消息的基地址。

要将所有 16 个 PWM 寄存器设置为 0x00 或关闭:

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);

在哪里TLC59116_PWM0_AUTOINCR = 0x82;

于 2019-09-05T02:06:17.237 回答