wode2008 发表于 2024-12-22 12:37

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

#技术资源#      本帖介绍用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");实际效果如下:



WhisperingTrees 发表于 2024-12-22 20:59

显示图片啥的来一个
页: [1]
查看完整版本: 【AT-START-L021测评】硬件SPI驱动TFT屏