一文搞懂 8080 协议

什么是 8080 协议?


8080 时序也叫因特尔总线,一般应用在mcu(mpu)模式的lcd上。Inter总线控制线有四根:

  • RD:写使能

  • WR:读使能

  • DC(RS):数据/命令

  • CS:片选

LCD控制及传输数据所需要的管脚:

管脚名称功能描述
CS片选信号
DC(RS)数据或者命令管脚(1:数据读写,0:命令读写)
WRMCU(MPU)向LCD写入数据控制线,上升沿有效,写数据时 RD拉高
RDMCU (MPU) 从LCD读数据控制线,上升沿有效,读数据时,WR拉高
DB[x:0]8/9/16/18bit 双向数据总线,一般8位MCU接口用的比较多
RST硬件复位 LCD 信号
BLLCD背光信号
IM2/IM1/IM0接口控制. IM2=0 串行,IM2 =1,IM1=0,IM0=0,6800/8080 8bit 并行接口;IM1=0,IM0=1,6800/8080 16bit 并行接口;IM1=1,IM0=0,6800/8080 9bit 并行接口;IM1=1,IM0=1,6800/8080 18bit 并行接口;
P686800/8080 选择。0 表示8080,1 表示6800

读写数据


读时序图。通用时序图如下:

image.png

读数据的过程:

  • CS 拉低,选中

  • DC/RS 为高(读数据)

  • WR 为高,禁止写

  • 在RD的上升沿,读线上的数据(D[0:7]),假设8位 8080并口

  • CS 拉高,取消片选

伪代码:

LCD_CS = 0; //开始片选
LCD_DC = 1; //读数据
LCD_WR = 1; //禁止写
LCD_RD = 0; //开始读
data = DATAIN();//读取数据
LCD_RD = 1; //结束读
LCD_CS = 1; //结束片选

写入数据


写时序图。通用时序图如下:

image.png

写数据的过程:

  • CS为低,选中

  • RD为高, 禁止写

  • DC/RS为高(写数据,写命令拉低)

  • 在WR的上升沿,使数据写入到 驱动 IC 里面

  • CS为高,结束一组数据读取

伪代码:

LCD_CS = 0; //开始片选
LCD_RD = 1; //禁止读
LCD_DC = 1; //写数据
DATAOUT(Data); //输出数据 ,先准备好数据,然后上升沿一次性更新到lcd
LCD_WR = 0; //写入开始
LCD_WR = 1; //写入结束
LCD_CS = 0; //结束片选

实列演示:GPIO 模拟读写时序


以GC9106 这块LCD 驱动IC为例,介绍一下,如何根据datasheet,去模拟读写操作,方便后续遇到新的屏幕,可以快速入手。事实上,大部分时候,我们的主控一般都会存在lcd控制器,支持读写操作,只需要配置寄存器即可。不过通过GPIO模拟,对整个过程会有更新的认识。

第一步:根据硬件确认屏幕所接接口,确认引脚及协议:以8080 8位并行为例

协议:8080时序

引脚:LCD_CSLCD_RD、LCD_WRLCD_DC、LCD_Data[7:0]

第二步:根据 datasheet 阅读读写时序

  • 读时序

image.png

驱动IC会在下降沿产生数据,主控(MCU)在上升沿从D[7:0] 读数据

image.png

整个读数据的过程,分为两步:写入一个command address, 读数据。

写入cmd:

image.png

读数据:根据时序图,真正读数据的过程中,第一个周期的数据是无效的,这个可以很好的解释command列表中,为何第一次数据都是dummy data

image.png

  • 写时序

image.png

主控(MCU)会在下降沿产生数据,驱动IC在上升沿从D[7:0] 读数据

image.png

整个写数据的阶段分为两个:写命令和写数据,唯一的区别是DC不一样。

image.png

第三步:查看command列表。这里以读ID为列(04H)

image.png

image.png

  • 阅读command信息

  • 根据timing,先写入一个cmd(04H)

  • 紧接着,读四次数据。

  • 舍弃第一个数据(dummy data)

  • 注意:初始状态和初始值。如果读不出来数据,可能是上电时序的问题,这个时候可以通过硬件GPIO 复位一下lcd,然后在读取数据。

write_cmd(0x04);
read_data(); //dummy data
ID0 = read_data();
ID1 = read_data();
ID2 = read_data();

