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

[复制链接]
 楼主| wode2008 发表于 2024-12-22 12:37 | 显示全部楼层 |阅读模式
#技术资源#        本帖介绍用AT32L021的spi2硬件驱动tft屏,使用的是屏幕是大越创新1.8寸的160*128屏幕。接口为
874666767900721edc.png

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

IMG_0506.jpg

软件部分:

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

  1.   gpio_init_type gpio_initstructure;
  2.   spi_init_type spi_init_struct;

  3.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  4.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   //crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  6.   
  7.         //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_0);
  8.         //gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_0);       
  9.        
  10.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE12, GPIO_MUX_0);
  11.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_0);
  12.   gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_0);
  13.   
  14.   /* software cs, pb12 as a general io to control flash cs */
  15.   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  16.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  17.   gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  18.   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  19.   gpio_initstructure.gpio_pins           = GPIO_PINS_12;
  20.   gpio_init(GPIOB, &gpio_initstructure);

  21.   /* sck */
  22.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  23.   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  24.   gpio_initstructure.gpio_pins           = GPIO_PINS_13;
  25.   gpio_init(GPIOB, &gpio_initstructure);

  26.   /* miso */
  27.   //gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  28.   //gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  29.   //gpio_initstructure.gpio_pins           = GPIO_PINS_14;
  30.   //gpio_init(GPIOB, &gpio_initstructure);

  31.   /* mosi */
  32.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  33.   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  34.   gpio_initstructure.gpio_pins           = GPIO_PINS_15;
  35.   gpio_init(GPIOB, &gpio_initstructure);
  36.        
  37.         /* dc */
  38.   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  39.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  40.   gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  41.   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  42.   gpio_initstructure.gpio_pins           = GPIO_PINS_8;
  43.   gpio_init(GPIOA, &gpio_initstructure);
  44.        
  45.         /* blk */
  46.         gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  47.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  48.   gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;
  49.   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  50.   gpio_initstructure.gpio_pins           = GPIO_PINS_9;
  51.   gpio_init(GPIOA, &gpio_initstructure);
复制代码
以上是配置IO,第二步,我们要配置spi的具体参数,如下:

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

  1. uint8_t spi_byte_write(uint8_t data)
  2. {
  3.   spi_i2s_data_transmit(SPI2, data);
  4.   while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);
  5.   return 0;
  6. }
