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