AW21018 RGB驱动芯片 I2C驱动代码

工作中用到了这颗芯片,看网上没有相关代码分享,于是琢磨出来后把自己写的代码分享出来,仅供参考。

不过这芯片的官方网站有文档和例程的,比较简单。

AW21018芯片初始化代码:

uint8_t rgb_light = 0xff;

void AW21018_init(void)
{
	GPIO_InitType led_gpio;
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    GPIO_InitStruct(&led_gpio);
    led_gpio.Pin        = GPIO_PIN_4;    //GPIO4口是芯片的使能脚
    led_gpio.GPIO_Speed = GPIO_SPEED_HIGH; 
    led_gpio.GPIO_Mode  = GPIO_MODE_OUTPUT_OD;
    led_gpio.GPIO_Pull  = GPIO_PULL_UP; 
    GPIO_InitPeripheral(GPIOA, &led_gpio);
	
	GPIO_SetBits(GPIOA,GPIO_PIN_4);
	Delay(2);
	

	i2c1_master_send_io(0x20,0x01);//chipen使能
	i2c1_master_send_io(0x58,0xff);//设置全局电流
	i2c1_master_send_io(0x8b,0x00);//禁用分组模式
	



	for(int i = 0; i < RGB_NUM; i += 1)
	{
		i2c1_master_send_io(0x46 + i*3+0, rgb_light);//设置亮度r
		i2c1_master_send_io(0x46 + i*3+1, rgb_light);//设置亮度g
		i2c1_master_send_io(0x46 + i*3+2, rgb_light);//设置亮度b
	}
	
	i2c1_master_send_io(0x45,0x00); //updata RB
	
}

点亮所有RGB口:

#define RGB_NUM 6

uint8_t rgb_color_r = 0xff;
uint8_t rgb_color_g = 0xff;
uint8_t rgb_color_b = 0xff;

void AW21018_on_all(void)
{
	
	for(int i = 0; i < RGB_NUM; i += 1)
	{
		i2c1_master_send_io(0x21 + i*6+0, rgb_color_r);//设置r
		i2c1_master_send_io(0x21 + i*6+2, rgb_color_g);//设置g
		i2c1_master_send_io(0x21 + i*6+4, rgb_color_b);//设置b
	}
	
	for(int i = 0; i < RGB_NUM; i += 1)
	{
		i2c1_master_send_io(0x46 + i*3+0, rgb_light);//设置亮度r
		i2c1_master_send_io(0x46 + i*3+1, rgb_light);//设置亮度g
		i2c1_master_send_io(0x46 + i*3+2, rgb_light);//设置亮度b
	}
	
	i2c1_master_send_io(0x45,0x00); //updata RB SL    发送这个后才会更新亮度与rgb寄存器
	
}

下面这个是一个循环模式,或者叫跑马灯模式,是可以实现RGB调色的,理论上来说所有颜色都可以在不断的循环中实现出来,只是时间问题。

不过可能有点复杂,但是都有注释,慢慢看哈哈。

#define	rgb_base_color	0x60
uint8_t rgb_color[RGB_NUM][3] = {
	{rgb_base_color,0xB0,0x00},	//1
	{rgb_base_color,0xB0,0x00},	//2
	{rgb_base_color,0xB0,0x00},	//3
	{rgb_base_color,0xB0,0x00},	//4
	{rgb_base_color,0xB0,0x00},	//5
	{rgb_base_color,0xB0,0x00}	//6
};
uint8_t rgb_loop_ms = 80;				//每小次改变的延时
uint8_t rgb_loop_change_speed = 20;		//每小次增加数值,模拟渐变
uint8_t rgb_loop_change_frist = 0x40;	//每次切换RGB通道的时候增加数值,模拟突变
/**
 * @function  loop_rgb_one
 * @brief     使RGB数组中的第一组颜色(R、G、B)增加rgb_price,用于切换颜色时达到突变效果
 * @param     rgb_channel:选择R.G.B通道;rgb_flag:是否正在循环中;rgb_price:RGB增加数值的大小
 */