复制代码
我们直接用库函数里的作为写tft的寄存器函数。其初始化如下:

  1.        
  2.         LCD_WR_REG(0x11);      //Sleep exit
  3.         delay_ms(120);      // delay 120 ms
  4.         //ST7735R Frame Rate
  5.           LCD_WR_REG(0xB1);
  6.                 LCD_WR_DATA8(0x05);
  7.                 LCD_WR_DATA8(0x3C);
  8.                 LCD_WR_DATA8(0x3C);
  9.                 LCD_WR_REG(0xB2);
  10.                 LCD_WR_DATA8(0x05);
  11.                 LCD_WR_DATA8(0x3C);
  12.                 LCD_WR_DATA8(0x3C);
  13.                 LCD_WR_REG(0xB3);
  14.                 LCD_WR_DATA8(0x05);
  15.                 LCD_WR_DATA8(0x3C);
  16.                 LCD_WR_DATA8(0x3C);
  17.                 LCD_WR_DATA8(0x05);
  18.                 LCD_WR_DATA8(0x3C);
  19.                 LCD_WR_DATA8(0x3C);
  20.                 //------------------------------------End ST7735S Frame Rate---------------------------------//
  21.                 LCD_WR_REG(0xB4); //Dot inversion
  22.                 LCD_WR_DATA8(0x03);
  23.                 //------------------------------------ST7735S Power Sequence---------------------------------//
  24.                 LCD_WR_REG(0xC0);
  25.                 LCD_WR_DATA8(0x28);
  26.                 LCD_WR_DATA8(0x08);
  27.                 LCD_WR_DATA8(0x04);
  28.                 LCD_WR_REG(0xC1);
  29.                 LCD_WR_DATA8(0XC0);
  30.                 LCD_WR_REG(0xC2);
  31.                 LCD_WR_DATA8(0x0D);
  32.                 LCD_WR_DATA8(0x00);
  33.                 LCD_WR_REG(0xC3);
  34.                 LCD_WR_DATA8(0x8D);
  35.                 LCD_WR_DATA8(0x2A);
  36.                 LCD_WR_REG(0xC4);
  37.                 LCD_WR_DATA8(0x8D);
  38.                 LCD_WR_DATA8(0xEE);
  39.                 //---------------------------------End ST7735S Power Sequence-------------------------------------//
  40.                 LCD_WR_REG(0xC5); //VCOM
  41.                 LCD_WR_DATA8(0x1A);
  42.                 LCD_WR_REG(0x36); //MX, MY, RGB mode
  43.                 LCD_WR_DATA8(0xC0);
  44.                 //------------------------------------ST7735S Gamma Sequence---------------------------------//
  45.                 LCD_WR_REG(0xE0);
  46.                 LCD_WR_DATA8(0x04);
  47.                 LCD_WR_DATA8(0x22);
  48.                 LCD_WR_DATA8(0x07);
  49.                 LCD_WR_DATA8(0x0A);
  50.                 LCD_WR_DATA8(0x2E);
  51.                 LCD_WR_DATA8(0x30);
  52.                 LCD_WR_DATA8(0x25);
  53.                 LCD_WR_DATA8(0x2A);
  54.                 LCD_WR_DATA8(0x28);
  55.                 LCD_WR_DATA8(0x26);
  56.                 LCD_WR_DATA8(0x2E);
  57.                 LCD_WR_DATA8(0x3A);
  58.                 LCD_WR_DATA8(0x00);
  59.                 LCD_WR_DATA8(0x01);
  60.                 LCD_WR_DATA8(0x03);
  61.                 LCD_WR_DATA8(0x13);
  62.                 LCD_WR_REG(0xE1);
  63.                 LCD_WR_DATA8(0x04);
  64.                 LCD_WR_DATA8(0x16);
  65.                 LCD_WR_DATA8(0x06);
  66.                 LCD_WR_DATA8(0x0D);
  67.                 LCD_WR_DATA8(0x2D);
  68.                 LCD_WR_DATA8(0x26);
  69.                 LCD_WR_DATA8(0x23);
  70.                 LCD_WR_DATA8(0x27);
  71.                 LCD_WR_DATA8(0x27);
  72.                 LCD_WR_DATA8(0x25);
  73.                 LCD_WR_DATA8(0x2D);
  74.                 LCD_WR_DATA8(0x3B);
  75.                 LCD_WR_DATA8(0x00);
  76.                 LCD_WR_DATA8(0x01);
  77.                 LCD_WR_DATA8(0x04);
  78.                 LCD_WR_DATA8(0x13);
  79.                 //------------------------------------End ST7735S Gamma Sequence-----------------------------//
  80.                 LCD_WR_REG(0x3A); //65k mode
  81.                 LCD_WR_DATA8(0x05);
  82.                 LCD_WR_REG(0x29); //Display on

  83.           LCD_Display_Dir(LCD_DIR_Mode);        //选择--屏幕显示方式
  84.                
  85.           //LCD_BLK_On;                                        //点亮背光
  86.                
  87.           LCD_Clear(WHITE);
复制代码
初始化后,进行对屏幕字符串的输出:

  1.   LCD_ShowString(0,0,120,16,12,BLUE,"abc");
  2.                 LCD_ShowString(0,16,120,16,12,BLUE,"AT32L021-TEST");
  3.                 LCD_ShowString(0,32,120,16,12,BLUE,"HARDWARE-SPI-TFT");
复制代码
实际效果如下:

IMG_0507.jpg



650046767914bbb5a8.png
WhisperingTrees 发表于 2024-12-22 20:59 | 显示全部楼层
显示图片啥的来一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

126

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部