打印
[AT32L021]

【AT-START-L021测评】两颗IC显示屏点亮

[复制链接]
48|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
trucyw|  楼主 | 2024-12-19 17:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 trucyw 于 2024-12-19 17:58 编辑

#申请原创#
继RGB组合灯https://bbs.21ic.com/icview-3420686-1-1.html又过去一周了今天无论如何要更新了
刚好手头有一篇两颗IC的7‘’显示屏,那就他了
看了下显示屏的initial code选择了SPI来控制,那就先看下SPI怎么控制先(控制无非就是读&写)

上图的读写可以看到这颗芯片要求为16 clocks一周期,即8bit Address&8bit Data,在Address的MSB为读写标志位(0为写,1为读),bit5和bit6分别控制具体操作那一颗IC。
结合实际IO只需要3个IO即可(SDAI&SDAO共用),其他很多类似的点屏没有看到读的部分,今天在这里把读的部分完善。

分析仪抓取数据与串口打印结果一致(说了这么多还没有上代码不应该)
#ifndef __SPILCD_H

#define __SPILCD_H         
#include "at32l021_gpio.h"        

//#include "Delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//������
//SPILCD��������           
//////////////////////////////////////////////////////////////////////////////////
#define GIP_FORWARD
//#define GIP_BACKWARD

#define SPILCD_CS_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_0)
#define SPILCD_CS_Set() gpio_bits_set(GPIOA,GPIO_PINS_0)

#define SPILCD_SCK_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_1)
#define SPILCD_SCK_Set() gpio_bits_set(GPIOA,GPIO_PINS_1)

#define SPILCD_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_4)
#define SPILCD_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_4)
#define SPILCD_SDA_RD  gpio_input_data_bit_read(GPIOA,GPIO_PINS_4)  //数据端口    PE13


void SPILCD_config(void);
void SPILCD_Writecmd(uint8_t n,uint8_t cmd, uint8_t dat);
uint8_t SPILCD_Readcmd(uint8_t n,uint8_t cmd);
void SPILCD_initial(void);// SPI��ʼ��
#endif


#include "spilcd.h"
#include "Delay.h"

void SPILCD_config(void)
{        
        gpio_init_type gpio_initstructure;
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        
        gpio_default_para_init(&gpio_initstructure);
        //lcd spi�ܽų�ʼ��
        
        //gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
        gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
        gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
        gpio_initstructure.gpio_pins =GPIO_PINS_0|GPIO_PINS_1|GPIO_PINS_4;
        gpio_initstructure.gpio_pull = GPIO_PULL_UP;
        gpio_init(GPIOA,&gpio_initstructure);
               
        SPILCD_CS_Set();
        SPILCD_SCK_Set();
        SPILCD_SDA_Set();
}
// 初始化SPILCD_SDA用到的GPIO口:PA4,输入模式
void SPILCD_SDA_In(void)
{
    gpio_init_type gpio_initstructure;
    gpio_default_para_init(&gpio_initstructure);

    /* DATA引脚:PA4 */
    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;
    gpio_initstructure.gpio_pins = GPIO_PINS_4;
    gpio_initstructure.gpio_pull = GPIO_PULL_UP;
    gpio_init(GPIOA, &gpio_initstructure);
}
// 初始化SPILCD_SDA用到的GPIO口:PA4,输出模式
void SPILCD_SDA_Out(void)
{
    gpio_init_type gpio_initstructure;
    gpio_default_para_init(&gpio_initstructure);

    /* DATA引脚:PA4 */
    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_initstructure.gpio_pins = GPIO_PINS_4;
    gpio_initstructure.gpio_pull = GPIO_PULL_UP;
    gpio_init(GPIOA, &gpio_initstructure);
}
//////////////////////////////////////////////////////////////////////////////////         
//����initial����
void SPILCD_Writecmd(uint8_t n,uint8_t cmd, uint8_t dat)
{
        uint8_t i;
        uint16_t data=((n<<5)|cmd)<<8|dat;
        SPILCD_CS_Clr();
        for(i=0;i<16;i++)
        {
                if((data & 0x8000) !=0)
                SPILCD_SDA_Set();
                else
                SPILCD_SDA_Clr();
               
                data<<=1;
                SPILCD_SCK_Clr();
                SPILCD_SCK_Set();
        }
        SPILCD_CS_Set();
}
uint8_t SPILCD_Readcmd(uint8_t n,uint8_t cmd)
{
        uint8_t i,recive=0;
        uint8_t data=0x80|(n<<5)|cmd;
        SPILCD_CS_Clr();
        for(i=0;i<8;i++)
        {
                if((data & 0x80) !=0)
                SPILCD_SDA_Set();
                else
                SPILCD_SDA_Clr();

                data<<=1;
                SPILCD_SCK_Clr();
                SPILCD_SCK_Set();
        }
        SPILCD_SDA_In();        
        for(i=0;i<8;i++)
        {
                SPILCD_SCK_Clr();
                SPILCD_SCK_Set();
                recive<<=1;
                if(SPILCD_SDA_RD)recive++;
        }
        SPILCD_SCK_Clr();
        SPILCD_SDA_Out();
        SPILCD_CS_Set();
        printf("SPILCD_Readcmd: %d 0x%02x 0x%02x\r\n",n,cmd,recive);
        return recive;
}

//SPILCD_initial��ʼ��
void SPILCD_initial(void)
{
        uint8_t i;
        
        for(i=0;i<2;i++)
        {
                SPILCD_Writecmd(i,0x00,0x00);
                SPILCD_Readcmd(i,0x05);
                SPILCD_Readcmd(i,0x1E);
               
                SPILCD_Writecmd(i,0x00,0x00);
                SPILCD_Writecmd(i,0x02,0xB1);
                SPILCD_Writecmd(i,0x03,0x03);
                SPILCD_Writecmd(i,0x04,0x40);

#ifdef GIP_BACKWARD
                SPILCD_Writecmd(i,0x00,0x10);
                SPILCD_Writecmd(i,0x01,0x01);
                SPILCD_Writecmd(i,0x02,0x19);
                SPILCD_Writecmd(i,0x03,0x09);
                SPILCD_Writecmd(i,0x04,0x0A);
                SPILCD_Writecmd(i,0x05,0x0B);
                SPILCD_Writecmd(i,0x06,0x0C);
                SPILCD_Writecmd(i,0x07,0x21);
                SPILCD_Writecmd(i,0x08,0x22);
                SPILCD_Writecmd(i,0x09,0x2B);
                SPILCD_Writecmd(i,0x0A,0x00);
#endif
#ifdef GIP_FORWARD
                SPILCD_Writecmd(i,0x00,0x10);
                SPILCD_Writecmd(i,0x01,0x19);
                SPILCD_Writecmd(i,0x02,0x01);
                SPILCD_Writecmd(i,0x03,0x0C);
                SPILCD_Writecmd(i,0x04,0x0B);
                SPILCD_Writecmd(i,0x05,0x0A);
                SPILCD_Writecmd(i,0x06,0x09);
                SPILCD_Writecmd(i,0x07,0x21);
                SPILCD_Writecmd(i,0x08,0x22);
                SPILCD_Writecmd(i,0x09,0x28);
                SPILCD_Writecmd(i,0x0A,0x2A);
#endif
        }
}

解释下SPILCD_initial中定义 i 的作用是因为本产品有两颗芯片,每颗芯片都需要更新初始化代码
代码完成,看下效果先(使用的是显示IC自动送图功能,目前选择的是绿色)



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

713

帖子

2

粉丝