引言
在本篇博客中,我将会从SKC6812芯片的工作原理讲起,帮助读者逐步建立并完善SKC6812的驱动程序设计。
ps:我想比较详细的讲述整个实现框架,因此本篇文章会逐步完善,我会在尽量短的时间里完成对本篇博客的更新。
了解SKC6812芯片的基本数据
传输方式
参考SKC6812芯片的产品规格书,可知每个SKC6812芯片会截取32bit数据(为什么要截取32bit在下面会有介绍),一组芯片是串行连接,如下图所示
码源定义
知道信号的传输方式后继续查阅资料可知每个SKC6812芯片所截取的信号的码源定义,如下图,即可以理解为当一组信号被一个芯片截取后,如果高电平持续0.3us(0.2-0.4us),随后有一个下降沿,并在低电平持续至少0.8us,芯片会自动判定这是一个0码,如果高电平持续0.75us(0.65-1.0us),随后有一个下降沿,并在低电平持续至少0.2us,芯片会自动判定这是一个1码,如果一个下降沿后低电平持续超过200us,芯片则复位(在我的个人理解中一组信号结束后低电平持续200us以上为信号结束,最后一个接收到信号的芯片就不再向后传递信号)。
数据传输方式如下图所示,即D1截取先发送来的一组32bit数据,D2截取下一组发送来的32bit数据,依次类推。
数据结构
我们知道,一个颜色是由三原色组成的,每个颜色都有其对应的RGB的值,R、G、B的值都在0x00到0xff之间,每个值都可以用一个8位二进制表示,那么想完整的表示所有颜色,则需要24位二进制数,SKC612芯片在三原色的基础上增加了白光灯,也是由八位二进制表示,组合在一起就是一个32位的二进制数,这也就是为什么每一个SKC6812芯片需要截取32个码值,如下图所示
,依次为GRBW。
小结
在熟悉了SKC6812的工作状态后我们就可以开始搭建驱动此芯片的思维框架了。
程序框架搭建
根据上面了解的资料,SKC6812的驱动方式是固定的高低电平,由此联想到定时器的输出比较器输出PWM波来实现驱动,根据参考手册可知STM32F10x系列TIM的时钟频率为72MHz,SKC6812的一个码源周期为1.2us,如果直接由定时器的输出比较器输出PWM输出信号受代码段影响较大,因此考虑使用TIM+DMA的方法。
定时器设置
TIM的频率为72MHz,在不分频的情况下设置自动重装值为90,则PWM的输出周期为1.2us,符合SKC6812芯片的需求。在此基础上可计算出1码的CCR值应为50,0码的CCR值应为25,具体计算过程不再陈列,感兴趣的读者可以自行动手计算。
数据处理
写入程序时,我们写入的是灯光颜色的RGB值,在实际程序编写时,我希望直接输入一个GRBW的值,然后直接计算出对应的CCR值。
一个灯珠的颜色可以由GRBW值来控制,这个值是32位的,也就是我们要不断的写入CCR寄存器相应的CCR值以达到发送SKC6812可以识别的波形的需求,也就是一个灯珠需要32个CCR的值去控制,因此我们直接输入一个GRBW的值,编写函数对这个值操作,取出这个值的二进制下每一位的0或1。如果这一位是0,就写入CCR的值为25,如果是1,就写入CCR得到值为50,由于我们要控制的灯珠不止一颗,就需要对多个GRBW的值进行处理,得到灯珠个数*32个CCR的值,将其存入预设好的数组中,便于DMA搬运。
TIM与DMA传输
在数据处理函数中对GRBW的值处理完后并存入相应数组后,就把数组交由DMA,由DMA
把数组内容搬运到CCR寄存器中。
查阅参考手册可知,从DMA1到TIM2的数据转运操作是从通道2触发的,因此数据转运也从
通道2进行。