在使用OLED显示屏时,涉及到了SPI数据传输,经过资料查找,发现SPI分为模拟和硬件两种,本项目采用GPIO模拟SPI的方式进行OLED与DSP数据的传输及显示。本人使用的OLED屏如图所示。
此款OLED屏幕的引脚定义如下:
GND | 接地脚 |
VCC | 供电脚(一般用3.3V) |
DO | 使用SPI的时钟线 |
DI | 使用SPI的数据线 |
RES | 复位(OLED上电后需要进行一次复位) |
DC | SPI数据/命令选择脚 |
CS | 片选(低电平有效,如果只有一块从设备,可以接地) |
OLED屏幕如果只是单单接上正确的电源后,是不会发亮的,必须其余引脚都正确配置,且有数据进行传输才会显示。如果调试过程中屏幕一片黑,大概率是配置出了问题而不是屏幕坏了哦。
SPI时序分析:
在使用模拟SPI协议进行数据传输时,相当于使用SPI的通信时序逻辑,用配置、检测GPIO电平的方式,实现28335和OLED驱动之间的数据传输。
下图为一种SPI的时序,SPI时序有多种,区别在于是在时钟信号的上升沿采样/输出还是在下降沿采样/输出,以及数据采样时刻的区别。
(图片来源网络)
OLED屏幕驱动SSD1306:
常见的OLED屏幕使用的都是SSD1306驱动,可以支持3线SPI、4线SPI、IIC协议,一般的OLED屏幕背面会有一些未焊接的电阻,可以用来选择不同的协议模式。SSD1306与28335数据传输可以分为如下几步:
第①步:拉低片选CS,低电平表示选中此设备。(如果只有单个设备,直接接地保持拉低也可以,但是建议尝试拉低操作,毕竟以后可能遇到多设备的场景)
第②步:配置DC,低电平代表传输命令(Command),高电平代表传输数据(Data)。
第③步:SCLK(D0)发出时钟信号,图示为在时钟信号上升沿采样数据。
第④步:SDIN(D1)在时钟信号的上升沿传输数据,从高位开始传输一帧数据。
实现了28335和SSD1306的数据传输,就可以使用28335对其进行指令发送,实现对应的功能,SSD1306的指令较多,基础且常用的如下:
程序配置:
根据以上数据传输逻辑,可以将OLED屏幕的引脚连接至不同的GPIO口,并且对GPIO口进行相应配置。在需要数据传输时,对GPIO引脚进行操作,实现数据传输。当然数据传输显示需要使用ASCII对应的字库、汉字取模等。
程序后续整理后附上。
使用宏定义对GPIO进行配置
#define OLED_SCL_Clr() GpioDataRegs.GPBCLEAR.bit.GPIO62=1 //DO
#define OLED_SCL_Set() GpioDataRegs.GPBSET.bit.GPIO62=1
#define OLED_SDA_Clr() GpioDataRegs.GPCCLEAR.bit.GPIO64=1 //DI
#define OLED_SDA_Set() GpioDataRegs.GPCSET.bit.GPIO64=1
#define OLED_RES_Clr() GpioDataRegs.GPCCLEAR.bit.GPIO66=1 //RES
#define OLED_RES_Set() GpioDataRegs.GPCSET.bit.GPIO66=1
#define OLED_DC_Clr() GpioDataRegs.GPCCLEAR.bit.GPIO68=1 //DC
#define OLED_DC_Set() GpioDataRegs.GPCSET.bit.GPIO68=1
#define OLED_CS_Clr() GpioDataRegs.GPCCLEAR.bit.GPIO70=1 //CS
#define OLED_CS_Set() GpioDataRegs.GPCSET.bit.GPIO70=1
版权声明:本文为CSDN博主「饭点不上电」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42103804/article/details/120007914
暂无评论