首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有带TLC59116 I2C示例代码的STM32L0xx?

有没有带TLC59116 I2C示例代码的STM32L0xx?
EN

Stack Overflow用户
提问于 2019-09-05 08:09:30
回答 1查看 538关注 0票数 0

我正在编写一个基本的发光二极管程序,以便使用STM32L0xx芯片和TI TLC59116F点亮定制电路板上的LED,但我在解释数据表时遇到了一些问题。

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

代码语言:javascript
复制
/* 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中

代码语言:javascript
复制
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错误检查等功能的更完整的代码示例。

EN

回答 1

Stack Overflow用户

发布于 2019-09-05 10:06:17

假设您已经让STM32CubeMX为您的I2C总线生成了正确的初始化,那么您可以使用您引用的轮询方法来评估TLC59116:

代码语言:javascript
复制
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将变为:

  • 0xC0,用于写入(writeAddr)到TLC59116
  • 0xC1,用于从TLC59116

读取(readAddr)

接下来,您需要设置包含要设置的寄存器地址和寄存器值的有效负载。例如(参见数据表的第18页):

代码语言:javascript
复制
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。

代码语言:javascript
复制
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);

上面说明了如何写入单个寄存器,以将数据流式传输到多个寄存器位置:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57796932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档