驱动ST7789时候遇到了SPI不输出波形的问题
-
下面是逻辑分析仪抓的波形,DC和RST是正常有波形的

设备数等配置是按照下面链接的教程来的
https://docs.aw-ol.com/docs/soc/v821/disp/spi_lcd/disp_driver_dbi_spi_1.3inch/&spi1 { pinctrl-0 = <&spi1_pins_default>; pinctrl-1 = <&spi1_pins_sleep>; pinctrl-names = "default", "sleep"; clock-frequency = <1000000>; sunxi,spi-bus-mode = <SUNXI_SPI_BUS_MASTER>; sunxi,spi-cs-mode = <SUNXI_SPI_CS_SOFT>; status = "okay"; panel_st7789v_spi1: slave@0 { device_type = "spi-panel"; compatible = "allwinner,spi-panel"; reg = <0x0>; spi-max-frequency = <1000000>; lcd_used = <1>; lcd_driver_name = "st7789v"; lcd_if = <0>; lcd_dbi_if = <0>; lcd_data_speed = <48>; lcd_x = <280>; lcd_y = <240>; lcd_pixel_fmt = <10>; lcd_dbi_fmt = <2>; lcd_rgb_order = <0>; lcd_width = <60>; lcd_height = <60>; lcd_pwm_used = <0>; lcd_pwm_ch = <6>; lcd_pwm_freq = <5000>; lcd_pwm_pol = <1>; lcd_frm = <1>; lcd_gamma_en = <1>; fb_buffer_num = <2>; lcd_backlight = <100>; lcd_fps = <60>; lcd_dbi_te = <0>; lcd_dbi_clk_mode = <0>; lcd_spi_dc_pin = <&pio PD 13 GPIO_ACTIVE_LOW>; lcd_gpio_0 = <&pio PD 2 GPIO_ACTIVE_LOW>; status = "okay"; }; };最后再贴下驱动代码
#include "st7789v.h" static void LCD_power_on(u32 sel); static void LCD_power_off(u32 sel); static void LCD_bl_open(u32 sel); static void LCD_bl_close(u32 sel); static void LCD_panel_init(u32 sel); static void LCD_panel_exit(u32 sel); #define RESET(s, v) sunxi_lcd_gpio_set_value(s, 0, v) #define power_en(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val) #define lcd_fb_here ; //static struct disp_panel_para info[LCD_FB_MAX]; static void address(unsigned int sel, int x, int y, int width, int height) { sunxi_lcd_cmd_write(sel, 0x2B); /* Set row address */ sunxi_lcd_para_write(sel, (y >> 8) & 0xff); sunxi_lcd_para_write(sel, y & 0xff); sunxi_lcd_para_write(sel, (height >> 8) & 0xff); sunxi_lcd_para_write(sel, height & 0xff); sunxi_lcd_cmd_write(sel, 0x2A); /* Set coloum address */ sunxi_lcd_para_write(sel, (x >> 8) & 0xff); sunxi_lcd_para_write(sel, x & 0xff); sunxi_lcd_para_write(sel, (width >> 8) & 0xff); sunxi_lcd_para_write(sel, width & 0xff); sunxi_lcd_cmd_write(sel, 0x2c); } static void LCD_panel_init(unsigned int sel) { // if (bsp_disp_get_panel_info(sel, &info[sel])) { // lcd_fb_wrn("get panel info fail!\n"); // return; // } printk("+++start init 7789\n"); sunxi_lcd_cmd_write(sel, 0x11); // Sleep out sunxi_lcd_delay_ms(50); //************* Start Initial Sequence **********// sunxi_lcd_cmd_write(sel, 0x36); sunxi_lcd_para_write(sel, 0x00); sunxi_lcd_cmd_write(sel, 0x3A); sunxi_lcd_para_write(sel, 0x05); sunxi_lcd_cmd_write(sel, 0xB2); sunxi_lcd_para_write(sel, 0x0C); sunxi_lcd_para_write(sel, 0x0C); sunxi_lcd_para_write(sel, 0x00); sunxi_lcd_para_write(sel, 0x33); sunxi_lcd_para_write(sel, 0x33); sunxi_lcd_cmd_write(sel, 0xB7); sunxi_lcd_para_write(sel, 0x35); sunxi_lcd_cmd_write(sel, 0xBB); sunxi_lcd_para_write(sel, 0x19); // 2b sunxi_lcd_cmd_write(sel, 0xC0); sunxi_lcd_para_write(sel, 0x2C); sunxi_lcd_cmd_write(sel, 0xC2); sunxi_lcd_para_write(sel, 0x01); sunxi_lcd_cmd_write(sel, 0xC3); sunxi_lcd_para_write(sel, 0x12); sunxi_lcd_cmd_write(sel, 0xC4); sunxi_lcd_para_write(sel, 0x20); // VDV, 0x20:0v sunxi_lcd_cmd_write(sel, 0xC6); sunxi_lcd_para_write(sel, 0x0F); // 0x13:60Hz sunxi_lcd_cmd_write(sel, 0xD0); sunxi_lcd_para_write(sel, 0xA4); sunxi_lcd_para_write(sel, 0xA1); sunxi_lcd_cmd_write(sel, 0xE0); sunxi_lcd_para_write(sel, 0xD0); sunxi_lcd_para_write(sel, 0x04); sunxi_lcd_para_write(sel, 0x0D); sunxi_lcd_para_write(sel, 0x11); sunxi_lcd_para_write(sel, 0x13); sunxi_lcd_para_write(sel, 0x2B); sunxi_lcd_para_write(sel, 0x3F); sunxi_lcd_para_write(sel, 0x54); sunxi_lcd_para_write(sel, 0x4C); sunxi_lcd_para_write(sel, 0x18); sunxi_lcd_para_write(sel, 0x0D); sunxi_lcd_para_write(sel, 0x0B); sunxi_lcd_para_write(sel, 0x1F); sunxi_lcd_para_write(sel, 0x23); sunxi_lcd_cmd_write(sel, 0xE1); sunxi_lcd_para_write(sel, 0xD0); sunxi_lcd_para_write(sel, 0x04); sunxi_lcd_para_write(sel, 0x0C); sunxi_lcd_para_write(sel, 0x11); sunxi_lcd_para_write(sel, 0x13); sunxi_lcd_para_write(sel, 0x2C); sunxi_lcd_para_write(sel, 0x3F); sunxi_lcd_para_write(sel, 0x44); sunxi_lcd_para_write(sel, 0x51); sunxi_lcd_para_write(sel, 0x2F); sunxi_lcd_para_write(sel, 0x1F); sunxi_lcd_para_write(sel, 0x1F); sunxi_lcd_para_write(sel, 0x20); sunxi_lcd_para_write(sel, 0x23); sunxi_lcd_cmd_write(sel, 0x21); sunxi_lcd_cmd_write(sel, 0x11); mdelay(50); sunxi_lcd_cmd_write(sel, 0x29); mdelay(200); // if (info[sel].lcd_x < info[sel].lcd_y) // address(sel, 0, 0, info[sel].lcd_x - 1, info[sel].lcd_y - 1); // else // address(sel, 0, 0, info[sel].lcd_y - 1, info[sel].lcd_x - 1); } static void LCD_panel_exit(unsigned int sel) { sunxi_lcd_cmd_write(sel, 0x28); sunxi_lcd_delay_ms(20); sunxi_lcd_cmd_write(sel, 0x10); sunxi_lcd_delay_ms(20); sunxi_lcd_pin_cfg(sel, 0); } static s32 LCD_open_flow(u32 sel) { lcd_fb_here; /* open lcd power, and delay 50ms */ LCD_OPEN_FUNC(sel, LCD_power_on, 50); /* open lcd power, than delay 200ms */ LCD_OPEN_FUNC(sel, LCD_panel_init, 200); //LCD_OPEN_FUNC(sel, lcd_fb_black_screen, 50); /* open lcd backlight, and delay 0ms */ LCD_OPEN_FUNC(sel, LCD_bl_open, 0); return 0; } static s32 LCD_close_flow(u32 sel) { lcd_fb_here; /* close lcd backlight, and delay 0ms */ LCD_CLOSE_FUNC(sel, LCD_bl_close, 50); /* open lcd power, than delay 200ms */ LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10); /* close lcd power, and delay 500ms */ LCD_CLOSE_FUNC(sel, LCD_power_off, 10); return 0; } static void LCD_power_on(u32 sel) { /* config lcd_power pin to open lcd power0 */ lcd_fb_here; power_en(sel, 1); sunxi_lcd_power_enable(sel, 0); sunxi_lcd_pin_cfg(sel, 1); RESET(sel, 1); sunxi_lcd_delay_ms(100); RESET(sel, 0); sunxi_lcd_delay_ms(100); RESET(sel, 1); } static void LCD_power_off(u32 sel) { lcd_fb_here; /* config lcd_power pin to close lcd power0 */ sunxi_lcd_power_disable(sel, 0); power_en(sel, 0); } static void LCD_bl_open(u32 sel) { sunxi_lcd_pwm_enable(sel); /* config lcd_bl_en pin to open lcd backlight */ sunxi_lcd_backlight_enable(sel); lcd_fb_here; } static void LCD_bl_close(u32 sel) { /* config lcd_bl_en pin to close lcd backlight */ sunxi_lcd_backlight_disable(sel); sunxi_lcd_pwm_disable(sel); lcd_fb_here; } /* sel: 0:lcd0; 1:lcd1 */ static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3) { lcd_fb_here; return 0; } static int lcd_set_var(unsigned int sel, struct fb_info *p_info) { return 0; } static int lcd_set_addr_win(unsigned int sel, int x, int y, int width, int height) { address(sel, x, y, width, height); return 0; } static int lcd_blank(unsigned int sel, unsigned int en) { return 0; } struct __lcd_panel st7789v_panel = { /* panel driver name, must mach the name of lcd_drv_name in sys_config.fex */ .name = "st7789v", .func = { .cfg_open_flow = LCD_open_flow, .cfg_close_flow = LCD_close_flow, .lcd_user_defined_func = LCD_user_defined_func, .blank = lcd_blank, .set_var = lcd_set_var, .set_addr_win = lcd_set_addr_win, }, };
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号