本帖最后由 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数据传输方法
6:24bit 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,满足手册时序需求
OK,01码模拟没问题了,只需要按照24bit的数据结构发送。定义一个函数,参数data为24bitRGB数据。 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级联,data为24bit的RGB数据,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.3125us,80/1.3125=60.95,所以连续发送61个0x00就模拟出了复位信号。代码如下 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实验效果
|