工作中用到了这颗芯片,看网上没有相关代码分享,于是琢磨出来后把自己写的代码分享出来,仅供参考。
不过这芯片的官方网站有文档和例程的,比较简单。
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,到这里就结束了。
记录自己的工作成果。