trucyw 发表于 2024-12-19 17:54

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

本帖最后由 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_RDgpio_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自动送图功能,目前选择的是绿色)



光影捕手 发表于 2024-12-20 09:26

两颗IC分别是什么作用

trucyw 发表于 2024-12-24 08:18

光影捕手 发表于 2024-12-20 09:26
两颗IC分别是什么作用

分别控制对应左右一半显示
页: [1]
查看完整版本: 【AT-START-L021测评】两颗IC显示屏点亮