我看数据手册一般是特性、引脚定义、外围电路、时序图以及驱动代码。
特性
● Top SMD内部集成高质量外控单线串行级联恒流IC;
● 控制电路与芯片集成在SMD 3528元器件中,构成一个完整的外控像素点,色温效果均匀且一致性高。
● 内置数据整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
● 内置上电复位和掉电复位电路,上电不亮灯;
● 灰度调节电路( 256级灰度可调),
● 红光驱动特殊处理,配色更均衡,
● 单线数据传输,可无限级联。
● 整形转发强化技术,两点间传输距离超过10M.
● 数据传输频率可达800Kbps, 当刷新速率30帧/秒时,级联数不小于1024点。
引脚定义
典型电路
在实际应用电路中,为防止产品在测试时带电插拔产生的瞬间高压损伤IC内部信号输入输出引脚,应在信号输入及输出端串接保护电阻。此外,为了使各IC芯片间更稳定工作,各灯珠间的退偶电容则必不可少;
时序图
看到这里就大致知道器件的功能了,剩下的就是要去关注驱动的注意点。
由于我采用PWM+DMA的方式去驱动SK6812,所以需要了解器件的数据传输时间和数据传输规则,方便确定我们的周期。
数据传输时间
从数据手册中可以看到厂家规定是码元周期最小为1.2us,所以我们采用PWM驱动时需要周期不大于1.2us。
逻辑“1”代表占空比在64%左右,逻辑“0”代表在33%左右。
24bit数据结构

24bit的数据是按照GRB的顺序发送,所以我们选择HEX转RGB时要注意“R”与"G"的HEX要交换一下位置。
数据传输方式
灯数据刷新的间隔要大于80us。
代码
初始化定时器3和输出比较器。
/* Compute the prescaler value */
PrescalerValue = (uint16_t) (SystemCoreClock / 20000000) - 1;
/* TMRe base configuration */
TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);
TMR_TMReBaseStructure.TMR_Period = 20;
TMR_TMReBaseStructure.TMR_DIV = PrescalerValue;
TMR_TMReBaseStructure.TMR_ClockDivision = 0;
TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up;
TMR_TimeBaseInit(TMR3, &TMR_TMReBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TMR_OCStructInit(&TMR_OCInitStructure);
TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM1;
TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
TMR_OCInitStructure.TMR_Pulse = CCR1_Val;
TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_High;
TMR_OC1Init(TMR3, &TMR_OCInitStructure);
TMR_OC1PreloadConfig(TMR3, TMR_OCPreload_Enable);
初始化DMA。ss
void DMA_Configuration(void)
{
DMA_InitType DMA_InitStructure = {0};
/* DMA1 Channel5 Config */
DMA_Reset(DMA1_Channel6);
DMA_DefaultInitParaConfig(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TMR3->CC1;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
DMA_InitStructure.DMA_Direction = DMA_DIR_PERIPHERALDST;
DMA_InitStructure.DMA_BufferSize = sizeof(SRC_Buffer);
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_HALFWORD;
DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_HALFWORD;
DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
/* DMA1 Channel5 enable */
DMA_ChannelEnable(DMA1_Channel6, ENABLE);
}
使能定时器的预装载器、DMA和使能定时器。
TMR_ARPreloadConfig(TMR3, ENABLE);
TMR_DMACmd(TMR3, TMR_DMA_CC1, ENABLE);
/* TMR3 enable counter */
TMR_Cmd(TMR3, ENABLE);
根据数据手册可知, 周期我设置为20,所以13代表逻辑“1”,7代表逻辑“0”.
uint16_t SRC_Buffer[]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
//按照GRB的顺序
//FF0000 green
13,13,13,13,13,13,13,13,\
7,7,7,7,7,7,7,7,\
7,7,7,7,7,7,7,7,\
//00FF00 red
7,7,7,7,7,7,7,7,\
13,13,13,13,13,13,13,13,\
7,7,7,7,7,7,7,7,\
//0000FF blue
7,7,7,7,7,7,7,7,\
7,7,7,7,7,7,7,7,\
13,13,13,13,13,13,13,13,\
};
上面的数据代码表示先用100us的低电平复位灯,按照GRB的顺序第一个灯显示绿色,第二个灯显示红色,第三个灯显示蓝色。
以上例程是基于雅特力AT32F407平台写的,不过在其他都一样可用。