P9813驱动RGB灯珠

P9813驱动RGB灯珠

1.P9813简介

![P9813简介及其特点](https://img-blog.csdn.net/20181013100705985?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwODYwOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

2. P8913常见接线图

RGB灯珠接线图
因为所有的颜色都是由三原色组合而成,这个RGB彩灯就是让我们给它红绿蓝三种不同比例就可以显示出各种颜色。R:red (红色) G:green(绿色)B:blude(蓝色)。驱动芯片负责把三种颜色的颜色系数给到灯珠,灯珠就会显示彩色。三原色国际色卡自行百度。

3 驱动时序图及工作参数

驱动时序及工作参数
① 前32 位“0”为起始帧,在Cin 上升沿时打入,并且时序DIN要先于CIN;
② 标志位为两个“1”;
③ 校验数据“B7’”与“B6’”为蓝色灰度数据的“B7”与“B6”的反码;
④ 灰度级数据要高位先入,并且是蓝绿红顺序。

由此可得,MCU需要发送的数据
32位0起始信号: 0000 0000 0000 0000 0000 0000 0000 0000
第一点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
第二点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
(红色码 绿色码 蓝色码)

工作参数
可见需要延时操作,单片机执行汇编代码需要时间,所以延时不用太久1us就行。

4 驱动思路

4.1 发送一位数据:
DIN=0/1 //数据线准备数据
CIN=0
延时
CIN=1
延时 //时钟线拉高后变低,数据传输到芯片内

4.2 发送32位数据
发送32位数据
For(i=0;i<32;i++)
{
发送一位数据:
}

5 实战代码

5.1 整合3个三原色数据到一个变量。

u32 Color_Data(unsigned int r,unsigned int g,unsigned int b) //写入三个八位的值,返回一个32位的数值
{                                        
	u32 temp=0;
	
	temp |=0x03<<30;         //0xc0--> 1100 0000     1010 1010
	temp |= ((~b)&0xc0)<<22;  //取蓝色最高两位取反,得到B7’ B6’
	temp |= ((~g)&0xc0) <<20;  //取绿色最高两位取反,得到G7’G6’
	temp |= ((~r)&0xc0) <<18;   //取绿色最高两位取反,得到R7’R6’
	temp |= b<<16;
	temp |= g<<8;
	temp |= r<<0;
	
	return temp;
}

5.2 MCU发送数据到芯片

void RGB_Send_Data(u32 data)
{
	unsigned int i;
	for(i=0;i<32;i++)
	{
//取data的最高位,如果是1就写1(注意按位操作是写16进制)
		if(data&0x80000000)//准备一位数据   
		{
			RGB_DATA_H;
		}
		else
		{
			RGB_DATA_L;                   //否则写0
		}
		data<<=1;//每取出一个数据,让次高位变成最高位,遍历整个32位的data值
		RGB_CLK_L;
		Delay_us(1);
		RGB_CLK_H;
		Delay_us(1);
		/*以上四步操作令CLK产生上升沿*/
	}
}

5.3 最终的控制函数

void RGB_Color_Control(unsigned int r,unsigned int g,unsigned int b)
{
	u32 color_data;
	color_data= Color_Data(r,g,b) ;
	
	RGB_Send_Data(0);//先发送32位低电平起始信号
	RGB_Send_Data(color_data); //发送第一个32位灰度数据
	RGB_Send_Data(color_data); //发送第二个32位灰度数据

}

5.4 IO口初始化略(推挽输出)

吐槽一句;这个编辑器好难用,对于用惯了word的人来说,极其不习惯,为嘛我找着教程写

不能让图片居中