记录调试艾为的aw20216灯板
使用软件IIC配置,IIC的使用不记录,以下是参考数据手册总结的初始化函数以及控制灯亮的函数
aw20216初始化
void aw20216_Set_GloabalCurrent(DevDriver_t* driver,uint8_t current)
{
unsigned char data = 0;
data = AW20XXX_CMD_PAGE0;
AW20216_Write_Byte(driver,AW20XXX_PAGE_ADDR,&data,1);
data = current;
AW20216_Write_Byte(driver,REG_GCCR,&data,1);
}
static char Check_chipID(DevDriver_t *driver)
{
unsigned char ret = 0;
AW20216_Read_Byte(driver,REG_RSTN,&ret,1);
if(ret == AW20XXX_CHIPID)
{
LOG_DEBUG("aw20216 chip id 0x%x\n", ret);
return 0;
}
else
{
LOG_DEBUG("ERROR chip id 0x%x\n", ret);
return -1;
}
}
static void aw20216_chip_swen(DevDriver_t *driver)
{
unsigned char val = 0;
AW20216_Write_Byte(driver,AW20XXX_PAGE_ADDR,(unsigned char *)AW20XXX_CMD_PAGE0,1);
AW20216_Read_Byte(driver,REG_GCR,&val,1);
val &= BIT_CHIPEN_DIS;
val |= BIT_CHIPEN_EN;
AW20216_Write_Byte(driver,REG_GCR,&val,1);
}
char aw20216_init(DevDriver_t* driver,unsigned char)
{
char reg = 0;
unsigned char data = 0;
driver->power(1);
driver->reset(1);
aw20216_chip_swen(driver);
reg = Check_chipID(driver);
data = 0xff; /* 4. config global current 0x01 0xff*/
aw20216_Set_GloabalCurrent(driver,data);
data = 0x04; /* 5. enable page4 0x46 0x04*/
AW20216_Write_Byte(driver,REG_MIXCR,&data,1);
if(!reg)
{
LOG_DEBUG("AW20216 INIT finish \r\n");
}
else
LOG_DEBUG("AW20216 INIT failed \r\n");
return reg;
}
1.这个片子总体来说初始化是不复杂的(不玩花活的话,本人小白,研究的并不深入),初始化就第一个硬件给电,我这里使用了一个DevDriver_t结构体包装了一下,主要是为了统一
DevDriver_t driver_aw20216 =
{
.Client = (void *)&i2c_AW20216,
.power = AW20216_Power,
.reset = AW20216_Reset,
};这个是结构体的三个元素,power就是硬件使能脚,
reset是软件复位,
static void AW20216_Reset(unsigned char reset)
{
unsigned char data = 0;
if (reset)
{
data = AW20XXX_CMD_PAGE0;
AW20216_Write_Byte(&driver_aw20216, AW20XXX_PAGE_ADDR, &data, 1);
data = 0xAE;
AW20216_Write_Byte(&driver_aw20216, REG_RSTN, &data, 1);
vTaskDelay(3);
}
}
第0页的2F寄存器,写入0xAE是复位,所有寄存器恢复默认值。
2.以上两步做完之后开始软件启动,第0页的GCR寄存器bit7:bit4根据自己的项目需求开启对应的sw通道,bit3,我选择的逻辑电平是2.4/0.6V , bit2:bit1我是默认开启判断的(后面没怎么用这个功能),最后bit0,要写成开启。
3.检查一下芯片ID读取正不正确(这个可以放在最开始就检查,只要保证IIC没有问题)
4.设置全局电流,我直接按最大算,这个应该不影响啥(除非你的项目对功耗有要求)
5.开启第四页的快速设置功能
以上初始化就完成了。
下面是我写的几个快速亮灯的代码,仅供参考
const int aw20xxx_reg_map[] = {
/* PWM, SL,*/
#if AW20216_CHIP_ENABLE
//rgb0
0x00,0x01,0x02,
//rgb1
0x12,0x13,0x14,
//rgb2
0x24,0x25,0x26,
//rgb3
0x36,0x37,0x38,
//rgb4
0x48,0x49,0x4a,
//rgb5
0x5a,0x5b,0x5c,
//rgb6
0x6c,0x6d,0x6e,
//rgb7
0x7e,0x7f,0x80,
//rgb8
0x90,0x91,0x92,
//rgb9
0xa2,0xa3,0xa4,
//rgb10
0xb4,0xb5,0xb6,
//rgb11
0xc6,0xc7,0xc8,
//rgb12
0x03,0x04,0x05,
//rgb13
0x15,0x16,0x17,
//rgb14
0x27,0x28,0x29,
//rgb15
0x39,0x3a,0x3b,
//rgb16
0x4b,0x4c,0x4d,
//rgb17
0x5d,0x5e,0x5f,
//rgb18
0x6f,0x70,0x71,
//rgb19
0x81,0x82,0x83,
//rgb20
0x93,0x94,0x95,
//rgb21
0xa5,0xa6,0xa7,
//rgb22
0xb7,0xb8,0xb9,
//rgb23
0xc9,0xca,0xcb,
//rgb24
0x06,0x07,0x08,
//rgb25
0x18,0x19,0x1a,
//rgb26
0x2a,0x2b,0x2c,
//rgb27
0x3c,0x3d,0x3e,
//rgb28
0x4e,0x4f,0x50,
//rgb29
0x60,0x61,0x62,
//rgb30
0x72,0x73,0x74,
//rgb31
0x84,0x85,0x86,
//rgb32
0x96,0x97,0x98,
//rgb33
0xa8,0xa9,0xaa,
//rgb34
0xba,0xbb,0xbc,
//rgb35
0xcc,0xcd,0xce,
//rgb36
0x09,0x0a,0x0b,
//rgb37
0x1b,0x1c,0x1d,
//rgb38
0x2d,0x2e,0x2f,
//rgb39
0x3f,0x40,0x41,
//rgb40
0x51,0x52,0x53,
//rgb41
0x63,0x64,0x65,
//rgb42
0x75,0x76,0x77,
//rgb43
0x87,0x88,0x89,
//rgb44
0x99,0x9a,0x9b,
//rgb45
0xab,0xac,0xad,
//rgb46
0xbd,0xbe,0xbf,
//rgb47
0xcf,0xd0,0xd1,
//rgb48
0x0c,0x0d,0x0e,
//rgb49
0x1e,0x1f,0x20,
//rgb50
0x30,0x31,0x32,
//rgb51
0x42,0x43,0x44,
//rgb52
0x54,0x55,0x56,
//rgb53
0x66,0x67,0x68,
//rgb54
0x78,0x79,0x7a,
//rgb55
0x8a,0x8b,0x8c,
//rgb56
0x9c,0x9d,0x9e,
//rgb57
0xae,0xaf,0xb0,
//rgb58
0xc0,0xc1,0xc2,
//rgb59
0xd2,0xd3,0xd4,
//rgb60
0x0f,0x10,0x11,
//rgb61
0x21,0x22,0x23,
//rgb62
0x33,0x34,0x35,
//rgb63
0x45,0x46,0x47,
//rgb64
0x57,0x58,0x59,
//rgb65
0x69,0x6a,0x6b,
//rgb66
0x7b,0x7c,0x7d,
//rgb67
0x8d,0x8e,0x8f,
//rgb68
0x9f,0xa0,0xa1,
//rgb69
0xb1,0xb2,0xb3,
//rgb70
0xc3,0xc4,0xc5,
//rgb71
0xd5,0xd6,0xd7,
#endif
};
int aw20216_rgb_ctrl_multi(DevDriver_t* driver,uint8_t rgb_id,uint8_t length,uint32_t rgb_color,uint8_t brightness)
{
unsigned char data;
unsigned char LED_R = 0,LED_G = 0,LED_B =0;
int ret = 0;
if(rgb_id + length*3 > 218)
{
LOG_DEBUG("error, wrong start id or length\n\r");
return -1;
}
LED_R = rgb_color >> 16 & 0XFF;
LED_G = rgb_color >> 8 & 0XFF;
LED_B = rgb_color & 0XFF;
for(int i = rgb_id;i<(rgb_id + length);i++)
{
aw20216_page4_data[aw20xxx_reg_map[i*3]][0] = LED_B;
aw20216_page4_data[aw20xxx_reg_map[i*3]][1] = brightness;
aw20216_page4_data[aw20xxx_reg_map[i*3+1]][0] = LED_R;
aw20216_page4_data[aw20xxx_reg_map[i*3+1]][1] = brightness;
aw20216_page4_data[aw20xxx_reg_map[i*3+2]][0] = LED_G;
aw20216_page4_data[aw20xxx_reg_map[i*3+2]][1] = brightness;
}
data = AW20XXX_CMD_PAGE4;
AW20216_Write_Byte(driver,AW20XXX_PAGE_ADDR, &data,1);
if(ret)
{
LOG_DEBUG("set AW20216 REG page error\n\r");
return -1;
}
AW20216_Write_Byte(driver,aw20xxx_reg_map[rgb_id], &aw20216_page4_data[aw20xxx_reg_map[rgb_id]][0], length*3*2);
if(ret)
{
LOG_DEBUG("set AW20216 RGB COLOR error\n\r");
return -1;
}
return 0;
}
int aw20216_rgb_ctrl_single(DevDriver_t* driver,uint8_t rgb_id,uint32_t rgb_color,uint8_t brightness)
{
unsigned char data;
unsigned char LED_R = 0,LED_G = 0,LED_B =0;
int ret = 0;
if(rgb_id > 215)
{
LOG_DEBUG("ERROR LED ID \r\n");
return -1;
}
LED_R = rgb_color >> 16 & 0XFF;
LED_G = rgb_color >> 8 & 0XFF;
LED_B = rgb_color & 0XFF;
LOG_DEBUG("rgb_id is %d\r\n",rgb_id);
LOG_DEBUG("rgb is %x %x %x\r\n",LED_R,LED_G,LED_B);
aw20216_page4_data[aw20xxx_reg_map[rgb_id]][0] = LED_B;
aw20216_page4_data[aw20xxx_reg_map[rgb_id]][1] = brightness;
aw20216_page4_data[aw20xxx_reg_map[rgb_id+1]][0] = LED_R;
aw20216_page4_data[aw20xxx_reg_map[rgb_id+1]][1] = brightness;
aw20216_page4_data[aw20xxx_reg_map[rgb_id+2]][0] = LED_G;
aw20216_page4_data[aw20xxx_reg_map[rgb_id+2]][1] = brightness;
data = AW20XXX_CMD_PAGE4;
ret = AW20216_Write_Byte(driver,AW20XXX_PAGE_ADDR, &data,1);
if(ret)
{
LOG_DEBUG("set AW20216 REG page error\n\r");
return -1;
}
ret = AW20216_Write_Byte(driver,aw20xxx_reg_map[rgb_id], &aw20216_page4_data[aw20xxx_reg_map[rgb_id]][0], 3*2);
if(ret)
{
LOG_DEBUG("set AW20216 RGB COLOR error\n\r");
return -1;
}
return 0;
}
int aw20216_led_ctrl_single(DevDriver_t* driver,uint8_t led_id, uint8_t brightness)
{
unsigned char data;
int ret = 0;
if(led_id > 215)
{
LOG_DEBUG("ERROR LED ID \r\n");
return -1;
}
aw20216_page4_data[aw20xxx_reg_map[led_id]][0] = 0xFF;
aw20216_page4_data[aw20xxx_reg_map[led_id]][1] = brightness;
data = AW20XXX_CMD_PAGE4;
ret = AW20216_Write_Byte(driver,AW20XXX_PAGE_ADDR, &data,1);
if(ret)
{
LOG_DEBUG("set AW20216 REG page error\n\r");
return -1;
}
ret = AW20216_Write_Byte(driver,aw20xxx_reg_map[led_id], &aw20216_page4_data[aw20xxx_reg_map[led_id]][0], 2);
if(ret)
{
LOG_DEBUG("set AW20216 RGB COLOR error\n\r");
return -1;
}
return 0;
}
上面的是三个点灯,第一个是点多个灯,第二个是点单个RGB,最后一个是点亮一个灯