trucyw 发表于 2024-12-12 18:10

【AT-START-L021测评】点个组合RGB点灯-2

本帖最后由 trucyw 于 2024-12-25 16:41 编辑

P9813驱动RGB led,示意图来一波

使用AT32L021的PB7和PA9
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)

#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)

IO已经确认了接下来就需要了解P9813怎么来控制

以上图示可以看出我们显示一个颜色需要发送96个clk,具体解析如下
① 前32 位“0”为起始帧,在Cin 上升沿时打入,并且时序DIN要先于CIN;
② 标志位为两个“1”;
③ 校验数据“B7’”与“B6’”为蓝色灰度数据的“B7”与“B6”的反码;
④ 灰度级数据要高位先入,并且是蓝绿红顺序。
由此可得,MCU需要发送的数据
32位0起始信号: 0000 0000 0000 0000 0000 0000 0000 0000
第一点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
第二点32位灰度数据: 11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxx xxxx xxxx
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
      RGBLED_Send32Zero();//发送前32bit “0”起始帧
      RGBLED_DataDealWithAndSend(r, g, b);//第一个32bit灰度数据
      RGBLED_DataDealWithAndSend(r, g, b);//第二个32bit灰度数据
}

废话少一些,直接上波形


红色就出来了
其他颜色依此方法同样操作即可
P9813驱动RGB到此就完成了

TimeRiddle 发表于 2024-12-19 09:38

代码贴一下呗

trucyw 发表于 2024-12-19 16:59

#ifndef __RGBLED_H

#define __RGBLED_H       
#include "at32l021_gpio.h"       
//#include "Delay.h"
//////////////////////////////////////////////////////////////////////////////////       
//������
//RGBLED��������          
//////////////////////////////////////////////////////////////////////////////////
#define RGBLED_SCL_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_7)
#define RGBLED_SCL_Set() gpio_bits_set(GPIOB,GPIO_PINS_7)

#define RGBLED_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_9)
#define RGBLED_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_9)

void RGBLED_config(void);
void RGBLED_SHOW(void);//RGB��IO��ʼ��
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b);//RGB����ɫ����

#endif



#include "rgbled.h"
#include "Delay.h"

void RGBLED_config(void)
{       
        gpio_init_type gpio_initstructure;
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
       
        //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_0);
//gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
       
        gpio_default_para_init(&gpio_initstructure);
        //RGBLED�ܽų�ʼ��
        //din data
       
        gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
        gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_initstructure.gpio_pins =GPIO_PINS_9;
        gpio_initstructure.gpio_pull = GPIO_PULL_DOWN;
        gpio_init(GPIOA,&gpio_initstructure);
        //cin

        gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
        gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_initstructure.gpio_pins =GPIO_PINS_7;
        gpio_initstructure.gpio_pull = GPIO_PULL_UP;
        gpio_init(GPIOB,&gpio_initstructure);
       
        RGBLED_SCL_Set();
        RGBLED_SDA_Set();

}
//////////////////////////////////////////////////////////////////////////////////       
//MB-024
//RGBLED��������       
//����ǰ32λ'0'��ʼ֡
void RGBLED_Send32Zero(void)
{
       uint8_t i;
       
       RGBLED_SDA_Clr();
       
       for(i=0;i<32;i++)
       {
                        RGBLED_SCL_Clr();//Delay_us(200);
               
                        RGBLED_SCL_Set();//Delay_us(200);               
       }       
}

//��תǰ��λ�ĻҶ�ֵ
uint8_t RGBLED_TakeAntiCode(uint8_t dat)
{
        uint8_t tmp = 0;
       
        tmp = ((~dat) & 0xC0) >> 6;
        return tmp;
}

//���ͻҶ�����
void RGBLED_DatSend(uint32_t dx)
{
        uint8_t i;
        for(i=0;i<32;i++)
        {
                if((dx & 0x80000000) !=0)
                RGBLED_SDA_Set();
                else
                RGBLED_SDA_Clr();
               
                dx<<=1;
                RGBLED_SCL_Clr();//Delay_us(200);
                RGBLED_SCL_Set();///Delay_us(200);
        }       
}

//���ݴ����뷢��
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255
void RGBLED_DataDealWithAndSend(uint8_t r,uint8_t g,uint8_t b)
{
       
        uint32_t dx=0;
       
        dx |= (uint32_t)0x03 << 30;//ǰ��λ'1'λ��־λ
        dx |= (uint32_t)RGBLED_TakeAntiCode(b) << 28;
        dx |= (uint32_t)RGBLED_TakeAntiCode(g) << 26;
        dx |= (uint32_t)RGBLED_TakeAntiCode(r) << 24;
        dx |= (uint32_t)b << 16;
        dx |= (uint32_t)g << 8;
        dx |= r;
       
        RGBLED_DatSend(dx);//��������
}
//RGB�ƿ��ƺ���
//r;��ɫֵ 0~255
//g:��ɫֵ 0~255
//b:��ɫֵ 0~255
void RGBLED_Show(uint8_t r,uint8_t g,uint8_t b)
{
        RGBLED_Send32Zero();//����ǰ32λ'0'��ʼ֡
        RGBLED_DataDealWithAndSend(r, g, b);//���͵�һ��32bit�Ҷ�����
        RGBLED_DataDealWithAndSend(r, g, b);//���͵ڶ���32bit�Ҷ�����
}

//RGB�Ƴ�ʼ������
void RGBLED_SHOW(void)
{
//        RGBLED_config();
        RGBLED_Show(255,0,0);//R
        Delay_ms(100);
        RGBLED_Show(0,255,0);//G
        Delay_ms(100);
        RGBLED_Show(0,0,255);//B
        Delay_ms(100);
        RGBLED_Show(255,255,255);//W
        Delay_ms(100);
        RGBLED_Show(0,0,0);//�ر�RGB��
        //while(1);
}

页: [1]
查看完整版本: 【AT-START-L021测评】点个组合RGB点灯-2