1086|0

44

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【Tang Primer25K Dock】六——SK9822的测试 [复制链接]

 
本帖最后由 Zhao_kar 于 2024-1-28 23:23 编辑

【Tang Primer25K Dock】六——SK9822的测试

备注:

  • 在I2S的测试前,因为麦克风阵列的模块上有SK9822这个led,所以I2S的数据要通过SK9822来展示,所以这一节先把这个灯的测试写了
  • 这个灯的驱动比较简单,本节就分两个部分,一个原理+一个代码和演示
  • 本节主要代码来自于别人开源的,如果侵权了请帖子回复,最后I2S的实际测试跟这个不一样

一、SK9822的原理和功能

1、基本信息

  • 首先SK9822是一种RGB LED控制芯片,支持红、绿、蓝三种颜色。

  • 然后在通信协议上,一般SK9822采用串行通信协议,类似于WS2812B或APA102这种LED,同时串行通信使得多个LED可以通过单一信号线级联,以简化控制。

  • 一般可以通过单片机来控制,但只要通过发送特定格式的数据,就可以以控制LED的颜色和亮度。

  • 电源要求一般跟常见的led一样,SK9822通常工作在低电压(例如5V)下,因此供电电压一般需要符合规定的工作范围,也就是3.3-5。

  • 由于支持串行通信,SK9822非常适合制作灵活的LED照明效果,也就是这个视频里面演示出来的效果。

  • 至于格式,一般发送给SK9822的数据通常是按照一定格式排列的,以表示红、绿、蓝三个通道的亮度值,以及可能的其他控制信息。

2、详细资料和模块资料

  • 首先本次测试需要的是这个麦克风阵列上面的12个灯
  • 然后上面的七个麦克风在下一节的I2S会用到
  • 官网有相关的资料,可以自己去看看
  • 硬件连接如果不需要麦克风,实际上只需要连接电源和那个led的时钟线和数据线就可以了
 
二、驱动代码
1、顶层文件(其实就一个文件)
module top (
	input 		clk,    // Clock

	output reg	sk9822_ck,
	output reg  sk9822_da
);

parameter SD9822_NUM = 12;//串联灯珠数量

parameter FRAME_LEN  = 32;//数据帧长度

//起始帧
parameter START_FRAME = 32'H00000000;
//结束帧
parameter END_FRAME   = 32'HFFFFFFFF;
//数据帧
parameter LED_LIGHT = 5'B01111; //全局亮度
reg [23:0] data_rgb = 24'h000001; //具体颜色
wire [31:0] data_frame = {3'b111,LED_LIGHT,data_rgb};
assign data_frame = {3'b111,LED_LIGHT,data_rgb};

//clk降频
parameter CLK_FRE = 50_000_000;
reg [23:0] clk_delay;
wire clk_slow = clk_delay[13];
always@(posedge clk) clk_delay <= clk_delay + 1;

//状态机
reg [31:0] send_frame;
reg [6:0] send_frame_cnt = 0;
reg [4:0] send_bit_cnt = 0;
reg 	  send_bit;
always@(posedge clk_slow)
	if(!sk9822_ck)begin //上升沿发送
		sk9822_ck <= 1;
	end
	else begin     //下降沿取值
		sk9822_ck <= 0;
		sk9822_da <= send_frame[(FRAME_LEN - 1) - send_bit_cnt];
		send_bit_cnt <= send_bit_cnt + 1;
		
		if(send_bit_cnt == FRAME_LEN - 1)
			send_frame_cnt <= (send_frame_cnt < (SD9822_NUM + 1))? send_frame_cnt + 1 : 0;
	end
	
//数据控制
always@(*)
	if(send_frame_cnt == 0)
		send_frame = START_FRAME;
	else if(send_frame_cnt == (SD9822_NUM + 1))
		send_frame = END_FRAME;
	else
		send_frame = data_frame;

//颜色转移
always@(posedge clk_slow)
	if(send_frame_cnt ==(SD9822_NUM + 1) & send_bit_cnt == 0)
		data_rgb <= {data_rgb[22:0],data_rgb[23]};//24位RGB移位显示

endmodule

2、约束文件,只需要两个引脚就行了

IO_LOC "sk9822_da" K5;
IO_PORT "sk9822_da" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "sk9822_ck" L5;
IO_PORT "sk9822_ck" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "clk" E2;
IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;

3、视频演示

sk9822

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表