1.硬件电路
2. 数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素点提取后, 送到像素点内部的数据锁存器, 剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点, 每经过一个像素点的传输, 信号减少24bit。 像素点采用自动整形转发技术, 使得该像素点的级联个数不受信号传送的限制, 仅仅受限信号传输速度要求 。
图片来自网络-
3.程序处理
/*************************************************************/
//SIO Functions
//驱动RGB LED(ws2812), RGB DATA = 24bit; 驱动数据输出排列方式:GRB
/*************************************************************/
void SIO_CONFIG(void)
{
SIO_DeInit();
//
SIO_IO_Init(SIO_PB01); //配置IO为SIO模式
//tx clk =4MHz, Ttxshift = 1/4 = 250ns;发送每bit时间是250ns
SIO_TX_Init(SIOCLK_EN,11); //
//TXCR1 TXCR0--空闲输出L
//TXBUFLEN = 8-1 TXCNT =24-1
// D0 D1 不使用
//默认电平为低
SIO_TX_Configure(SIO_IDLE_LOW,SIO_TX_LSB,7,23,0,0,SIO_OBH_4BIT,SIO_OBL_4BIT,7,1);
}
void SIO_TXBUF_Send(CSP_SIO_T *sio,const uint32_t *pwData, uint32_t hwSize)
{
uint32_t i;
for(i = 0; i < hwSize; i++)
{
sio->TXBUF = pwData[i];
while(!(sio->RISR &SIO_TXBUFEMPT));
}
while(!sio->RISR &SIO_TXDNE);
sio->ICR = SIO_TXDNE;
}
/***************************************************/
//send
/**************************************************/
//rgb 原始数据
uint8_t byDipData[24*3] =
{
//R G B
0x07, 0x00, 0x00,//rgb1
0x00, 0x07, 0x00,//rgb2
0x00, 0x00, 0x07,//rgb3
0x00, 0x07, 0x00,//rgb4
0x07, 0x00, 0x00,//rgb5
0x00, 0x07, 0x00,//rgb6
0x00, 0x00, 0x07,//rgb7
0x00, 0x07, 0x00, //rgb8
0x07, 0x00, 0x00,//rgb9
0x00, 0x07, 0x00,//rgb10
0x00, 0x00, 0x07,//rgb11
0x00, 0x07, 0x00,//rgb12
0x07, 0x00, 0x00,//rgb13
0x00, 0x07, 0x00,//rgb14
0x00, 0x00, 0x07,//rgb15
0x00, 0x07, 0x00, //rgb16
0x07, 0x00, 0x00,//rgb17
0x00, 0x07, 0x00,//rgb18
0x00, 0x00, 0x07,//rgb19
0x00, 0x07, 0x00,//rgb20
0x07, 0x00, 0x00,//rgb21
0x00, 0x07, 0x00,//rgb22
0x00, 0x00, 0x07,//rgb23
0x00, 0x07, 0x00, //rgb24
};
static uint32_t sio_led_data_conver(uint8_t byData)
{
uint8_t i;
uint32_t wData = 0xaaaa;
for(i = 0; i < 8; i++)
{
if(byData & 0x80)
wData |= (0x01 << (2*i));
byData = byData << 1;
}
return wData;
}
static void set_led_rgb_store(uint32_t *pwLeddData,uint32_t hwLedNum)
{
//led
*(pwLeddData+hwLedNum*3) = sio_led_data_conver(byDipData[hwLedNum*3+1]) ; //G
*(pwLeddData+hwLedNum*3+1) = sio_led_data_conver(byDipData[hwLedNum*3]); //R
*(pwLeddData+hwLedNum*3+2) = sio_led_data_conver(byDipData[hwLedNum*3+2]); //B
}
void led_rgb_display(uint8_t *byColData, uint32_t hwLedNum)
{
uint32_t i;
uint32_t wRgbData[72];
for(i = 0; i < hwLedNum; i++) //hwLedNum = 8
{
set_led_rgb_store(wRgbData,i);
}
for(i = 0; i < hwLedNum; i++)
{
SIO_TXBUF_Send(SIO0, &wRgbData[3*i],3);
}
}
/***************************************************/
//main
/**************************************************/
int main(void)
{
delay_nms(1000);
APT32F102_init();
//
while(1)
{
SYSCON_IWDCNT_Reload();
//....
led_rgb_display(byDipData, 24);//发送输出测试
delay_nms(1000);
//....
}
}
0x07, 0x00, 0x00,//rgb1 此处是对应编码格式。
bit1 bit 0
符合时序