APT32F102-SIO模块控制WS2812

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 

        

符合时序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值