单片机基于AW9523的多路LED驱动控制

阅读: 评论:0

单片机基于AW9523的多路LED驱动控制

单片机基于AW9523的多路LED驱动控制

在一些智能玩具上经常需要多路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小时内删除。

标签:单片机   多路   LED
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23