目录
产品描述
SK6112-RG-002是单线双向传输LED恒流驱动控制芯片。产品技术支持由欧思科光电科技有限公司提供,内部集成信号解码模块、数据双向传输控制模块、振荡器 模块、数据再生模块、恒流驱动模块、电流增益模块等。芯片在截取本级数据后,将其余数据再生并发送到下级芯片。 除提供一般的效果显示模式外,还可以通过特定的命令进入参数设置模式,在线调节RGB端口输出电流增益、改变 显示同步设置等。另外与其他灯珠不同的是,可自主选择对应ID亮特定灯数,可以让芯片进入状态回传模式,回传芯片RGB端口峰值电流数值、芯片级连数目等信息。
一、数据传输时间
1、编码时序
MCU的数据通过单线总线界面与芯片进行通信,通讯协议采用极性归零方式进行,每一字码元都必须有低电平。这里协议每一字码元的起始电平皆为高电平,高电平的时间宽度决定是“0”字码或是“1”字码。具体时序周期如图示,对应单位为微秒级别。
2、模式即功能选择命令格式
-
普通模式
Reset+第一个芯片24bits数据+第二颗芯片24bits数据+......+第N颗芯片24bits数据+Reset
高位在前,按G、R、B的顺序发送。
-
状态回传及高阶工作模式
MCU发送命令格式 Reset+Th50
Th50时序要求:上图时序上显示的脉冲顺序为典型值。可上下幅度20%。
这里要求待芯片上电后,MCU输出端口发送Reset+Th50命令后,当命令结束后,MCU接口改为输入模式,同时芯片从基本工作模式转入高阶工作模式,芯片的数据端口会切换为输出端口,发送数据给MCU,在等待10us后,发送一个带宽为Trev(可以不做理解,具体就是灯珠会回传数据给MCU)的高电平脉冲给MCU;如果芯片有m颗级联,则每隔80us会发送一个脉冲给MCU,共计m个脉冲。而当芯片在160us时间内没有接收到任何高电平脉冲后,芯片会自动恢复为正向输入状态。这里主要应用在,可以在灯珠断电后,在上电后可以计算灯珠数量。
-
芯片多路并接、命令设置控制
本次SK6112支持多路并接但可以各路独立控制(最多15路并接)的应用情景。透过特定的命令,可以识别在并接条件下的每一路灯串,并为每一路灯串进行编码,通过设置动态ID命令来控制(Set_ID),分配唯一的灯串动态ID。编码命令完成后,MCU可以借助“清除ID”/Clean_ID,“确认ID”/Cheak_ID,“指定灯串执行命令”/Specify_ID等命令,分别对各串灯珠发送命令或是传送显示数据。命令格式如下。MCU 可以通过发出带有 4'b0001 和 4 位新动态 ID 码(4'b0001 〜4b'1111)的设置命令,对灯串进行编码,更改灯串的动态 ID。MCU 发出命令 后,并接下每条灯串的第一颗 AP6112Y 芯片开始执行编码程序。
PS:在多路并接情况下,上电复位后,所有灯串默认的动态ID号均为0。为了避免MCU GPIO的输出和SK6112的Din端口的反馈回传脉冲之间的信号电平冲突,建议先发出set ID吗,命令后,在8us内将MCU GPIO口更改为输入模式,监听是否有灯串产生77us的正脉冲。
二、控制器选择
1.MCU选择
本次设计采用的MCU为辉芒微的FT60F0102X,优点:成本低,可多次烧录,操作简单,缺点则是速率较慢(驱动灯珠led够用),内存偏低。它的最高振荡频率支持16M,内存为2K。当然也可采用意法的STM32F103或STC等速率较高内存大的MCU,只要它的晶振振荡频率足以达到灯珠驱动的低电平的典型值0.2us就可以了。
2.读入数据
由于本次设计要求能够自由控制IO口输入输出,且控制器电源系统控制在3.3V~5V之间,为了让MCU IO端口正确的判读SK6112的Din是否已回应SET_ID命令并回传77us宽度的正脉冲,不建议在MCU连接至SK6112 Din的IO引脚上有上拉电阻至5V(灯珠电源)的设计。
三、软件部分
1、IO口初始化
这里我用到了PA1,PA4口一个用来设置按键控制,另一个则是通过输入输出驱动SK6112
void POWER_INITIAL (void)
{
OSCCON = 0B01110000; //IRCF=111=16MHz/4T=4MHz,0.25us
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B00000010; //PA输入输出 0-输出 1-输入
//PA1-输入 PA4-输出
PORTC = 0B00000000;
TRISC = 0B00000000; //PC输入输出 0-输出 1-输入
WPUA = 0B00000010; //PA端口上拉控制 1-开上拉 0-关上拉
//开PA6上拉
OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1
MSCKCON = 0B00000000;
//Bit4=0,禁止LVR(60F01x O版之前)
//Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)
//Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)
CMCON0 = 0B00000111; //关闭比较器,CxIN为数字IO口
}
2、SK6112驱动
由于用到的此款MCU,速度偏慢,机器时间一个指令为0.25us,所以不以调用函数的方式实现,若采用24MHz以上晶振频率的MCU可以采用移位或指针的方式发送数据,是代码程序更加简便。
void light(unsigned char a){
if(!(a&0x80)){ //发送数据段,0码
ledcon=1;
ledcon=0;
}
else{
ledcon=1; //发送数据,1码
NOP();
ledcon=0;
}
if(!(a&0x40)){
ledcon=1;
ledcon=0;
}
else{
ledcon=1;
NOP();
ledcon=0;
}
if(!(a&0x20)){
ledcon=1;
ledcon=0;
}
else{
ledcon=1;
NOP();
ledcon=0;
}
if(!(a&0x10)){
ledcon=1;
ledcon=0;
}
else{
ledcon=1;
NOP();
ledcon=0;
}
if(!(a&0x08)){
ledcon=1;
ledcon=0;
}
else{
ledcon=1;
NOP();
ledcon=0;
}
/*这里只发送5位数据,代码段过于长此处只写入五位*/
}
void sk6112(unsigned char r,unsigned char g,unsigned char b){ //通过函数调用分别按顺序发送G、R、G
light(g);
light(r);
light(b);
}
3、回调功能函数
由于辉芒微的输入输出操作可以直接操作寄存器控制。
int callback()
{
int count,a,b,num;
count=0;
ledcon=num=0;
TRISA = 0B00000010; //PA1-输入 PA4-输出
DelayUs(260);
ledcon=1;
DelayUs(5);
ledcon=0;
DelayUs(2);
ledcon=1;
DelayUs(13);
ledcon=0;
DelayUs(2);
TRISA = 0B00010010; //PA1-输入 PA4-输入
for( a=0;a<27;a++)
{
if(ledcon==1) //maichongpanduan
{
for( b=0;b<1;b++)
{
if(ledcon==1)
{
count++;
}
}
if(count==1)
{
num++;
count=0;
}
else
{
count=0;
}
a=0;
DelayUs(10);
}
}
TRISA = 0B00000010; //PA1-输入 PA4-输出
for(int st=0;st<3;st++)
{
for(int ss=1;ss<num;ss++)
{
sk6112(0,0,0);
}
sk6112(250,250,250);
DelayMs(1000);
for(int ss=0;ss<num;ss++)
{
sk6112(0,0,0);
}
DelayMs(1000);
}
return num;
}
4、设置ID号
int setID()
{
int IDn,stop,count,temp,IDnum,a,b;
IDn=stop=1;
count=IDnum=0;
temp=16;
while(stop)
{
ledcon=0;
DelayUs(300);
ledcon=1;
DelayUs(11);
ledcon=0;
DelayUs(2);//reset+th40
ledcon=1;
ledcon=0;
NOP();
ledcon=1;
ledcon=0;
NOP();
ledcon=1;
ledcon=0;
NOP();
ledcon=1;
NOP();
ledcon=0;//4b0001
ID(IDn);
TRISA = 0B00010010; //PA1-输入 PA4-输入
for( a=0;a<18;a++)
{
if(ledcon==1) //maichongpanduan
{
for( b=0;b<15;b++)
{
if(ledcon==1)
{
count++;
}
}
if(count==15)
{
IDn++;
count=0;
}
else
{
count=0;
}
a=0;
}
}
TRISA = 0B00000010; //PA1-输入 PA4-输出
if(temp==IDn)
{
stop=0;
}
temp=IDn;
}
DelayUs(20);
return IDn;
}
5、判断ID号并作出相应的操作
void specifyid(unsigned char IDn)
{
ledcon=0;
DelayUs(300);
ledcon=1;
DelayUs(11);
ledcon=0;
DelayUs(2);//reset+th40
ledcon=1;
ledcon=0;
NOP();
ledcon=1;
NOP();
ledcon=0;
ledcon=1;
ledcon=0;
NOP();
ledcon=1;
ledcon=0;
NOP();//4b0100
ID(IDn);
}
6、主函数调用
void main()
{
POWER_INITIAL(); //系统初始化
int stIDnum[15];
int stnum;
stnum=setID();//分配ID
for(int w=1;w<=stnum;w++)
{
specifyid(w);//指定对应ID
stIDnum[w]=callback();//对应ID灯数存入数组
}
while(1){
DelayMs(100);
specifyid(3);
for(int a=0;a<stIDnum[3];a++)
{
sk6112(0,250,0);
}
DelayMs(100);
}
// }
}
四、效果展示
这里由于电路设计等同于并联三串灯条,可实现高阶回传,及ID控制。
总结
以上就是此款SK6112,部分功能应用即编程,SK6112还算功能较多的IC集成灯珠,还有部分功能还没实践,可能代码方面有很大的改进,但独自摸索确实还是有点费时间,但简易功能操作就如上,欢迎来改错。