打印
[AT32L021]

【AT-START-L021测评】硬件SPI驱动TFT屏

[复制链接]
58|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wode2008|  楼主 | 2024-12-22 12:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#技术资源#        本帖介绍用AT32L021的spi2硬件驱动tft屏,使用的是屏幕是大越创新1.8寸的160*128屏幕。接口为

与AT32L021通信用到了SDI SCL CS RS这四根线,因为单片机做主,tft屏幕做从设备,故SDO不用输出,可不接,单片机工作在半双工模式,其具体接线如图:


软件部分:

我们要配置两部分,一部分是硬件IO的配置,使用了硬件spi2,那么就要启用该功能,配置如下

  gpio_init_type gpio_initstructure;
  spi_init_type spi_init_struct;

  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  //crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  
        //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_0);
        //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_0);       
       
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE12, GPIO_MUX_0);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_0);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
  
  /* software cs, pb12 as a general io to control flash cs */
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins           = GPIO_PINS_12;
  gpio_init(GPIOB, &gpio_initstructure);

  /* sck */
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  gpio_initstructure.gpio_pins           = GPIO_PINS_13;
  gpio_init(GPIOB, &gpio_initstructure);

  /* miso */
  //gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  //gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  //gpio_initstructure.gpio_pins           = GPIO_PINS_14;
  //gpio_init(GPIOB, &gpio_initstructure);

  /* mosi */
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  gpio_initstructure.gpio_pins           = GPIO_PINS_15;
  gpio_init(GPIOB, &gpio_initstructure);
       
        /* dc */
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins           = GPIO_PINS_8;
  gpio_init(GPIOA, &gpio_initstructure);
       
        /* blk */
        gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins           = GPIO_PINS_9;
  gpio_init(GPIOA, &gpio_initstructure);
以上是配置IO,第二步,我们要配置spi的具体参数,如下:

  crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
  spi_default_para_init(&spi_init_struct);
  spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2;
  spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  spi_init(SPI2, &spi_init_struct);
  spi_enable(SPI2, TRUE);
其中有配置时钟,模式,分频,帧模式,cs模式,传输位等。配置成功后,我们就可以进行对tft进行初始化控制,主要是用到单片机的spi硬件发送函数。

uint8_t spi_byte_write(uint8_t data)
{
  spi_i2s_data_transmit(SPI2, data);
  while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);
  return 0;
}
我们直接用库函数里的作为写tft的寄存器函数。其初始化如下:

        
        LCD_WR_REG(0x11);      //Sleep exit
        delay_ms(120);      // delay 120 ms
        //ST7735R Frame Rate
          LCD_WR_REG(0xB1);
                LCD_WR_DATA8(0x05);
                LCD_WR_DATA8(0x3C);
                LCD_WR_DATA8(0x3C);
                LCD_WR_REG(0xB2);
                LCD_WR_DATA8(0x05);
                LCD_WR_DATA8(0x3C);
                LCD_WR_DATA8(0x3C);
                LCD_WR_REG(0xB3);
                LCD_WR_DATA8(0x05);
                LCD_WR_DATA8(0x3C);
                LCD_WR_DATA8(0x3C);
                LCD_WR_DATA8(0x05);
                LCD_WR_DATA8(0x3C);
                LCD_WR_DATA8(0x3C);
                //------------------------------------End ST7735S Frame Rate---------------------------------//
                LCD_WR_REG(0xB4); //Dot inversion
                LCD_WR_DATA8(0x03);
                //------------------------------------ST7735S Power Sequence---------------------------------//
                LCD_WR_REG(0xC0);
                LCD_WR_DATA8(0x28);
                LCD_WR_DATA8(0x08);
                LCD_WR_DATA8(0x04);
                LCD_WR_REG(0xC1);
                LCD_WR_DATA8(0XC0);
                LCD_WR_REG(0xC2);
                LCD_WR_DATA8(0x0D);
                LCD_WR_DATA8(0x00);
                LCD_WR_REG(0xC3);
                LCD_WR_DATA8(0x8D);
                LCD_WR_DATA8(0x2A);
                LCD_WR_REG(0xC4);
                LCD_WR_DATA8(0x8D);
                LCD_WR_DATA8(0xEE);
                //---------------------------------End ST7735S Power Sequence-------------------------------------//
                LCD_WR_REG(0xC5); //VCOM
                LCD_WR_DATA8(0x1A);
                LCD_WR_REG(0x36); //MX, MY, RGB mode
                LCD_WR_DATA8(0xC0);
                //------------------------------------ST7735S Gamma Sequence---------------------------------//
                LCD_WR_REG(0xE0);
                LCD_WR_DATA8(0x04);
                LCD_WR_DATA8(0x22);
                LCD_WR_DATA8(0x07);
                LCD_WR_DATA8(0x0A);
                LCD_WR_DATA8(0x2E);
                LCD_WR_DATA8(0x30);
                LCD_WR_DATA8(0x25);
                LCD_WR_DATA8(0x2A);
                LCD_WR_DATA8(0x28);
                LCD_WR_DATA8(0x26);
                LCD_WR_DATA8(0x2E);
                LCD_WR_DATA8(0x3A);
                LCD_WR_DATA8(0x00);
                LCD_WR_DATA8(0x01);
                LCD_WR_DATA8(0x03);
                LCD_WR_DATA8(0x13);
                LCD_WR_REG(0xE1);
                LCD_WR_DATA8(0x04);
                LCD_WR_DATA8(0x16);
                LCD_WR_DATA8(0x06);
                LCD_WR_DATA8(0x0D);
                LCD_WR_DATA8(0x2D);
                LCD_WR_DATA8(0x26);
                LCD_WR_DATA8(0x23);
                LCD_WR_DATA8(0x27);
                LCD_WR_DATA8(0x27);
                LCD_WR_DATA8(0x25);
                LCD_WR_DATA8(0x2D);
                LCD_WR_DATA8(0x3B);
                LCD_WR_DATA8(0x00);
                LCD_WR_DATA8(0x01);
                LCD_WR_DATA8(0x04);
                LCD_WR_DATA8(0x13);
                //------------------------------------End ST7735S Gamma Sequence-----------------------------//
                LCD_WR_REG(0x3A); //65k mode
                LCD_WR_DATA8(0x05);
                LCD_WR_REG(0x29); //Display on

          LCD_Display_Dir(LCD_DIR_Mode);        //选择--屏幕显示方式
               
          //LCD_BLK_On;                                        //点亮背光
               
          LCD_Clear(WHITE);
初始化后,进行对屏幕字符串的输出:

  LCD_ShowString(0,0,120,16,12,BLUE,"abc");
                LCD_ShowString(0,16,120,16,12,BLUE,"AT32L021-TEST");
                LCD_ShowString(0,32,120,16,12,BLUE,"HARDWARE-SPI-TFT");
实际效果如下:




650046767914bbb5a8.png (1.53 MB )

650046767914bbb5a8.png

使用特权

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

本版积分规则

4

主题

115

帖子

3

粉丝