yCat 发表于 2015-8-26 16:52:54

【转载】板载资源 之 RGB led

帖子链接http://bbs.elecfans.com/forum.php?mod=viewthread&tid=504614&extra=page%3D1%26filter%3Dtypeid%26typeid%3D1185
帖子作者:qq416296378


仔细了解了看了下电路图0.0
对RGBled进行了一下了解,之前使用的3色led是都是引脚直接引出 接在板子上的那种,当然也有自己焊的小玩具0.0呃

而在Gokit 上是使用P9813,P9813是一款全彩点光源 LED 驱动芯片
电路图如下:
http://bbs.elecfans.com/data/attachment/forum/201508/07/000508doh1o4kok9d355k2.png.thumb.jpg
P9813的规格书,(PS:找到规格书但是没有太多的资料,不过也很简单0.0)
http://bbs.elecfans.com/static/image/filetype/pdf.gif P9813规格书_普_.pdf (335.5 KB, 下载次数: 0)

首先看下手册里的资料
先是引脚图
http://bbs.elecfans.com/data/attachment/forum/201508/07/003851muqb2dtu1nn82ocd.png.thumb.jpg

引脚作用

http://bbs.elecfans.com/data/attachment/forum/201508/07/003852o3c59tjjwx9zf3x9.png.thumb.jpg

http://bbs.elecfans.com/data/attachment/forum/201508/07/003852v67qzxz9z49myem1.png.thumb.jpg

时序图

http://bbs.elecfans.com/data/attachment/forum/201508/07/003853wbcsipbjycnsoyik.png.thumb.jpg

这也就说明这个led芯片很好控制0.0
按找时序也不用做什么设置 操作就好了

下面看下代码0.0呃也没什么难度

void ClkProduce(void)
{
SCL_LOW;    // SCL=0
LED_delay(40);
SCL_HIGH;   // SCL=1
LED_delay(40);
}
目的是产生一个上升沿,手册规定,DIN要在CIN上升沿写入,

void Send32Zero(void)
{
unsigned char i;
SDA_LOW;   // SDA=0
for (i=0; i<32; i++)
ClkProduce();
}
发送32位的0 起始帧

uint8_t TakeAntiCode(uint8_t dat)
{
    uint8_t tmp = 0;
tmp=((~dat) & 0xC0)>>6;   
return tmp;
}
这个也函数也只是取下反码,呃前两位的反码,芯片设计的时序就是 先起始位(俩1)然后
RGB各个前两位的反码然后才是RGB的灰度值

void DatSend(uint32_t dx)
{
    uint8_t i;

for (i=0; i<32; i++)
{
   if ((dx & 0x80000000) != 0)
{
         
         SDA_HIGH;   //SDA=1;
}
else
{
             SDA_LOW;    //SDA=0;
}

dx <<= 1;
    ClkProduce();
}
}
发送32位的任意数据,

void DataDealWithAndSend(uint8_t r, uint8_t g, uint8_t b)
{
    uint32_t dx = 0;

    dx |= (uint32_t)0x03 << 30;             // The front of the two bits 1 is flag bits
    dx |= (uint32_t)TakeAntiCode(g) << 28;
    dx |= (uint32_t)TakeAntiCode(b) << 26;
    dx |= (uint32_t)TakeAntiCode(r) << 24;

    dx |= (uint32_t)g << 16;
    dx |= (uint32_t)b << 8;
    dx |= r;

    DatSend(dx);
}
整理RGB显示色彩数据的函数,由于芯片规定由2个1作为起始位
所以发送数据的开头是连个1,然后RGB反码 然后RGB灰度,(起始位 2 + 校验位 2*3 + 灰度 8*3 =32 位)

void RGB_LED_Init(void)
{

GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);


GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);



LED_RGB_Control(0,0,0);
Delay_ms(100);


GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
初始化(无非就是 STM32的IO初始化)

void LED_RGB_Control(uint8_t R, uint8_t G, uint8_t B)
{
Send32Zero();
DataDealWithAndSend(R, G, B);   // display red
DataDealWithAndSend(R, G, B);   // display red
// printf("LED_R = %d LED_G = %d LED_B = %d",R,G,B);
}

显示色彩0.0,名字是对应好的

呃基本上RGB 的控制就这样0.0

http://bbs.elecfans.com/data/attachment/forum/201508/07/010044p58iyc8i5ii31r98.jpg.thumb.jpg
http://bbs.elecfans.com/data/attachment/forum/201508/07/010118jd3x3tateh11edjx.jpg.thumb.jpg
http://bbs.elecfans.com/data/attachment/forum/201508/07/010106k136kp9pbqg313fx.jpg.thumb.jpg
http://bbs.elecfans.com/data/attachment/forum/201508/07/010055avouwwj0lvkmqcku.jpg.thumb.jpg
页: [1]
查看完整版本: 【转载】板载资源 之 RGB led