庆科扩展板上面带了一个RGBLED灯,由P9813芯片控制,这个芯片可接收数字电平输入,数据格式为32位,按正确的顺序输入指令,可在名为R、G、B的三个输出引脚上输出,但是具体是输出电压模拟信号呢,还是输出数字PWM信号呢,这个我就真的不太懂了,总之接到RGB灯上就可以调节三种颜色的亮度,其实相当于接到三盏灯上。
P9813控制LED灯需要两根GPIO,一个是CIN时钟输入,一个是DIN数据输入,其实这个器件相当标准,是一个32位串行数据器件,数据从高到低,在CIN上升沿时发送。控制LED亮度的时候,需要发送32位数据0——发送32位亮度数据——发送32位数据0,数据0应该是某种起始信号或者校验信号,不加不行,函数如下:
void P9813_PIN_write_frame(uint32_t data)
{
uint8_t i;
uint32_t f_data=data;
for(i=0;i<32;i++)
{
P9813_PIN_CIN_Clr;
if(f_data & 0x80000000)P9813_PIN_DIN_Set;
else P9813_PIN_DIN_Clr;
P9813_PIN_CIN_Set;
f_data = f_data<<1;
}
}
void RGB_LED_Set(uint8_t red, uint8_t green, uint8_t blue)
{
P9813_PIN_write_frame(0);
P9813_PIN_write_data(blue, green, red);
P9813_PIN_write_frame(0);
}
除此之外,发送32位亮度数据的时候需要加校验位:
void P9813_PIN_write_data(uint8_t blue, uint8_t green, uint8_t red)
{
uint8_t check_byte = 0xC0;
int data=0;
check_byte|=(((~blue)>>2)&0x30);
check_byte|=(((~green)>>4)&0x0C);
check_byte|=(((~red)>>6)&0x03);
data|=(check_byte<<24)|(blue<<16)|(green<<8)|(red);
P9813_PIN_write_frame(data);
}
如此,就可以使用两根GPIO来控制RGBLED的亮度了。
庆科扩展板上面带了一个RGBLED灯,由P9813芯片控制,这个芯片可接收数字电平输入,数据格式为32位,按正确的顺序输入指令,可在名为R、G、B的三个输出引脚上输出,但是具体是输出电压模拟信号呢,还是输出数字PWM信号呢,这个我就真的不太懂了,总之接到RGB灯上就可以调节三种颜色的亮度,其实相当于接到三盏灯上。
P9813控制LED灯需要两根GPIO,一个是CIN时钟输入,一个是DIN数据输入,其实这个器件相当标准,是一个32位串行数据器件,数据从高到低,在CIN上升沿时发送。控制LED亮度的时候,需要发送32位数据0——发送32位亮度数据——发送32位数据0,数据0应该是某种起始信号或者校验信号,不加不行,函数如下:
void P9813_PIN_write_frame(uint32_t data)
{
uint8_t i;
uint32_t f_data=data;
for(i=0;i<32;i++)
{
P9813_PIN_CIN_Clr;
if(f_data & 0x80000000)P9813_PIN_DIN_Set;
else P9813_PIN_DIN_Clr;
P9813_PIN_CIN_Set;
f_data = f_data<<1;
}
}
void RGB_LED_Set(uint8_t red, uint8_t green, uint8_t blue)
{
P9813_PIN_write_frame(0);
P9813_PIN_write_data(blue, green, red);
P9813_PIN_write_frame(0);
}
除此之外,发送32位亮度数据的时候需要加校验位:
void P9813_PIN_write_data(uint8_t blue, uint8_t green, uint8_t red)
{
uint8_t check_byte = 0xC0;
int data=0;
check_byte|=(((~blue)>>2)&0x30);
check_byte|=(((~green)>>4)&0x0C);
check_byte|=(((~red)>>6)&0x03);
data|=(check_byte<<24)|(blue<<16)|(green<<8)|(red);
P9813_PIN_write_frame(data);
}
如此,就可以使用两根GPIO来控制RGBLED的亮度了。