这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。
废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文章后,不管是F1,F4,H7等一系列系统硬件IIC配置都能明白如何通过参考手册、数据手册去学习配置。而不是Ctrl c,Ctrl v。这篇文章大致的简述一下OLED,对OLED有一定的认识。
本文不会概述OLED的物理工作原理,而是从技术手册的角度上简述它。首先要学习OLED就得先了解其驱动芯片,SSD1306。
一、概述
(1)简单概述
SSD1306是一款带控制器的单片CMOS OLED/PLED驱动器,用于有机/聚合物发光二极管点阵图形显示器。它由128个段和64个公域组成。该芯片是专为共阴极型OLED面板。
(2)引脚描述
此博客只概述了博主认为比较重要的几个引脚。
1.VDD:核心逻辑操作的电源引脚。
2.VCC:面板驱动电压电源。这也是最积极的电源电压供应引脚。
3.VSS:这是接地引脚。
4.VLSS:这是一个模拟接地引脚。它应该从外部连接到VSS。
5.VCOMH:COM信号引脚取消选择电压电平。此引脚和VSS之间应连接一个电容。
6.VBAT:预留管脚,它应该连接到VDD。
7.BGGND:预留管脚,它应该接地。
8.IREF:这是段输出电流基准引脚。一个电阻器应连接在他的引脚和VSS之间,以保持IREF电流在12.5 uA。电阻值详见后文。
9.CL:这是外部时钟输入引脚。当内部时钟使能(即CLS引脚为高电平)时,不使用此引脚,应连接到VSS。当内部时钟禁用(即CLS引脚为低电平)时,此引脚为外部时钟源输入引脚。
10.CLS:这是内部时钟使能引脚。当它是拉高(即连接到VDD),内部时钟启用。当它被拉低,在内部时钟被禁用;外部时钟源必须连接到CL引脚正常工作。
11.R/W#(WR#):这是连接到MCU接口的读/写控制输入引脚。当与6800系列微处理器接口时,此引脚将B读/写(R/W#)选择输入。读模式将进行时,该引脚被拉高(即连接到VDD)和写模式时低。当选择8080接口模式时,此引脚将是写入(WR#)输入。数据写入操作开始时,该引脚被拉低,芯片被选中。当选择串行或I2C接口时,此引脚必须连接到VSS。
12.D[7:0]:这些是8位双向数据总线,连接到微处理器的数据总线。选择串行接口模式时,D0将为串行时钟输入:SCLK;D1将为串行数据输入:SDIN,D2应保持NC。选择I2C模式时,D2、D1应连接在一起,用作应用中的SDAout、SDAin,D0为串行时钟输入SCL。
二、 SSD1306 硬件I2C介绍
(1)I2C特性
I2C通信接口由从机地址位SA0、I2C总线数据信号SDA(输出SDAOUT/D2,输入SDAIN/D1)和I2C总线时钟信号SCL(D0)组成。数据和时钟信号都必须连接到上拉电阻(记住这句话,一般买的模块都已经给你接好了上拉电阻)。RES#用于初始化设备。
1)从机地址位(SA0)
SSD1306必须在通过I2C总线发送或接收任何信息之前识别从机地址。该器件将响应从机地址,随后是从机地址位(“SA0”位)和读/写选择位(“R/W#”位),字节格式如下:
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
---|---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 1 | 0 | SA0 | R/W# |
为从机地址提供扩展位。可以选择“0111100”或“0111101”作为SSD 1306的从机地址。D/C#引脚用作从机地址选择的SA0。“R/W#”位用于确定I2C总线接口的工作模式。R/W#=1,则处于读取模式。R/W#=0,则处于写入模式。
小结:一般选择的模式是0x78(后续会讲解请参考),我们是向OLED写入数据点亮屏幕。从机地址位是包括读取或者写入状态位的
2)I2C总线数据信号(SDA)
SDA充当发送器和接收器之间的通信信道。数据和确认通过SDA发送。应该注意的是,ITO走线电阻和“SDA”引脚的上拉电阻成为一个分压器。因此,确认将不可能在“SDA”中获得有效的逻辑0电平。“SDAIN”和“SDAOUT”捆绑在一起,用作SDA。必须连接“SDAIN”引脚以充当SDA。“SDAOUT”引脚可能断开。当“SDAOUT”引脚断开时,I2C总线中的确认信号将被忽略。
3)I2C总线时钟信号(SCL)
I2C总线中的信息传输遵循时钟信号SCL。数据位的每个传输发生在SCL的单个时钟周期期间。
数据格式
你会发现数据格式严格遵守IIC协议,起始位S、从发送地址位SA、应答位A、数据data、应答位A、停止位P
注意数据位的构成是由构成
Co | D/C | 0 | 0 | 0 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|
X | X | 0 | 0 | 0 | 0 | 0 | 0 |
1.如果Co位设置为逻辑"0",则以下信息的传输将仅包含数据字节。
2.D/C#位决定下一个数据字节是作为命令还是数据。如果D/C#位设置为逻辑"0",则将以下数据字节定义为命令。如果D/C#位被设置为逻辑"1",则其将以下数据字节定义为将被存储在GDDRAM中的数据。GDDRAM列地址指针将在每次数据写入后自动增加1。
总结:0000,0000为发送指令格式,发送命令时地址为0x00,0100,0000为发送数据格式,为0x40而且其会递增,这也是书写代码的关键部分。
(2)I2C写入模式介绍
1.通过将SDA从高电平拉到低电平,同时SCL保持高电平,建立启动条件。
2.当应用停止条件时,写入模式将结束。停止条件也在下图中定义。停止条件是通过将"SDA"从低电平拉到高电平而"SCL"保持高电平来建立的。
3.确认位(A)将在接收到每个控制字节或数据字节后产生。
4.接收到一个字节的数据后,将产生一个确认信号(A),包括从机地址和R/W#位。确认信号的图示请参见下图。确认位定义为SDA线在确认相关时钟脉冲的高电平期间被下拉。
5.请注意,数据位的传输有一些限制。在每个SCL脉冲期间传输的数据位必须在时钟脉冲的“高”周期内保持稳定状态。图示见下图。除了在开始或停止条件,数据线可以切换只有当SCL为低。
暂时对IIC寄存器配置不进行讲解,在OLED处详细讲解。
三、SSD1306图形显示数据RAM(GDDRAM)介绍
首先我用一段简单的话描述一下什么是页,什么是列,首先需要知道SSD1306有8个页,128列,每一页有8个小灯它的构成也就是88=64、128=128、构成64128的点阵OLED屏。
推荐看看这位大佬的视频大佬对硬件讲解非常细致,本人是参考了许多大佬的视频的:链接: 【【STM32入门教程-2024】第14集 如何在OLED屏幕上挥毫】 https://www.bilibili.com/video/BV19u4y197df/?share_source=copy_web&vd_source=b25ae79b699fbc0a2f70ccb983f6b74a
竖向寻址方式(页)
GDDRAM是一种位映射的静态RAM,保存要存储的位模式。RAM的大小为128 x 64位,RAM分为八页,从PAGE0到PAGE7,用于单色128 x 64点阵显示,如下图所示。
小结这也就是页的构成,页有8段而每一段是有8个点位的,如下图所示。而64个点位是由8页*8点构成。
页地址对应的是(B0-B7h)
横向寻址方式(列)
For example下图通过实例展示了列和页地址指针移动的方式:列起始地址设置为2,列结束地址设置为125,页起始地址设置为1,页结束地址设置为6;水平地址递增模式通过命令20h启用。在这种情况下,图形显示数据RAM列可访问范围是从第2列到第125列和仅从第1页到第6页。另外,列地址指针被设置为2,并且页地址指针被设置为1。完成数据的一个像素的读/写后,列地址自动增加1,以访问下一个RAM位置进行下一次读/写操作。每当第n列地址指针完成访问最后第n列125时,它被复位回第n列2,页面地址自动增加1。当结束页6和结束列125 RAM位置被访问时,页地址被重置回1,列地址被重置回2。
列地址对应的是(00-7Fh)
小结:列地址是可以通过for循环递增的,不需要重新写下一列的地址然后设置对应状态。但是重新写列地址写对应状态也可以控制OLED,但是会非常冗长。
四、OLED简介
(1)原理图介绍
在这张原理图中会发现几个比较关键的部分。
1.上拉电阻硬件已经帮你接好R6、R7
2.本人手上的OLED是下拉接的R11
3.所对应的地址为0x78,但是这张电路原理图并没有对时钟的介绍,所以应该是使用的SSD1306的内部时钟。
数据手册里面发现没有啥好讲的,直接开始讲解寄存器配置
五、寄存器配置
将这张程序流程图一点点分析。
1.配置0XAE
这些单字节命令用于打开或关闭OLED面板显示。当显示器为ON时,通过Set Master Configuration命令选择的电路将被打开。当显示器为OFF时,这些电路将被关闭,并且段和公共输出分别处于VSS状态和高阻抗状态。这些命令将显示设置为以下两种状态之一:AEh:显示关闭;AFh:显示打开
2.配置0XD5:0X80
设置显示时钟分频比/振荡器频率。(A[3:0]显示时钟分频比)(A[7:4]振荡器频率)。首先要明白是将0XD5寄存器中写入数据0x80也就是1000,0000
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
首先低四位显示时钟分频比(D)(A[3:0])设置分频比以从CLK生成DCLK(显示时钟)。分频比为1至16,复位值= 1。有关DCLK和CLK的详细关系,D代表时钟分频比。它由命令D5h A[3:0]设置。分频比的范围为1至16。0000也就对应着分频为1。
其次高四位,如果CLS引脚被拉高(也就是内部时钟源使能),则对作为CLK源的振荡器频率Fosc进行编程。4位值导致16种不同的频率设置,如下所示。默认设置为1000b,这也是为什么推荐0x80。(因为它用的就是默认值)
3.配置0XA8:0X3F
设置多路复用比率,此命令将默认的63多路复用模式切换到范围从16到63的任何多路复用比率。输出焊盘COM0~COM63将切换到相应的COM信号。0X3F=63
4.配置0XD3:0X00
设置显示偏移,这是一个双字节命令。第二个命令指定显示起始行到COM 0 ~ COM 63之一的映射(假设COM 0是显示起始行,则显示起始行寄存器等于0)。0x00对应的就是没有偏移。
5.配置0X40
设置显示起始行,从第0行开始显示
6.配置0XA1
设置段重映射,此逗号将更改显示数据列地址和段驱动程序之间的映射。它允许OLED模块设计的灵活性。
7.配置0XC8
设置COM输出扫描方向,此命令设置COM输出的扫描方向,使OLED模块设计具有布局灵活性。此外,发出此命令后,显示屏将显示。例如,如果在正常显示期间发送此命令,则图形屏幕将立即垂直翻转。
8.配置0XDA:0x12
设置COM引脚硬件配置,此命令设置COM信号引脚配置以匹配OLED面板硬件布局。下表显示了不同条件下的COM引脚配置,0x12=0001,0010。A[4]=1,A[5]=0。替代COM引脚配置(DAh A[4] =1)COM输出扫描方向:从COM63到COM0(C8h)禁用COM左/右重映射(DAh A[5] =0)
9.配置0X81:0XCF
设置BANK0的对比度控制,此命令设置显示器的对比度设置。该芯片具有从00h到FFh的256个对比度级。段输出电流随着对比度阶跃值的增加而增加。
设置其亮度为207。
10.配置0XD9:0xF1
设置预充期间,此命令用于设置预充电周期的持续时间。间隔以DCLK的数量计数,其中DCLK等于2个DCLK。
11.配置0XDB:0x30
此命令调整VCOMH调节器输出。
12.配置0XA4
整个显示器打开,A4h命令使能根据GDDRAM内容显示输出。如果发出A5h命令,则通过使用A4h命令,显示将恢复到GDDRAM内容。换句话说,A4h命令从整个显示“ON”阶段恢复显示。A5h命令强制整个显示器为“ON”,而不管显示数据RAM的内容。
13.配置0XA6
设置正常/反转显示(A6h/A7h),此命令将显示设置为正常或反转。在正常显示中,RAM数据1表示"ON"像素,而在反向显示中,RAM数据0表示"ON"像素。
14.配置0X8D:0X14
使能电荷泵调节器8Dh、14h
15.配置0XAF
开启显示
至此寄存器配置以及所对应的含义已经大致有所了解,下一步开始编写根据寄存器步骤以及数据手册指导编写代码。