回答

收藏

通过SPI接口控制RGB颗粒

GD32 GD32 7648 人阅读 | 0 人回复 | 2017-06-11

本帖最后由 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:引脚功能图

3:时序波形图


4:数据传输时间


5数据传输方法


624bit RGB数据结构

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


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


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实验效果



分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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