【 NUCLEO-F446RE 试用体验】驱动庆科扩展板上的RGBLED灯

  • donatello
  • LV6工程师
  • |      2017-11-09 15:45:55
  • 浏览量 871
  • 回复:0
庆科扩展板上面带了一个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的亮度了。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子