OLED模块-I2C协议
OLED模块概述
1.1 OLED简介
OLED(Organic Light-Emitting Diode,有机发光二极管)显示屏由许多微小的发光二极管构成,每个发光二极管就对应着屏幕上的一个像素,通过控制二极管的亮灭就能在屏幕上显示图像或文字。

按照驱动方式划分,OLED显示屏分可分为两类,分别是PMOLED(Passive Matrix,被动矩阵)和AMOLED(Active Matrix,主动矩阵)。
PMOLED的驱动方式和LED点阵类似,每次只能点亮一行或者一列,需要快速的逐行或者逐列扫描来显示内容。AMOLED屏幕上的每个像素点都有一个单独的控制电路,可以独立进行控制。
本文使用的是一块PMOLED(Passive Matrix,被动矩阵)屏,其分辨率为128x64。
1.2 驱动芯片
市面上的多数OLED显示屏都会带有驱动芯片,驱动芯片的核心作用是控制每个像素点的亮灭以显示图像或文字,此外它还会提供数据接口(例如I2C),用于接收屏幕上要显示的数据。驱动芯片的存在使得我们可以通过简单的接口控制OLED显示屏,大大简化了开发和控制流程。
本文所使用的这块OLED屏的驱动芯片为SSD1315,由于我们需要通过它来控制OLED显示的内容,所以需要重点学习它的用法。
1.2.1 基本工作原理

- 工作流程

1.2.2 IIC接口
虽然SSD1315的MCU Interface支持多种通信协议,但我们所选用的OLED显示模块只暴露出了IIC接口,如下图所示。

由于OLED显示屏的作用是显示数据,它对于MCU来讲更多的是一个输出设备,因此我们只需关注如何向SSD1315写入数据即可。下面是写数据的时序图:


说明:SSD1315的地址,高6位是固定的011110,最后1位SA0可由用户自定义。参考OLED模块手册,可得最后1位的默认值为0R/W#(读写标识)应为0。(增加或移出相应电阻可以更改高低电平实现修改地址)
结论:地址 + 读写标识应为01111000(0x78)。


说明:
MCU向SSD1315发送的数据可分为两类 -- Controlbyte和Data byte。
Data byte: 数据字节,其内容可能是Data(显示数据),也可能是Command(控制命令)。Control byte: 控制字节,在Data byte之前发送,用于声明后续Data byte内容的类型和格式,该字节只有高2位有效,其余6位均为0;D/C#(Data/Command): 用于声明后续的Data byte是Data还是Command,1表示Data,0表示Command。Co(Contination Bit): 用于声明后内容是否连续。0表示连续。此时后边可以连续发送多个Data bvte;1表示不连续,此时后边只能发送一个Data byte。需要注意的是,当
Co设置0时,本次通信中后续所有的字节都会被视作Databyte,co位的具体用法如下:






1.2.3 GDDRAM
GDDRAM的作用是存储显示数据,其容量是128×64 bit,每个bit对应着屏幕上的一个像素,该bit的值就能决定该像素的亮灭。
1.2.3.1 内存组织结构
分为8页,每一页128x8个字节:

每一页的结构

写一个Data byte:从上往下,而不是从左往右

1.2.3.2 内存寻址
在了解了内存组织结构之后,我们还需掌握内存的寻址方式,这样才能在我们指定的位置写入指定的内容。
向GDDRAM写入数据时是以byte为单位的,按照上述的内存组织结构, 定位一个byte,至少需要明确两点,分别是第几页(Page Address,页地址)和第几列(Column Address,列地址)。因此GDDRAM内部设有两个指针, Page Address Pointer和Column Address Pointer,分别指向当前要写入的页和列。为方便连续写入多个字节,每当成功写入一个字节后,Page Address Pointer或者Column Address Pointer会自动递增,指向下一个要写入的位置。
根据指针递增逻辑的不同,GDFRAM提供了三种不同的寻址方式,分别是页寻址,水平寻址和垂直寻址,具体使用哪种模式,可以通过向SSD1315发送控制命令进行选择,具体命令如下:

下面逐一介绍三种寻址方式的工作原理。
页寻址
这种寻址方式下,用户需要先向
SSD1315发送控制命令设置页地址(例如Page1)和列地址(例如COL3),此时Page Address Pointer和Column Address Pointer就会指向对应的位置。之后便可开始连续发送数据,每成功写入一个字节,Column Address Pointer都会自动+1,而Page Address Pointer始终不变,如果写到当前页末尾,Column Address Pointer会回到当前页的第1列。

设置页地址的命令如下: X三位表示0-7行

设置列地址的命令如下: 两个字节拆开分别表示高位和低位,7位可以表示0-127列

水平寻址
这种寻址方式下,用户需要先向
SSD1315发送控制命令,设置一个写入区域,具体来讲就是分别指定页的起始地址和结束地址(例如Page1~Page5)以及列的起始地址和结束地址(例如COL2~COL125)。此时Page Address Pointer和Column Address Pointer会指向该区域的左上角。之后便可开始连续发送数据,每成功写入一个字节,Column Address Pointer会自动+1,当到达目标区域的右侧边界时,Page Address Pointer便会自动+1。当写到目标区域的右下角时,两个指针会再次回到左上角。如下图所示。
设置页地址范围的命令如下。
如: 00100010 00000001 00000011 为1-3页

设置列地址范围的命令如下
如:00100001 00000001 00000011 为1-3列

垂直寻址
这种寻址方式下,用户需要先向
SSD1315发送控制命令,设置一个写入区域,具体来讲就是分别指定页的起始地址和结束地址(例如Page1~Page5)以及列的起始地址和结束地址(例如COL2~COL125)。此时Page Address Pointer和Column Address Pointer会指向该区域的左上角。之后便可开始连续发送数据,每成功写入一个字节,Page Address Pointer会自动+1,当到达目标区域的底部边界时,Column Address Pointer便会自动+1。当写到目标区域的右下角时,两个指针会再次回到左上角。如下图所示:
1.2.3.3 内存bit与屏幕像素映射关系
GDDRAM中的每个bit都对应着屏幕上的一个像素,但具体哪个bit对应着哪个像素,目前仍是不明确的,最理想的方式当然是每个bit和每个像素的位置完全对应,但默认情况下并非如此。
bit和像素之间的对应关系受两个环节的影响,第一个环节是GDDRAM和SSD1315输出引脚(64个COM和128个SEG)的对应关系,第二个环节是SSD1315的输出引脚和OLED屏幕的连线方式。下面逐一分析。
GDDRAM和SSD1315输出引脚对应关系,默认映射关系如下:一一对应

SSD1315输出引脚和OLED屏幕对应关系,行和列都与GDDRAM和SSD1315相反:

- 为了保证设计的灵活性,
SSD1315提供了重映射功能,用户可以通过控制命令来重新定义GDDRAM和输出引脚的对应关系,如下

映射过后,GDDRAM行的0对应oled屏幕行的0,GDDRAM列的0对应oled屏幕的列0,我们让左上角的二极管亮,只需要将SEG0和COM0定位的二极管亮即可;
设置Segment重映射的命令如下:
设置1即可让127映射为SEG0,从左到右127到0

设置Common重映射的命令如下:
X3设置为1即可从上到下为63到0

1
1
1
1
1
1
1
1
1
1