导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    驱动ST7789时候遇到了SPI不输出波形的问题

    V Series
    1
    1
    26
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • M
      mysteryli LV 7 最后由 编辑

      下面是逻辑分析仪抓的波形,DC和RST是正常有波形的
      f50549d7-8abc-4335-9652-14442054cf12-image.png
      设备数等配置是按照下面链接的教程来的
      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,
      	},
      };
      
      1 条回复 最后回复 回复 引用 分享 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策