硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2172|回复: 8
收起左侧

[emWin] TFT ILI9486液晶ID读取正确,液晶像素点写入再读取正确,不显示

[复制链接]

7

主题

31

回帖

52

积分

初级会员

积分
52
QQ
发表于 2018-10-27 16:15:50 | 显示全部楼层 |阅读模式
最近在写ILI9486驱动,液晶是8位并口,通过STM32F4xx的FMC连接。我测试了液晶屏ID读取是正确;然后设置区域,填充数据后再读取出来,数值也是一样的。
但是屏幕上什么都没有显示,请大家帮我分析一下.#define ILI9486_BASE       ((uint32_t)(0x60000000 | 0x00000000))

#define ILI9486_REG                *(__IO uint8_t *)(ILI9486_BASE)
#define ILI9486_RAM                *(__IO uint8_t *)(ILI9486_BASE + (1 << (0)))


unsigned char buf[300] = {0};
void lcd_fmc_init(void)
{
  FMC_NORSRAM_TimingTypeDef Timing;
  FMC_NORSRAM_TimingTypeDef ExtTiming;
  __HAL_RCC_FMC_CLK_ENABLE();


  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  //hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 15;
  Timing.AddressHoldTime = 1;
  Timing.DataSetupTime = 120;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 0;
  Timing.DataLatency = 0;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 9;
  ExtTiming.AddressHoldTime = 1;
  ExtTiming.DataSetupTime = 16;
  ExtTiming.BusTurnAroundDuration = 0;
  ExtTiming.CLKDivision = 0;
  ExtTiming.DataLatency = 0;
  ExtTiming.AccessMode = FMC_ACCESS_MODE_A;
  if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

static void ILI9486_WriteCmd(uint8_t _ucCmd)
{
        ILI9486_REG = _ucCmd;        /* ·¢&#203;íCMD */
}
static void ILI9486_WriteData(uint8_t _ucParam)
{
        ILI9486_RAM = _ucParam;
}

void lcd_reg_init(void)
{
  LCD_nRESET;
  HAL_Delay(1);
  LCD_RESET;
  HAL_Delay(10);
  LCD_nRESET;
  HAL_Delay (120);
        ILI9486_WriteCmd(0x01);
        HAL_Delay(100);

        ILI9486_WriteCmd(0XF1);
        ILI9486_WriteData(0x36);
        ILI9486_WriteData(0x04);
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x3C);
        ILI9486_WriteData(0x0F);
        ILI9486_WriteData(0x8F);

    ILI9486_WriteCmd(0xF2);  
        ILI9486_WriteData(0x18);
        ILI9486_WriteData(0xA3);
        ILI9486_WriteData(0x12);
        ILI9486_WriteData(0x02);
        ILI9486_WriteData(0xB2);
        ILI9486_WriteData(0x12);
        ILI9486_WriteData(0xFF);
        ILI9486_WriteData(0x10);
        ILI9486_WriteData(0x00);

        ILI9486_WriteCmd(0XF7);
        ILI9486_WriteData(0xa9);
        ILI9486_WriteData(0x91);
        ILI9486_WriteData(0x2d);
        ILI9486_WriteData(0x0a);
        ILI9486_WriteData(0x4c);
       
        ILI9486_WriteCmd(0xF8);  
        ILI9486_WriteData(0x21);
        ILI9486_WriteData(0x04);
       
        ILI9486_WriteCmd(0xF9);
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x08);  
       
        ILI9486_WriteCmd(0x36);    // Memory Access Control
        ILI9486_WriteData(0xC8);
       
        ILI9486_WriteCmd(0x3A);    // 16/18 bits
        ILI9486_WriteData(0x55);
       
        ILI9486_WriteCmd(0xB4);   
        ILI9486_WriteData(0x02);   // 2-Dot Inv

       
        ILI9486_WriteCmd(0xB7);
        ILI9486_WriteData(0x86);  

        ILI9486_WriteCmd(0xC0);    // Vreg
        ILI9486_WriteData(0x0c);   // Vreg1
        ILI9486_WriteData(0x02);   // Vreg2
         
        ILI9486_WriteCmd(0xC1);    //Power control
        ILI9486_WriteData(0x41);   //SAP[2:0];BT[3:0]
         
        ILI9486_WriteCmd(0xC2);    //Pump Freq
        ILI9486_WriteData(0x22);   
       
        ILI9486_WriteCmd(0xC5);   //DC VCOM
        ILI9486_WriteData(0x00);  
        ILI9486_WriteData(0x44);  
        ILI9486_WriteData(0x80);
       
        ILI9486_WriteCmd(0xB1);    //Frame Rate
        ILI9486_WriteData(0xB0);  
        ILI9486_WriteData(0x11);
          
       
        ILI9486_WriteCmd(0x26);    //Gamma curve selected
        ILI9486_WriteData(0x01);

        ILI9486_WriteCmd(0xE0);
        ILI9486_WriteData(0x0F);
        ILI9486_WriteData(0x1C);
        ILI9486_WriteData(0x18);
        ILI9486_WriteData(0x0A);
        ILI9486_WriteData(0x0F);
        ILI9486_WriteData(0x08);
        ILI9486_WriteData(0x45);
        ILI9486_WriteData(0xA8);
        ILI9486_WriteData(0x34);
        ILI9486_WriteData(0x0C);
        ILI9486_WriteData(0x13);
        ILI9486_WriteData(0x05);
        ILI9486_WriteData(0x0B);
        ILI9486_WriteData(0x07);
        ILI9486_WriteData(0x00);
       
        ILI9486_WriteCmd(0XE1);
        ILI9486_WriteData(0x0F);
        ILI9486_WriteData(0x38);
        ILI9486_WriteData(0x34);
        ILI9486_WriteData(0x0A);
        ILI9486_WriteData(0x0C);
        ILI9486_WriteData(0x03);
        ILI9486_WriteData(0x4B);
        ILI9486_WriteData(0x75);
        ILI9486_WriteData(0x3A);
        ILI9486_WriteData(0x07);
        ILI9486_WriteData(0x13);
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x27);
        ILI9486_WriteData(0x23);
        ILI9486_WriteData(0x00);
       
        /*ILI9486_WriteCmd(0xB6);   
        ILI9486_WriteData(0x00);   //  CPU\RGB
        ILI9486_WriteData(0x42);
        ILI9486_WriteData(0x3B); */
       
       ILI9486_WriteCmd(0xB7);   
        ILI9486_WriteData(0x86);

        ILI9486_WriteCmd(0xB6); // RM.DM Setting
        ILI9486_WriteData(0x02);
