开发环境:
IDE:MKD 5.38a
开发板:CPKCOR-RA8D1B开发板
MCU:R7FA8D1BHEC332AS00
1 RA8D1 I2C简介
I2C 通讯协议(Inter-Integrated Circuit)是由Philips公司开发的,由于它引脚少,硬件实现简单,可扩展性强, 不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
RA8D1有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,其功能框图如下图所示。
2 OLED简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。 以目前的技术, OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。
Figure 2-1 OLED外部结构
OLED 显示模块有以下特点:
1)模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2)尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
3)高分辨率,该模块的分辨率为 128*64。
4)多种接口方式,该模块提供了总共 5 种接口包括:6800、 8080 两种并行接口方式、3线或 4 线的穿行 SPI 接口方式、 IIC 接口方式(只需要 2 根线就可以控制 OLED)。
Table 2-1 MCU interface assignment under different bus interface mode
5)不需要高压,直接接 3.3V 就可以工作了。
本文将介绍基于I2C接口的OLED显示。
2.1 OLED的I2C通信协议
I2C总线协议允许数据和命令在设备间的通讯。
2.1.1 I2C写模式
I2C总线接口允许将数据和命令写入设备。
Figure 2-2 I2C写格式
1.主设备开始数据通讯通过开始条件,开始条件的定义如下图。开始条件发生在SCL高电平期间,SDA产生一个下降沿的跳变。
Figure 2-3 I2C起始和停止信号
2.从地址紧跟着开始信号,用于设备从设备。对于SSD1306来说,从地址可能是“b0111100”或者“b0111101”。通过改变“SA0位”为0或1,(D/C引脚作为SA0)。
3.写模式发生在R/W#位是低电平。
4.应答信号在接收到一个字节的数据后有从设备产生,包括从地址和R/W#位,参考下面关于应答信号的图示。应答信号定义为在SCL时钟周期的高电平期间SDA拉低。
Figure 2-4 I2C应答信号
5.在从地址发送结束后,不管是控制字节还是数据姐姐都可以发送通过SDA线。一个控制字节主要包括Co位和D/C#位在六个0后,
- 如果Co位为低电平,发送的后续信息只能是数据字节。
- D/C#位决定下一个数据字节是数据还是命令字节,如果D/C#字节设置为低电平,这意味着下一个字节是命令字节,如果D/C#为是高电平,下一个数据字节是数据字节,将被存储在GDDRAM中,GDDRAM的列地址指针在每一个数据写之后自加一。
6. 应答为在接收到一个数据字节或只命令字节后产生。
7. 写模式在接受到停止信号之后结束。停止信号发生在SCL高点平期间SDA的上升沿,作为停止信号。
2.1.2 命令解码器
这个模块用来决定输入的到底是数据还是命令,通过D/ C#位来判断。
如果D/C#是高电平,D[7:0]是作为显示数据写在图像数据随机存储器中(GDDRM),如果是低电平,输入的数据是被理解为命令。然后数据输入被解码并且写在相应的命令寄存器中。
2.1.3 振荡器电路和显示时间发生器
这个模块是一个片上低功耗RC振荡电路。工作时钟(CLK)可以由内部振荡器产生或者外部时钟源(CL引脚),通过引脚CLS选择,如果CLS引脚被拉到高电平,内部的时钟被选择,CL应该开路,将CLS引脚拉低则不使用内部振荡电路,这时为了工作正常一定要连接CL引脚。当内部振荡器被选择时,输出频率Fosc由命令D5h A[7:4]改变。
EEWORLDIMGTK6
Figure 2-5 振荡器电路
显示时序发生器的显示时钟(DCLK)源于CLK。分频系数D可以通过命令D5H 从1变到16。
DCLK = FOSC / D
显示帧频率由以下公式决定:
EEWORLDIMGTK7
- D代表时钟分频率,通过命令D5H A[3:0]决定,范围是从1到16.
- K是每行的显示时钟,该值源于K=相1周期+相2周期+BANK0脉宽 =2+2+54(电源复位时)
- 多路复用比通过命令A8H配置,复位值是(64MUX)。
- Fosc是振荡器频率,可以通过命令D5h [7:4]改变,这个值越大,设置的最终频率越高。
2.1.4 FR Synchronization
向OLED驱动器写一个新的图片的开始时间依赖于MCU的写速度,如果MCU可以完成写一帧图片在一个帧周期内,这个MCU被分类位高速写MCU。对于MCU需要更长的时间完成写操作(超过一个帧周期但每到两个帧周期),就是慢速的一种了。
Figure 2-6 FR同步信号
- 对于高速写微控制器:MCU应该开启向ram里写一个新的帧数据紧跟在FR的上升沿之后,并且应该在下一个上升沿到来之前完成。
- 对于低速写微控制器:MCU在第一个下降沿之前开始写,必须在第三个FR脉冲上升沿到来之前完成。
2.1.5 段驱动器和公共驱动器
段驱动器给予128个电流源来驱动OLED板,驱动电流可以在0~100uA调节(256份),公共驱动器发生电压扫描脉冲。
段驱动波形被分割成三相:
- 在相1,OLED上一个图片的像素放电为了准备下一个图像显示内容。
- 在相2,OLED像素被驱动到目标电压,像素驱动到相当的对地电压,相2的周期可以被编程为1到16个DCLK的长度。如果OLED像素的电容值更大,需要更长的周期来给电容充电到达期望的电压值。
- 在相3,OLED驱动选择使用电流源去驱动OLED像素,并且这时现在的电流驱动环节。
Figure 2-7 段驱动器输出波形
完成这三相之后,驱动IC将回到相1去显示下一个图片数据,这三步环节连续执行去刷新显示在OLED上。
在相3,如果电流驱动脉宽设置为50,在完成50个DCLK周期在现在的驱动相,驱动IC将回到相1继续下一个显示。
2.1.6 图片显示数据随机存储(GDDRAM)
GDDRAM是一个位映射静态RAM,保持位模式直到显示在OLED上,RAM的大小是128*64位且RAM分成8页,从第零页达第七页,用来存128*64个单色点阵显示,如下图所示。
Figure 2-8 图片显示数据随机存储器
但一个数据字节被写在GDDRAM中,当前页的所有的行图像数据被填满(例,一列(8位)使得列地址指针填满),数据为b0被写到最顶的一行,当数据位D7被写到最底下一行。如下图所示。
Figure 2-9 GDDRAM填充
为了灵活性,段复用和公共复用输出可以通过软件选择。
为了显示的垂直移动,一个内部寄存器存储显示开始行可以被设置通过RAM中的数据位置映射到显示屏上。(命令D3h)
2.1.7 开机和关机条件
下面用图解的方法给出了推荐的SSD1306开机和关机条件
OLED上电条件:
- VDD上电
- 在VDD电源稳定之后,设置RES#引脚为逻辑低至少3us然后拉高。
- 在RES#处于低电平状态之后,扥带至少3us,然后打开VCC。
- 在Vcc稳定后,发送命令AFh,打开显示。SEG/COM在100ms(Taf)后开启。
Figure 2-10 OLED开机时序
OLED关机条件:
- 发送命令AEh,关闭显示。
- 关掉Vcc。
- 等待Toff,关闭VDD.(典型值toff=100ms)。
Figure 2-11 OLED关机条件
注意:
- ESD保护电路连接达VDD和VCC之间,当VCC关闭时VDD比VCC要高。在图中用点线表示。
- VCC在关闭时时浮空的。
- 电源引脚(VDD,VCC)在关闭情况下一定不要拉到地。
3 RT-Thread 的I2C简介
I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA(serial data),另一根是双向时钟线 SCL(serial clock)。
I2C 总线允许同时有多个主设备存在,每个连接到总线上的器件都有唯一的地址,主设备启动数据传输并产生时钟信号,从设备被主设备寻址,同一时刻只允许有一个主设备。如下图所示:
一般情况下 MCU 的 I2C 器件都是作为主机和从机通讯,在 RT-Thread 中将 I2C 主机虚拟为 I2C总线设备,I2C 从机通过 I2C 设备接口和 I2C 总线通讯,相关接口如下所示:
函数 |
描述 |
rt_device_find() |
根据 I2C 总线设备名称查找设备获取设备句柄 |
rt_i2c_transfer() |
传输数据 |
关于I2C更详细的内容,请参看官方手册:
4 硬件I2C
4.1 硬件I2C硬件连接
硬件接口如下:
笔者这里使用的I2C1,即P511和P512。
4.2 RA8D1 I2C配置
接下来配置I2C,只需要简单配置就可使用。双击工程中的 RA Smart Configurator 图标,第一次打开需要配置正确的 FSP 安装路径。
4.3 硬件I2C测试验证
编译下载,然后在终端输入“ssd1306_TestAll”即可进行测试。
正常情况下,OLED将会点亮。
5 软件I2C
5.1 软件I2C硬件连接
笔者这里使用P508和P509。
5.2 RA8D1 I2C配置
接下来配置I2C,FSP默认即可。
然后打开对应的I2C。
配置对应的pin为P508和P509。当然可以换成其他空闲的GPIO。
接下来就是配置OLED驱动,笔者这里使用的SSD1306的软件包。
以上参数默认即可,笔者这里还使用了SSD1306的sample。
5.3 软件I2C测试验证
编译下载,然后在终端输入“ssd1306_TestAll”即可进行测试。
正常情况下,OLED将会点亮。