spi推5050 2811/2812 灯珠

一、关于彩灯:

1.引脚说明:

2.连接方式:

  • 灯珠采用级联形式:

        

3.数据传输:

  • 2812灯珠协议采用单极性归零码,每个码元必须有低电平,本协议的每个码元起始为高电平,高电平时间宽度决定“0”码或“1”码。
  • 书写程序时,码元周期最低要求为1.2µs。
  • “0”码、 “1”码的高电平时间需按照上表的规定范围, “0”码、 “1”码的低电平时间要求

小于20µs.

4.时序及传输方式:

 

 5.灯珠数据结构:

  •   每颗灯珠有24bit数据,高位先发,按照RGB或GRB顺序发送

二、关于spi:

  •  spi一次发送八位数据
  • 每八位spi数据是每组灯珠24位数据中的一位
  • 由时序和数据图可以大致得出:0码和1码的高电平比例为1:3。                                                              0码值为 1100 0000 (0xfc)                                                                                                      1码值为 1111 1100  (0xc0)
  • 周期是1.2us,共8bit数据,则1bit为0.15us
  • 设置spi的clk周期为0.15us的整数分之一(后续用逻辑分析仪抓波形修改)

三、简易程序编写

1.驱动灯程序:

/*******************************************/
/*
* 0码:1100 0000  0xc0
* 1码:1111 1100  0xfc
*/
/*******************************************/
#define SPI_BIT_DATA_H      0xfc
#define SPI_BIT_DATA_L      0xc0
static void Send_2812_24bits(u8 GData, u8 RData, u8 BData, u8 *rgb_flash_buff_ptr)
{
  u8 i;

  for (i = 0 ;i < 8 ; i++) {//g
    if (GData & 0x80) {
      rgb_flash_buff_ptr[i] = SPI_BIT_DATA_H;//0xfc
    } else {
      rgb_flash_buff_ptr[i] = SPI_BIT_DATA_L;//0xc0
    }
    if (RData & 0x80) {//r
      rgb_flash_buff_ptr[i + 8] = SPI
### SPI 控制 RGB 的技术信息 对于使用SPI接口来控制RGB的情况,通常涉及到特定类型的LED,比如WS2812B或其他兼容SPI通信协议的。然而需要注意的是,尽管一些资料提到可以通过SPI送信号给像5050, 2811/2812这样的[^4],实际上这些更常被描述为支持一种特殊的单线串行通信方式而非标准SPI。 但是,在某些情况下确实存在利用硬件SPI模拟或适配这类特殊通信协议的应用场景。下面提供一段基于Python并针对ESP32平台的例子,该例子展示了如何配置GPIO引脚并通过软件模拟的方式发送数据到连接着多个WS2812B组成的链路: ```python from machine import Pin, SPI import time class WS2812_SPI: def __init__(self, num_leds=1, spi_id=1, sck_pin=14, mosi_pin=13): self.num_leds = num_leds # 初始化SPI总线 self.spi = SPI(spi_id, baudrate=8000000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=Pin(sck_pin), mosi=Pin(mosi_pin)) self.buffer = bytearray(3 * num_leds) def set_pixel(self, index, r, g, b): pos = index * 3 self.buffer[pos] = g # 注意:绿蓝红顺序可能因具体器件而异 self.buffer[pos + 1] = r self.buffer[pos + 2] = b def show(self): zero_bit = bytes([0]*4) # 发送额外的低电平位以确保前一位结束 one_bit_high_time = int((400 / (8e6)) * 1e6) # 计算高电平时长(微秒) zero_bit_high_time = int((700 / (8e6)) * 1e6) for byte in self.buffer: mask = 0x80 while(mask): if(byte & mask): self.spi.write(bytes([0xFF])) time.sleep_us(one_bit_high_time) else: self.spi.write(bytes([0x00])) time.sleep_us(zero_bit_high_time) mask >>= 1 self.spi.write(zero_bit) # 使用示例 led_strip = WS2812_SPI(num_leds=10) # 创建管理10颗LED的对象实例 for i in range(10): # 设置每颗LED的颜色 led_strip.set_pixel(i, 255, 0, 0) # 设定红色 led_strip.show() # 显示设置好的颜色模式 ``` 这段代码创建了一个`WS2812_SPI`类用于管理和更新一组WS2812B LED的状态。这里特别强调了通过调整高低电平的时间长度来匹配目标所需的脉冲宽度调制(PWM)特性。请注意实际应用中还需要考虑更多细节如色彩排列顺序等差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值