OSK-SK6112幻彩灯珠操作指南

本文详细介绍了SK6112-RG-002LED驱动芯片的数据传输时序,包括编码时序和模式选择,以及如何通过MCU进行控制。在状态回传和高阶工作模式下,芯片能回传电流峰值和级联数量。此外,文章还阐述了如何设置和识别多路并接的ID,以实现独立控制。选用的MCU为辉芒微的FT60F0102X,并提供了软件初始化和驱动代码示例。
摘要由CSDN通过智能技术生成


产品描述

   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集成灯珠,还有部分功能还没实践,可能代码方面有很大的改进,但独自摸索确实还是有点费时间,但简易功能操作就如上,欢迎来改错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值