//        if(s_lcd_direct == LCD_DIRECT_ROT_180||g_InversionDisplaySwitch)        //180518 update
//                //ILI9486_WriteData(0x02);        //?1?ok
//                ILI9486_WriteData(0x42);         //?2?ok
//        else
                ILI9486_WriteData(0x22);
       

        ILI9486_WriteCmd(0x2A); // Gamma setting
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0x3F);
       
        ILI9486_WriteCmd(0x2B); // Gamma setting
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x00);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0xDF);

        ILI9486_WriteCmd(0x36); // Color filter setting
        ILI9486_WriteData(0x08);
       
        ILI9486_WriteCmd(0x11);    //Exit Sleep
        HAL_Delay(120);
        ILI9486_WriteCmd(0x29);    //Display on

       
        HAL_Delay(20);
        ILI9486_WriteCmd(0x2C);

}


void lcd_set_cursor(unsigned short Xpos,unsigned short Ypos)
{
        ILI9486_WriteCmd(0x2A); // Gamma setting
        ILI9486_WriteData(Xpos>>8);
        ILI9486_WriteData(Xpos&0XFF);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0x3F);
       
        ILI9486_WriteCmd(0x2B); // Gamma setting
        ILI9486_WriteData(Ypos>>8);
        ILI9486_WriteData(Ypos&0XFF);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0xDF);
}

