这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:33AI8051的硬件spi驱动W2812灯

共1条 1/1 1 跳转至

学习AI8051开发板例程:33AI8051的硬件spi驱动W2812灯

高工
2026-03-17 13:25:23     打赏

    AI8051单片机内部集成了一个单总线控制器。目前支持WS2812、DS18B20、DHT11等器件的控制,并支持通用红外发送接收模式。单总线支持直接寄存器读写数据,也支持DMA方式读写数据。

    WS2812俗称:三色 RGB 灯,其中 LED 灯珠内部存在一个芯片控制控制芯片,通讯方式采用单线归零码的方法,使用DIN信号线来发送特定的时序数据,控制灯的工作与否,如果额外增加一路信号线,实现双路信号传输,即使存在某个LED灯异常损坏的时候,也不会影响整体显示效果。

    1.5050 灯珠内部集成高质量外控单线级联恒流 IC和优质 RGB LED 芯片,体积小巧,外围简单。

    2.内置 IC恒流精度高,内部 RGB 芯片预先分光处理。发光高度一致,白光效果纯正。

    3.整形转发强化技术,单线数据传输,可无限级联。

    4.数据传输频率 800Kbps/秒,可实现画面刷新速率 30 幀/秒时,不小于 1024 点。

    5.输出端口 PWM 控制能够实现 256 级灰度调节,端口扫描频率 1.5KHz/s。

    6.采用优化预置 12mA/通道恒流模式,低压驱动级联数量最大化。高恒流精度,片内误差<1.5%,片间误差<3%。

    7.内置低压强化模块,VDD在 4.5-5.5V 以上 100%正常工作。

    8.超强数据整形能力:接受完本单元数据自动将后续数据整形输出。

一:WS2812的通讯原理:

    WS2812使用单线归零码协议:

    位"0":高电平0.4μs,低电平0.85μs

    位"1":高电平0.8μs,低电平0.45μs

    复位码:低电平50μs以上

二:SPI驱动原理

    通过SPI模拟WS2812的时序:

    使用SPI时钟频率约为2.5-3.2MHz

    每个SPI位对应WS2812的一位

    通常用3个SPI位表示1个WS2812位

三:SPI通讯方式的关键要点

    SPI频率选择:2.5-3.2MHz范围内调整以获得最佳效果

    数据顺序:WS2812使用GRB顺序,不是RGB

    复位时间:确保最后有足够长的低电平时间(>50μs)

    缓冲区管理:提前准备好所有数据,一次性发送

    时序精度:SPI方式比GPIO模拟更精确,适合大量LED

四:软件代码如下所示:

4.1 加载SPI 数据到发送buffer

void LoadSPI(void)
{
    u8    xdata *px;
    u16   i,j;
    u8    k;
    u8    dat;

    for(i=0; i<SPI_NUM; i++)    led_SPI[i] = 0;
    px = &led_RGB[0][0];    //首地址
    for(i=0, j=0; i<(LED_NUM*3); i++)
    {
        dat = *px;
        px++;
        for(k=0; k<4; k++)
        {
            if(dat & 0x80)  led_SPI[j]  = 0xE0;    //数据1
            else            led_SPI[j]  = 0x80;    //数据0
            if(dat & 0x40)  led_SPI[j] |= 0x0E;    //数据1
            else            led_SPI[j] |= 0x08;    //数据0
            dat <<= 2;
            j++;
        }
    }
}

4.2 SPI 发送数据

void SPI_DMA_TxTRIG(u8 xdata *TxBuf, u16 num)
{
    u16 j;
    HSSPI_CFG  = SS_HOLD | SS_SETUP;    //SS_HOLD会增加N个系统时钟, SS_SETUP没有增加时钟。
    HSSPI_CFG2 = HSSPIEN | FIFOEN | SS_DACT;    //FIFOEN允许FIFO会减小13个时钟, 67T @8分频.

    j = (u16)TxBuf;        //取首地址
    DMA_SPI_TXAH = (u8)(j >> 8);        //发送地址寄存器高字节
    DMA_SPI_TXAL = (u8)j;               //发送地址寄存器低字节
    DMA_SPI_AMTH = (u8)((num-1)/256);   //设置传输总字节数 = n+1
    DMA_SPI_AMT  = (u8)((num-1)%256);   //设置传输总字节数 = n+1
    DMA_SPI_ITVH = 0;                   //增加的间隔时间,N+1个系统时钟
    DMA_SPI_ITVL = 0;
    DMA_SPI_STA  = 0x00;
    DMA_SPI_CFG  = DMA_SPIIE | SPI_ACT_TX | DMA_SPIIP | DMA_SPIPTY;
    DMA_SPI_CFG2 = SPI_WRPSS | SPI_SSS;
    DMA_SPI_CR   = DMA_ENSPI | SPI_TRIG_M | SPI_CLRFIFO;
    P10 = 1;
}

4.3 SPI的中断处理部分:

void SPI_DMA_ISR (void) interrupt DMA_SPI_VECTOR
{
    P10 = 0;
    DMA_SPI_STA = 0;        //清除中断标志
}

五:实物测试如下所示:

33-1.jpg





关键词: AI8051     SPI     WS2812    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]