原创 基于STM32的XT1511 控制 总结一下,省的忘了

2019-4-17 19:15 4284 17 1 分类: MCU/ 嵌入式 文集: STM32
XT1511 是全彩发光LED驱动光源。   表面贴装 SMD 型 。
XT1511内部集成的驱动是SK6812, 这个芯片和和WS2811 驱动相同,都是一线级联的通信方式。   就是用一根线,串行输出,控制多个灯。    
其时序图如下:


时序很简单,每一位或0或1,根据占空比来区分。  

一个全彩的点  是3种颜色不同的占比来组成。 一种颜色用8位,一个字节来表示深浅,256个等级。

三种颜色,绿,红,蓝。  一共需要24位。 


控制一个灯需要发送24位,控制N个灯 就发送24*N  位。  

难点在于T0H,T1L  的时间是0.3US,   这个速度用低档单片机很难实现。 

我也曾尝试用汇编来实现,在少量级联的情况还行,灯一多,控制就很不理想了。 

其实我测试的灯也就150来个。在灯比较多的时候,时序稍一偏差 ,就会超出变化的范围内。

STM32的SPI 硬件来实现。  要用DMA SPI 数据。STM32 很奇怪 ,可能是我不习惯,在参考手册看功能。  在数据手册具体哪个芯片的对应的管脚,具体的外设。

SPI 2   用一线发送。因此  只需要MOSI  和 SCK  2根线 。SPI2  MOSI==PB15;  SCK == PB13;要用到DMA; 查参考手册,需要DMA2. 遗憾 DMA2 只有在大容量和互联型的IC中。 STM32F103C8 没有DMA2.

 只能用DMA1 的通道3 和 SPI1 了。 SPI1    MOSI == PA7;    DMA在参考手册看,SPI1的TX  在DMA1的通道3  。

   数据结构体如下:    

typedef union _BYTE_VAL

{

    BYTE Val;

BYTE byte;

    struct

    {

        unsigned char b0:1;

        unsigned char b1:1;

        unsigned char b2:1;

        unsigned char b3:1;

        unsigned char b4:1;

        unsigned char b5:1;

        unsigned char b6:1;

        unsigned char b7:1;

    } bits;

} BYTE_VAL;  


typedef union _RGB_VAL               //  一个LED 的结构体

{

    DWORD Val;

    struct

    {

        BYTE blue; //xt1511; 

        BYTE red;

BYTE green;

BYTE c3;                 //no use  

    } byte;

} RGB_VAL;

  

#define  LedCount     150 //150个灯珠。

RGB_VAL displayGRB_buf[ LedCount ];    // 所有灯珠的颜色 ,一个灯珠需要24位,最少3个字节。

unsigned char Ws2811DisBuf[LedCount *24];       // 所有灯珠颜色的每一位用一个字节,用做SPI发送数据。


/*!< Specifies the memory base address for DMAy Channelx. */

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Ws2811DisBuf; 


//把要显示的颜色 全部转换成SPI 要发出的时序数据,放到Ws2811DisBuf中。

 for (ii = 0; ii <  LedCount;ii ++)    //显示的数组

{  

iiii.Val = displayGRB_buf[ii].Val ;

i = 0 ;

do //根据24位 的1/0   把 01111100     01110000   放入BUF中 。  

Ws2811DisBuf[BufCount ++] = iiii.bits.b0 ? 0x7c:0x70;

iiii.Val = iiii.Val >> 1; //

i++;

}while(i < 24);

}


 // SPI的发送 必须用DMA来完成。 如果用MCU来发送,Ws2811DisBuf 需要5MS 左右,严重影响AD的采集。

DMA_Cmd(DMA1_Channel3, DISABLE);         //NO 使能DMA通道

DMA_ClearFlag (DMA1_FLAG_TC3);

SPI1_Send( Ws2811DisBuf, LedCountAll );


喔 这个程序也使用与WS2811的驱动。  WS2811 时序的最小间隔是0.5US,   比XT1511 慢点。

作者: esad0, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1039027.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

curton 2019-4-25 08:13

好文章 学习了
相关推荐阅读
esad0 2024-12-04 11:20
基于TOF微型多区激光传感器在MCU上的AI手势识别
TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳...
esad0 2024-09-05 09:06
训练集loss下降,但是验证集loss上升
当训练集loss下降而验证集loss上升时,这通常表明模型可能出现了过拟合。‌这种情况意味着模型在训练数据上的表现优于在测试数据上的表现,即模型很好地拟合了训练数据,但对于新数据的预测能力较差。分析种...
esad0 2023-05-27 08:41
吃饱闲的玩 做的
...
esad0 2021-07-09 15:46
传说中的嘉立创紫和TMF8801测距模块
这个色彩鲜艳的PCB 就是刚推出的嘉立创紫, 我感觉有点偏黑。    激光测距传感器 TMF8801的测试板。TMF8801 的资料还需要给老外签订保密合同才可以...
esad0 2021-04-19 15:38
AIR724 一拖8 LORA 系统
         AIR724通过LORA模块  和其他的8个模块进行通讯。  从而实现1拖8的效果。  &n...
我要评论
1
17
关闭 站长推荐上一条 /3 下一条