void lcd_drow_point(unsigned short Xpos,unsigned short Ypos)
{
  lcd_set_cursor(Xpos,Ypos);
  ILI9486_WriteCmd(0x2C);
  for(unsigned int i = 0; i<480*320; i+=2)
  {
    ILI9486_WriteData(i);
    ILI9486_WriteData(i+1);
  }  
}
unsigned short lcd_get_point(unsigned short Xpos,unsigned short Ypos)
{
  lcd_set_cursor(Xpos,Ypos);
  ILI9486_WriteCmd(0x2E);
  for(unsigned short i = 0; i<204; i+=2)
  {
    buf[i] = ILI9486_RAM;
    buf[i+1] = ILI9486_RAM;
  }
  printf("read point is ");
  for(unsigned short i = 0; i<204; i++)
  {
    printf("%02x,",buf[i]);
  }
  printf("\r\n");
}

unsigned int lcd_get_id(void)
{
        ILI9486_REG = 0xd3;
        buf[0] = ILI9486_RAM;
        buf[1] = ILI9486_RAM;
        buf[2] = ILI9486_RAM;
        buf[3] = ILI9486_RAM;
  printf("the reg[d3h] para is %02x,%02x,%02x,%02x,%02x\r\n",buf[0],buf[1],buf[2],buf[3],buf[4]);
        return (buf[1] << 16) + (buf[2] << 8) + buf[3];
}

void lcd_reg_test(void)
{
lcd_reg_init();
  lcd_get_id();
  lcd_drow_point(0,0);
  HAL_Delay(1);
  lcd_get_point(1,0);
  HAL_Delay(1);

}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-27 16:24:11 | 显示全部楼层
有两个问题
1、你程序的背光是直接高低电平点亮的吗
2、你的8位并口,配的是几位色,16位色吗
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
QQ
 楼主| 发表于 2018-10-27 16:27:22 | 显示全部楼层
eric2013 发表于 2018-10-27 16:24
有两个问题
1、你程序的背光是直接高低电平点亮的吗
2、你的8位并口,配的是几位色,16位色吗

我用的屏背光是直接通过高电平点亮的,背光已经开了;配的是16位色的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-27 16:35:39 | 显示全部楼层
估计是打点函数问题,你这里设置坐标后,应该是不可以一直连续写数据的,连续写数据要开窗。
void lcd_drow_point(unsigned short Xpos,unsigned short Ypos)
{
  lcd_set_cursor(Xpos,Ypos);
  ILI9486_WriteCmd(0x2C);
  for(unsigned int i = 0; i<480*320; i+=2)
  {
    ILI9486_WriteData(i);
    ILI9486_WriteData(i+1);
  }  
}
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
QQ
 楼主| 发表于 2018-10-27 16:39:20 | 显示全部楼层
eric2013 发表于 2018-10-27 16:35
估计是打点函数问题,你这里设置坐标后,应该是不可以一直连续写数据的,连续写数据要开窗。
void lcd_dro ...

可能是我函数名瞎写void lcd_set_cursor(unsigned short Xpos,unsigned short Ypos)
{
        ILI9486_WriteCmd(0x2A); // Gamma setting
        ILI9486_WriteData(Xpos>>8);
        ILI9486_WriteData(Xpos&0XFF);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0x3F);
        
        ILI9486_WriteCmd(0x2B); // Gamma setting
        ILI9486_WriteData(Ypos>>8);
        ILI9486_WriteData(Ypos&0XFF);
        ILI9486_WriteData(0x01);
        ILI9486_WriteData(0xDF);
}
这个就是设置窗口从(Xpos,Ypos)到(320,480)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-27 16:42:25 | 显示全部楼层
lindada 发表于 2018-10-27 16:39
可能是我函数名瞎写void lcd_set_cursor(unsigned short Xpos,unsigned short Ypos)
{
        ILI9 ...

换成打点,显示几个红点看看。
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
QQ
 楼主| 发表于 2018-10-27 16:51:22 | 显示全部楼层
eric2013 发表于 2018-10-27 16:42
换成打点,显示几个红点看看。

我试了,还是显示不了,液晶屏用测试夹具测过,正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2018-10-28 02:37:04 | 显示全部楼层
lindada 发表于 2018-10-27 16:51
我试了,还是显示不了,液晶屏用测试夹具测过,正常

这就尴尬了,看程序已经没有问题了。
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
QQ
 楼主| 发表于 2018-10-29 16:30:08 | 显示全部楼层
自己顶一下,不要沉啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-17 15:13 , Processed in 0.261000 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表