在一些智能玩具上经常需要多路LED的控制,并且能够提供渐变渐亮呼吸效果。
aw9523是一款16路多功能LED驱动器和GPIO控制器,简单实用。
16个I/O端口中的任何一个都可以配置为LED驱动器模式或GPIO模式。
此外,任何GPIO都可以单独配置为输入或输出。
通电后,所有16个I/O端口配置为默认GPIO输出,
默认状态根据I2C器件地址选择脚AD0和AD1设置。
所有配置为输入的I/O端口都会持续监控状态变化。
状态更改由INTN输出指示。
16个多功能IO,支持GPIO模式或LED驱动(电流源调光),
LED驱动模式下256阶线性调光,
任意GPIO可配置为独立的输入或输出,
中断功能,8μs防抖,低电平有效,
标准I2C接口,AD1/AD0选择I2C器件地址,
SDA, SCL, RSTN以及所有GPIO均支持1.8V逻辑 电平,
具有关断模式,低电平有效,
2.5V~5.5V供电,
QFN4×4-24L。
采用gd32f4xx硬件i2c方式高效控制aw9523 ,aw9523.c如下所示
#ifndef __AW9523_H__
#define __AW9523_H__#include "gd32f4xx.h"
#include "cmsis_os.h"
#include "comtypes.h"
#include "delay.h"
#include "i2c.h"#define READ_TIMOUT (300)#define I2C_ADDRESS (0xB6)#define AW_I2C_RETRIES (5)
#define AW_I2C_RETRY_DELAY (5)
#define AW_READ_CHIPID_RETRIES (5)
#define AW_READ_CHIPID_RETRY_DELAY (5)#define INPUT_PORT0 (0x00)//R Equal to P0 Input_Port0 P0 port input state
#define INPUT_PORT1 (0x01)//R Equal to P1 Input_Port1 P1 port input state
#define OUTPUT_PORT0 (0x02)//W/R Refer to table 1 Output_Port0 P0 port output state
#define OUTPUT_PORT1 (0x03)//W/R Refer to table 1 Output_Port1 P1 port output state
#define CONFIG_PORT0 (0x04)// W/R 00H Config_Port0 P0 port direction configure
#define CONFIG_PORT1 (0x05)//W/R 00H Config_Port1 P1 port direction configure
#define INT_PORT0 (0x06)//W/R 00H Int_Port0 P0 port interrupt enable
#define INT_PORT1 (0x07)// W/R 00H Int_Port1 P1 port interrupt enable
#define ID (0x10)// R 23H ID ID register (read only)
#define GCR (0x11)//W/R 00H CTL Global control register
#define LED_MODE_SWITCH_P0 (0x12)//W/R FFH LED Mode Switch P0 port mode configure
#define LED_MODE_SWITCH_P1 (0x13)//W/R FFH LED Mode Switch P1 port mode configure
#define DIM0 (0x20)// W 00H DIM0 P1_0 LED current control
#define DIM1 (0x21)// W 00H DIM1 P1_1 LED current control
#define DIM2 (0x22)// W 00H DIM2 P1_2 LED current control
#define DIM3 (0x23)// W 00H DIM3 P1_3 LED current control
#define DIM4 (0x24)// W 00H DIM4 P0_0 LED current control
#define DIM5 (0x25)// W 00H DIM5 P0_1 LED current control
#define DIM6 (0x26)// W 00H DIM6 P0_2 LED current control
#define DIM7 (0x27)// W 00H DIM7 P0_3 LED current control
#define DIM8 (0x28)// W 00H DIM8 P0_4 LED current control
#define DIM9 (0x29)// W 00H DIM9 P0_5 LED current control
#define DIM10 (0x2A)// W 00H DIM10 P0_6 LED current control
#define DIM11 (0x2B)// W 00H DIM11 P0_7 LED current control
#define DIM12 (0x2C)// W 00H DIM12 P1_4 LED current control
#define DIM13 (0x2D)// W 00H DIM13 P1_5 LED current control
#define DIM14 (0x2E)// W 00H DIM14 P1_6 LED current control
#define DIM15 (0x2F)// W 00H DIM15 P1_7 LED current control
#define SOFT_RESET (0x7F)// W 00H SW_RSTN Soft reset#define AW9523B_ID (0x23)#define LED_HWRESET_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()#define LED_HWRESET_PIN GPIO_PIN_5#define LED_HWRESET_PORT GPIOAextern osMutexId mutex_i2c_id;int AW9523_Init(void);int AW9523_SetBrightness(uint8_t channel,uint8_t brightness);int AW9523_SetAllBrightness(uint8_t brightness);int AW9523_SoftReset(void);void AW9523_HWReset(void);int AW9523_Restart(void);#endif
#include "aw9523.h"/**
LED1--16 一一对应DIM0--DIM15
*/
static const uint8_t LED2DIM[] = {DIM0,DIM1,DIM2,DIM3,DIM4,DIM5,DIM6,DIM7,DIM8,DIM9,DIM10,DIM11,DIM12,DIM13,DIM14,DIM15};static __INLINE HAL_StatusTypeDef Local_Hal_I2C_Read(uint8_t regaddr,uint8_t* buf,uint8_t length)
{osMutexWait(mutex_i2c_id,osWaitForever);gd32_i2c_read(buf,I2C_ADDRESS,regaddr,length);osMutexRelease(mutex_i2c_id);return HAL_OK;
}static __INLINE HAL_StatusTypeDef Local_Hal_I2C_Write(uint8_t regaddr,uint8_t* buf,uint8_t length)
{ osMutexWait(mutex_i2c_id,osWaitForever);gd32_i2c_write(buf,I2C_ADDRESS,regaddr,length); osMutexRelease(mutex_i2c_id);return HAL_OK;
}/*
芯片初始化
*/
int AW9523_Init(void)
{uint8_t val = 0;uint8_t ret = 0;/**** AW9523B support 3 reset mode: power on reset, hardware reset, * software reset. Each reset mode can reset registers to default value*/if(AW9523_SoftReset() < 0) return -1;//read chip idret = Local_Hal_I2C_Read(ID,&val,1);if(ret != HAL_OK) return -1;if(val != AW9523B_ID) return -1;//Global control register config gpio mode & dim setp P0 specialval = 0x12; ret = Local_Hal_I2C_Write(GCR,&val,1);if(ret != HAL_OK) return -1;//led mode switch //P0 to ledval = 0x00;ret = Local_Hal_I2C_Write(LED_MODE_SWITCH_P0,&val,1);if(ret != HAL_OK) return -1;//P1 to ledval = 0x00;ret = Local_Hal_I2C_Write(LED_MODE_SWITCH_P1,&val,1);if(ret != HAL_OK) return -1;//关闭电流AW9523_SetAllBrightness(0);//16脚上电默认输出状态由AD1/AD0决定,故上电后全导通//P0 led breakoverval = 0x00;ret = Local_Hal_I2C_Write(OUTPUT_PORT0,&val,1);if(ret != HAL_OK) return -1;//P1 led breakoverval = 0x00;ret = Local_Hal_I2C_Write(OUTPUT_PORT1,&val,1);if(ret != HAL_OK) return -1;return 0;
}/**
单通道独立亮度调节
channel: 0----15
brightness:0----255
*/
int AW9523_SetBrightness(uint8_t channel,uint8_t brightness)
{ uint8_t val = 0;uint8_t ret = 0;val = brightness;ret = Local_Hal_I2C_Write(LED2DIM[channel],&val,1);if(ret != HAL_OK) return -1;return 0;
}/**
多通道亮度调节,统一控制
brightness:0----255
*/
int AW9523_SetAllBrightness(uint8_t brightness)
{uint8_t i;uint8_t ret = 0;for(i = DIM0;i <= DIM15;i++){ret = Local_Hal_I2C_Write(i,&brightness,1);if(ret != HAL_OK) return -1; }return 0;
}//软件复位
int AW9523_SoftReset(void)
{uint8_t val;uint8_t ret = 0;val = 0x00;ret = Local_Hal_I2C_Write(SOFT_RESET,&val,1);if(ret != HAL_OK) return -1; return 0;
}//硬件复位
void AW9523_HWReset(void)
{GPIO_InitTypeDef GPIO_InitStruct;LED_HWRESET_CLK_ENABLE();GPIO_InitStruct.Pin = LED_HWRESET_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FAST;HAL_GPIO_Init(LED_HWRESET_PORT, &GPIO_InitStruct);//RSTNHAL_GPIO_WritePin(LED_HWRESET_PORT,LED_HWRESET_PIN,GPIO_PIN_RESET);Delay_MS(1);HAL_GPIO_WritePin(LED_HWRESET_PORT,LED_HWRESET_PIN,GPIO_PIN_SET);Delay_MS(1);
}//防止该芯片意外复位
int AW9523_Restart(void)
{uint8_t val = 0xFF;//理论上GCR寄存器复位了,为判断依据while(Local_Hal_I2C_Read(GCR,&val,1) != HAL_OK){}if(val != 0x00) return -1;while(AW9523_Init());return 0;
}
本文发布于:2024-01-29 14:45:31,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170651073416021.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |