一、关于彩灯:
1.引脚说明:
2.连接方式:
- 灯珠采用级联形式:
3.数据传输:
- 2812灯珠协议采用单极性归零码,每个码元必须有低电平,本协议的每个码元起始为高电平,高电平时间宽度决定“0”码或“1”码。
- 书写程序时,码元周期最低要求为1.2µs。
- “0”码、 “1”码的高电平时间需按照上表的规定范围, “0”码、 “1”码的低电平时间要求
小于20µs.
4.时序及传输方式:
5.灯珠数据结构:
- 每颗灯珠有24bit数据,高位先发,按照RGB或GRB顺序发送
二、关于spi:
- spi一次发送八位数据
- 每八位spi数据是每组灯珠24位数据中的一位
- 由时序和数据图可以大致得出:0码和1码的高电平比例为1:3。 0码值为 1100 0000 (0xfc) 1码值为 1111 1100 (0xc0)
- 周期是1.2us,共8bit数据,则1bit为0.15us
-
设置spi的clk周期为0.15us的整数分之一(后续用逻辑分析仪抓波形修改)
三、简易程序编写
1.驱动灯程序:
/*******************************************/
/*
* 0码:1100 0000 0xc0
* 1码:1111 1100 0xfc
*/
/*******************************************/
#define SPI_BIT_DATA_H 0xfc
#define SPI_BIT_DATA_L 0xc0
static void Send_2812_24bits(u8 GData, u8 RData, u8 BData, u8 *rgb_flash_buff_ptr)
{
u8 i;
for (i = 0 ;i < 8 ; i++) {//g
if (GData & 0x80) {
rgb_flash_buff_ptr[i] = SPI_BIT_DATA_H;//0xfc
} else {
rgb_flash_buff_ptr[i] = SPI_BIT_DATA_L;//0xc0
}
if (RData & 0x80) {//r
rgb_flash_buff_ptr[i + 8] = SPI