AC690X驱动WS2812(SM16703P)点亮RGB灯带
在使用AC690X系列蓝牙时,需要设计驱动几十个RGB灯带的程序,经一段时间学习后成功驱动,现在把实现过程分享给大家共同学习。
1.芯片说明
此类芯片协议采用的是单极性归零码,每一个码元都必须有高低电平。本协议的每个码元起始为高电平,高电平时间宽度决定“0”码或者“1”码。
名称 | 描述 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|
T0H | 0码,高电平时间 | — | 0.3 | — | us |
T1H | 0码,低电平时间 | — | 0.9 | — | us |
T0L | 1码,高电平时间 | — | 0.9 | — | us |
T0H | 1码,低电平时间 | — | 0.3 | — | us |
Trst | Reset码,低电平时间 | — | 80 | — | us |
关于其他的参数,级联等,芯片手册均有说明,这里不再赘述。作者在查阅资料时发现关于归零码高低电平时间的定义有多种,只要范围在如下时间左右基本都可实现驱动,零码:高电平时间400ns,低电平时间800ns;‘1’码:高电平时间800ns,低电平时间400ns,‘0’码:高电平时间400ns,低电平时间800ns。
2.驱动方法
作者通过SPI驱动RGB灯条,在AC690X的SDK基础上利用SPI1的PB12和PB11分别作为数据线和时钟线进行驱动,此驱动方法的弊端就是PB11会有时钟信号输出不能再用于其他功能,PB10只要设置SPI1为单向通讯即可做普通IO使用。
3.代码设计
SPI1驱动的方式是8 Bit 模拟一个归零码的一个‘0’或者‘1’;因此‘0’码对应的数据为0xC0,‘1’码对应的数值为0xFC。读者亦可使用三个时钟周期模拟一个‘0’码或者‘1’码,这种方式一个IC的24BIT刚好是1Byte的时钟周期,注意两种模拟方式时钟周期不同。回归正题,首先在lcd_spi.c文件做出如下修改:
//#if LCD_128X64_EN
#if 1
尽量不要在sdk_cfg.h中直接修改LCD_128X64_EN 的值为1,这样的操作会编译不需要的代码。 开启此SPI相关函数定义之后,在初始化时初始SPI相关寄存器(SDK直接调用SPI1_init()函数即可,速度设置为8M)。
while(1)
{
clear_wdt();
SPI1_DmaWrite(RGBData,24*RGBNum);
}
RGBNum为RGB灯珠的数目,可依据实际数目进行设置参数;若实际RGB颜色出现混乱的现象,RGBData数据组成修改为:N个0x00 + RGB数据 + M个0x00,N和M的取值用户自行设置验证。
4.结束语
以上便是本人使用AC690X设计RGB驱动的实现过程,鄙人才疏学浅,文章如存在错误之处望大家不吝赐教,赠于鄙人学习的机会。欢迎大家进行交流学习,企鹅583671536。