本帖最后由 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