第四步:模拟基本读写时序操作。根据通用8080协议时序即可

此处用伪代码表示思路即可:

static void write_lcd_dc(int isCmd, unsignedint value)
{
    LCD_CS = 0; /* 拉低 */
    LCD_RD = 1; /* 禁止读 */
    if(isCmd == 1) {
        LCD_DC = 0; /* 拉低 写命令 */
    } else{
        LCD_DC = 1; /* 拉高 写数据 */
    }
    data_out(value); /* 准备数据 */
    LCD_WR = 0;    /* 拉低 */
    delay10us();     /* 上升沿更新数据*/
    LCD_WR = 1;   /* 拉高*/
    delay10us();
    LCD_CS = 1;    /*拉低, 取消片选*/
}

static void data_out(unsignedint value)
{
   /* 假设 data[0:8] 在一组GPIO上,并且连续
    * 设置data[0:8] 为输出状态,切默认都输出0
    */
    int i = 0;
    for(int i = 0; i < 8; i++) {
        LCD_Data[i] = ((value >> i) & 0x01);
    }
}

static unsigned int read_lcd_data()
{
   int ret = 0;
    LCD_CS = 0; /* 拉低,选中 */
    LCD_WR = 1; /* 拉高, 禁止写 */
    LCD_DC = 1; /* 拉高,表明将要读数据 */
    LCD_RD = 0; /* 拉低, 开始读数据*/
    delay10us();
    ret = data_In();     /* 读数据*/
    delay10us();
    LCD_RD = 1;/* 拉高, 结束读数据 */
    delay10us();
    LCD_CS = 1; /* 取消片选*/
    return ret;
}

static unsigned int data_in()
{
    int ret = 0;
    /* 假设 data[0:8] 在一组GPIO上,并且连续
     * 设置data[0:8] 为输入状态
     */
    int i = 0;
    for(int i = 0; i < 8; i++) {
        ret |= (gpio_get_value(LCD_Data[i]) << i);
    }

    return ret ;
}

总结


本文介绍了8080协议的基础时序,以及通用的读写操作,旨在了解学习8080协议。然后通过实际的lcd 驱动IC 应用举例,介绍如何阅读 lcd datasheet.通过GPIO 模拟读写操作,达到对整个协议的理解。

事实上,大多数情况下,我们不需要亲自模拟时序,调试一款新屏时,一般通过配置lcd控制器,会自动模拟时序,只需要将原厂的setting,按照对应的规则,加入到驱动中即可。当然,也可以通过gpio模拟读写,将lcd的setting,通过自己模拟的读写接口,设进去。

原文链接:

一文搞懂 8080 协议-阿里云开发者社区 (aliyun.com)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAN(Controller Area Network,控制器局域网)总线协议是一种广泛应用于工业自动化、汽车电子等领域的串行通讯协议。其帧格式如下: <img src="https://img-blog.csdnimg.cn/20200925125252655.png" width="400"> CAN总线协议的帧分为标准帧和扩展帧两种,其中标准帧包含11位标识符,扩展帧包含29位标识符。在CAN总线上,所有节点都可以同时发送和接收数据,因此需要在帧中包含发送方和接收方的信息。 帧格式的具体解释如下: 1. 帧起始符(SOF):一个固定的位模式,表示帧的起始。 2. 报文控制(CTRL):包含几个控制位,如IDE、RTR等。其中IDE表示标识符的类型,0表示标准帧,1表示扩展帧;RTR表示远程请求帧,0表示数据帧,1表示远程请求帧。 3. 标识符(ID):11位或29位的标识符,用于区分不同的CAN消息。 4. 控制域(CTL):包含几个控制位,如DLC、EDL等。其中DLC表示数据长度,即数据域的字节数;EDL表示数据长度是否扩展,0表示标准数据帧,1表示扩展数据帧。 5. 数据域(DATA):0~8字节的数据。 6. CRC:用于校验数据是否正确。 7. 确认位(ACK):由接收方发送的确认信息,表示数据是否正确接收。 8. 结束符(EOF):一个固定的位模式,表示帧的结束。 以上就是CAN总线协议的帧格式。在实际应用中,节点之间通过CAN总线进行数据交换,通过解析帧中的各个字段,可以判断消息的发送方、接收方、数据内容等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值