查看: 6622|回复: 0

通过SPI接口控制RGB颗粒

[复制链接]
  • TA的每日心情
    开心
    2017-12-13 22:25
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-11 23:09:25 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 houhei8454 于 2017-6-11 23:23 编辑

    拿到板子折腾了几天发现CMSIS-DAP模式WIN10下死活找不到设备,驱动各种装还是不行。后来发现非要管理员运行Keil才行。
       下面分享一下用GD32F450开发板通过SPI接口控制RGB灯XT1505。
    1:RGB颗粒概述
    XT1505是一个集控制电路与发光电路于一体的智能外控LED光源其外型与一个 SMD3535LED 灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,电源稳压电路,内置恒流电路,高精度 RC 振荡器,输出驱动采用专利 PWM 技术,有效保证了像素点内光的颜色高一致性。数据协议采用单极性归零码的通讯方式,像素点在上电复位以后,DIN 端接受从控制器传输过来的数据, 首先送过来的 24bit 数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。 像素点采用自动整形转发技术, 使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。
    2:引脚功能图
    功能引脚图.jpg

    3:时序波形图

    时序波形图.jpg

    4:数据传输时间

    数据传输时间.jpg
    5数据传输方法

    数据传输方法.jpg
    624bit RGB数据结构
    24bit数据结构.jpg
    7:思路分析
    用SPI的MOSI引脚连接到RGB颗粒的DIN脚,发送一个字节的数据来模拟0码和1码,只要调节好SPI发送的速率,保证发送一个字节的时间在1.2us左右。
    #define DATA0 SPI_RGB_SendByte(0xC0)  //发送0XC0模拟0码,实际波形通过逻辑分析仪查看如下图,周期在1.3125us,高电平时间为0.3125us,满足手册时序需求

    0码.jpg

    #define DATA1 SPI_RGB_SendByte(0xF0)  //发送0XF0模拟1码,实际波形通过逻辑分析仪查看如下图,周期在1.3125us,高电平时间为0.6250us,满足手册时序需求

    1码.jpg
    OK01码模拟没问题了,只需要按照24bit的数据结构发送。定义一个函数,参数data24bitRGB数据。
    void RGB_Set(uint32_t data)
    {
      int i;
              uint8_t flag;
              for(i=23;i>=0;i--)
                {
                          flag = ((data>>i)&0x01);
                                   if(flag)
                                          {
                                            DATA1;
                                          }
                                          else
                                          {
                                            DATA0;
                                          }
                        }
    }
    对于多个LED级联,data24bitRGB数据,num为级联颗粒的数量。这个函数只是实现了所有LED都是一个颜色的设置,大家在学会了如何模拟时序后,可以自己任意改着玩,想让哪个灯亮什么颜色都行。
    void RGB_Set_nLED(uint32_t data,uint16_t num)
    {
    uint16_t i;
             for(i=0;i<num;i++)
               {
                         RGB_Set(data);
               }
    }
    当要改变LED颗粒的数据时,在发送数据前需要进行复位,前面的数据表里给出了复位信号为低电平,时间为80us,因此只需要多次发送0x00,就能保持mosi为低电平,上面的逻辑分析仪抓的图显示发送一个字节的时间为1.3125us80/1.3125=60.95,所以连续发送610x00就模拟出了复位信号。代码如下
    void RGB_Reset(void)
    {
             uint16_ti;

    for( i=0;i<61;i++)
       {
                SPI_RGB_SendByte(0x00);
        }
    }

    实验使用的SPI1接口,下面贴一下SPI1的初始化代码,
    主时钟设置为200MHz,内部RC振荡器。
    /**   
      *@brief  SPI1 GPIO configuration.   
      *@param  None   
      *@retval None   
      */
    void SPI1_RGB_GPIO_Configuration(void)
    {
       gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
       gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13 |GPIO_PIN_14 |GPIO_PIN_15);
       gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);   
    }
    /**   
      *@brief  RGB LED SPI configuration.   
      *@param  None   
      *@retval None   
      */
    void SPI1_RGB_Configuration(void)
    {
       spi_parameter_struct spi_init_struct;

       /* SPI1 parameter config */
       spi_init_struct.trans_mode          = SPI_TRANSMODE_FULLDUPLEX;
       spi_init_struct.device_mode         = SPI_MASTER;
       spi_init_struct.frame_size          = SPI_FRAMESIZE_8BIT;
       spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
       spi_init_struct.nss                 = SPI_NSS_SOFT;
       spi_init_struct.prescale            = SPI_PSC_8;
       spi_init_struct.endian               = SPI_ENDIAN_MSB;
       spi_init(SPI1, &spi_init_struct);
    }

    /**   
      *@brief  SPI send a byte.   
      *@param  byte: 8-bit data   
      *@retval None   
      */

    void SPI_RGB_SendByte(uint8_t byte)
    {
       /* Loop while DR register in not emplty */
       while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET);
       /* Send byte through the SPI2 peripheral */
        spi_i2s_data_transmit(SPI1, byte);
    }

    下面为main函数int main(void)
    {   
       uint32_t num=0;
       rcu_periph_clock_enable(RCU_GPIOA);
       rcu_periph_clock_enable(RCU_GPIOB);
       rcu_periph_clock_enable(RCU_SPI1);
       SPI1_RGB_GPIO_Configuration();
       SPI1_RGB_Configuration();
       spi_enable(SPI1);
       gd_eval_led_init(LED1);
       gd_eval_led_init(LED2);
       systick_config();
       while (1)
       {
                RGB_Set_nLED(0x0000ff,6);   //蓝色
                delay_1ms(500);
                RGB_Reset();
                RGB_Set_nLED(0xff0000,6);   //绿色
                delay_1ms(500);
                RGB_Reset();
                RGB_Set_nLED(0x00ff00,6);  //红色
                delay_1ms(500);
                RGB_Reset();
                RGB_Set_nLED(0xffffff,6);  //白色
                delay_1ms(500);
                RGB_Reset();

        }
    }

    8实验效果

    效果1.jpg 效果2.jpg

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-25 22:11 , Processed in 0.131233 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.