static void loop_rgb_zf(uint8_t rgb_channel, uint8_t rgb_flag, uint8_t rgb_price)
{
	static uint8_t loop_sign = 1;
	if(rgb_flag){
		if(loop_sign == 1){
			if(rgb_color[0][rgb_channel] + rgb_price > 0xff){
				loop_sign = 0;
				rgb_color[0][rgb_channel] -= rgb_price;	//RGB0变化中
			}
			else{
				rgb_color[0][rgb_channel] += rgb_price;	//RGB0变化中
			}
		}
		else{
			if(rgb_color[0][rgb_channel] - rgb_price < 0){
				loop_sign = 1;
				rgb_color[0][rgb_channel] += rgb_price;	//RGB0变化中
			}
			else{
				rgb_color[0][rgb_channel] -= rgb_price;	//RGB0变化中
			}
		}
	}
}

/**
 * @function  loop_rgb_one
 * @brief     使RGB数组中的某一组颜色(R、G、B)向前流动
 * @param     rgb_channel:选择R.G.B通道;rgb_flag:是否正在循环中
 */
static void loop_rgb_one(uint8_t rgb_channel, uint8_t rgb_flag)
{
	for(int i = RGB_NUM - 1; i > 0; i--)
	{
		rgb_color[i][rgb_channel] = rgb_color[i-1][rgb_channel];	//将前一个RGB的数据写入后一个RGB 例如将RGB4的数据写入RGB5
	}
	loop_rgb_zf(rgb_channel,rgb_flag,rgb_loop_change_speed);
}

/**
 * @function  AW21018_loop
 * @brief     需要循环调用
 * @param     times  颜色刷新时间间隔
 */
void AW21018_loop(uint8_t times)
{
	
#if 1
	static uint8_t loop_rgb_num = 0;	//记录正在变化的是R or G or B
	static uint8_t loop_times = 0;		//记录变化的次数
	
	loop_rgb_one(loop_rgb_num,1);		//一个通道流动并增加数据
	if(loop_rgb_num != 0){
		loop_rgb_one(loop_rgb_num - 1,0);	//一个通道只流动,不增加
	}
	else{
		loop_rgb_one(loop_rgb_num + 2,0);	//一个通道只流动,不增加
	}
	
	loop_times++;
	if(loop_times > 8){
		loop_times = 0;
		loop_rgb_num++;
		loop_rgb_zf(loop_rgb_num,1,rgb_loop_change_frist);
		if(loop_rgb_num > 2){
			loop_rgb_num = 0;
		}
		if(rand()%3 == 0){
			//rgb_color[0][loop_rgb_num] += rgb_loop_change_frist;//用来模拟不规则突变效果
		}
	}
	
	for(int i = 0; i < RGB_NUM; i += 1)
	{
		for(int j = 0; j < 3; j++){
			i2c1_master_send_io(0x21 + i*6+j*2, rgb_color[i][j]*rgb_light/0xff);//设置r g b 
		}
	}
#endif
	

	i2c1_master_send_io(0x45,0x00); //updata RB
	
	Delay(times);
}

最后一个当然是呼吸模式:


void AW21018_breath(void)
{
	//相当于颜色固定的呼吸模式
	GPIO_SetBits(GPIOA,GPIO_PIN_4);
	Delay(5);
	
	i2c1_master_send_io(0x70,0x00);//软件复位
	Delay(5);
	
	i2c1_master_send_io(0x20,0x01);//chipen使能
	i2c1_master_send_io(0x58,0xff);//设置全局电流
	
	//1.set color  呼吸颜色
	i2c1_master_send_io(0x88,rgb_color_r);
	i2c1_master_send_io(0x89,rgb_color_g);
	i2c1_master_send_io(0x8a,rgb_color_b);
	
	//2.set brigthness  呼吸区间
	i2c1_master_send_io(0x86,rgb_light);
	i2c1_master_send_io(0x87,0x00);
	
	//3.group
	i2c1_master_send_io(0x8b,0x3f);
	
	//4.set pattern times T1/T2/T3/T4
	i2c1_master_send_io(0x82,0x66);//改变这两组发送的值会改变呼吸时间
	i2c1_master_send_io(0x83,0x66);
	
	//5.set start/end phase
	i2c1_master_send_io(0x84,0x00);
	
	//6.set loop times 0x00 is forever
	i2c1_master_send_io(0x85,0x00);
	
	//7.set auto mode
	i2c1_master_send_io(0x80,0x03);
	
	//8.start
	i2c1_master_send_io(0x81,0x01);
	
	
}

OK,到这里就结束了。

记录自己的工作成果。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值