新唐MCU技术
直播中

李萍

8年用户 1502经验值
私信 关注
[问答]

请问如何使用EBI连接i80接口的LCD模组?

如何使用EBI连接i80接口的LCD模组?

回帖(2)

王玉珍

2025-8-21 17:28:56
将EBI连接到i80接口的LCD模块所需的引脚如下:
EBI_AD[15:0]:EBI 数据总线
(16位数据宽度,EBI接口EBI_AD[15:0];EBI_AD[7:0],如果 EBI 接口为 8 位数据宽度)
EBI_nCSx:从设备使能信号,由主设备控制(EBI芯片选择输出)
EBI_nRD:EBI 读取使能输出
EBI_nWR:EBI 写入使能输出

LCD 模块 (LCDT24963701) 如下图所示:
DB:数据总线
nCS:CD芯片选择输出
RS:寄存器选择,RS=1:写入数据;RS=0:写入命令
RST:LCD驱动芯片复位信号
RD:读取使能信号
WR:写入使能信号
LED:背光控制引脚
X : 触摸屏 XL
X-:触摸屏XR
Y : 触摸屏 YU
Y-:触摸屏 YD
举报

李涛

2025-8-25 17:47:05

使用嵌入式总线接口(EBI/FSMC)驱动i80(Intel 8080)并行接口的LCD模组需要结合硬件连接和软件配置。以下是详细步骤:




一、硬件连接
































i80接口信号通常包括: 信号类型 具体信号
控制信号 RD(读使能)、WR(写使能)
片选信号 CS(芯片选择)
数据信号 DB0-DB15(8/16位数据线)
地址信号 RS(寄存器/数据选择)
复位信号 RESET

连接示例(以16位数据STM32为例)















































MCU EBI引脚 LCD i80引脚 备注
EBI_DATA[15:0] DB[15:0] 16位数据总线
EBI_ADDR[x] RS 地址线选择寄存器/数据
EBI_NE1 CS 片选信号
EBI_NWE WR 写使能
EBI_NOE RD 读使能(可选)
MCU_RESET RESET 硬件复位
PWM_OUT BL 背光控制(非EBI信号)


注意:  



  • RS通常接EBI地址线(如A0A16),通过地址值区分命令/数据。

  • 若LCD支持16位数据,优先使用以提高速度。





二、软件配置步骤(以STM32 HAL库为例)


1. 初始化EBI控制器


配置EBI接口的时序参数(关键!):


SRAM_HandleTypeDef hsram1;

void MX_EBI_Init(void) {
  FSMC_NORSRAM_TimingTypeDef Timing = {0};

  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;

  // 时序配置(单位:HCLK周期)
  Timing.AddressSetupTime = 2;      // 地址建立时间
  Timing.AddressHoldTime = 1;        // 地址保持时间
  Timing.DataSetupTime = 5;          // 数据建立时间
  Timing.BusTurnAroundDuration = 0; // 总线周转时间

  HAL_SRAM_Init(&hsram1, &Timing, NULL);
}

2. 定义LCD访问宏


#define LCD_BASE_ADDR 0x60000000 // EBI Bank1起始地址
#define LCD_CMD_ADDR  (LCD_BASE_ADDR | (1 << 16)) // RS接A16
#define LCD_DATA_ADDR (LCD_BASE_ADDR)            

// 写命令
#define LCD_WriteCmd(cmd)    (*(__IO uint16_t *)LCD_CMD_ADDR = (cmd))
// 写数据
#define LCD_WriteData(data)  (*(__IO uint16_t *)LCD_DATA_ADDR = (data))

3. LCD初始化序列


void LCD_Init(void) {
  // 硬件复位
  HAL_GPIO_WritePin(LCD_RESET_GPIO, LCD_RESET_PIN, GPIO_PIN_RESET);
  HAL_Delay(20);
  HAL_GPIO_WritePin(LCD_RESET_GPIO, LCD_RESET_PIN, GPIO_PIN_SET);
  HAL_Delay(50);

  // 发送初始化命令序列
  LCD_WriteCmd(0xCF);   // 电源控制命令
  LCD_WriteData(0x00);
  LCD_WriteData(0x81);
  LCD_WriteData(0xC0);

  LCD_WriteCmd(0xED);   // 启用内部电源调节
  LCD_WriteData(0x64);

  // ... 更多初始化命令(参考LCD手册)
}

4. 像素写入函数


void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
  LCD_SetCursor(x, y);       // 设置坐标(通过专用命令)
  LCD_WriteCmd(0x2C);        // 写入GRAM命令
  LCD_WriteData(color >> 8); // 高字节
  LCD_WriteData(color);      // 低字节
}



三、关键问题排查




  1. 时序不匹配  



    • 现象:白屏、花屏、数据错误。  

    • 解决:  

      • 根据MCU频率和LCD手册计算正确的 AddressSetupTime/DataSetupTime。  

      • 用逻辑分析仪检查 WR/CS/RS 时序。





  2. 地址映射错误  



    • 确保 RS 连接的地址线在访问时正确翻转(如 RSA16,则命令地址= BASE+0x10000)。




  3. 背光控制  



    • 背光通常需PWM或GPIO单独控制,不能直接接VCC。






四、性能优化技巧



  1. 16位数据总线:相比8位模式,数据传输效率翻倍。  

  2. DMA加速:利用DMA传输大块显示数据(如全屏刷新):  
    HAL_DMA_Start(&hdma_memtomem, (uint32_t)image_buf, LCD_DATA_ADDR, sizeof(image_buf)/2);

  3. 双缓冲机制:在SDRAM中建立帧缓冲区,通过DMA批量传输。




完整示例代码结构


├── Drivers
│   ├── STM32F4xx_HAL_Driver  // HAL库
├── Inc
│   ├── lcd.h                 // LCD函数声明
├── Src
│   ├── main.c                // 初始化EBI + LCD_Init()
│   ├── lcd.c                 // LCD底层驱动实现
│   ├── stm32f4xx_hal_msp.c   // 引脚/EBI时钟配置


✅ 调试建议:先用示波器检查 WR 信号是否正常,再逐步验证数据/命令写入流程。



通过以上步骤即可高效驱动i80接口LCD。实际开发需严格遵循具体MCU(如NXP Kinetis, Microchip SAM9X60)和LCD模组的数据手册。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分