找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14356|回复: 8
收起左侧

7针脚OLED用spi通讯的单片机源码与资料

  [复制链接]
ID:248500 发表于 2018-7-25 00:13 | 显示全部楼层 |阅读模式
OLED使用经历
       手里有7针脚的OLED屏幕,也是闲来无聊,就研究了一下如何使用。
       大概翻了一下厂家的手册,默认是SPI通讯,啊,他为什么不能是IIC通讯呢,不过也好,正好学习一下SPI
       先说SPI通讯,百度了一下SPI是同步串行全双工通讯总线。现在想想,DS18B20的单总线,eeprom的半双工IICOLED的全双工SPI就都玩过一把了。优缺点就不说了,现在的水平还是体会不到的,直接说怎么用。SPI可以接四根线(发数据与读数据)或者是接三线(只发数据)。
       四根线分别是:SDI(数据输入),SDO(数据输出)SCLK(时钟)CS(片选)
1.     SDO/MOSI:主设备发送数据,从设备接受数据
2.     SDI/MISO:主设备接受数据,从设备发送数据
3.     SCLK:时钟信号,由主设备产生
4.     CS:当从设备有很多时,每个设备都有一个CS引脚连接到主设备,当主设备想要连接到A从设备但是又不想连接到B的从设备时,就可以通过拉低A设备的CS引脚而不拉低B设备的CS引脚来控制不同的从设备是否工作
盗一张图SPI通讯的开始与结束比IIC简单多了,CS为低就开始,CS为高就结束


然后就是时钟极性(CPOL)与时钟相位(CPHA)了,感觉是不是听上去就高大上
主机和从机的时钟极性时钟相位必须一样,时钟极性与时钟相位通过不通过01组合,一共有四种模式
1.     mode0:CPOL = 0,CPHA = 0
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
2Mode1CPOL= 0,CPHA = 1
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
3.mode2CPOL= 1,CPHA = 0
       CPOL=1CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
4.mode3CPOL = 1,CPHA = 1
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
SPI的时钟极性和时钟相位一般都是是从机出场时就设定好的,主机根据从机去配
嗯,以上差不多就是我对SPI使用的理解了,下面说一说OLED


OLED的7个引脚分别为GND,VCC(3.3-5V)D0(时钟线)D1(数据线)RES(复位线)DC(数据命令选择线)和CS(SPI片选线)手上的OLED用的驱动芯片是SSD1306,那么就先从最基础的SPI与SSD1306通讯开始主要就是这么一个函数OLED_CS_Clr();首先传来两个数据,一个dat,一个cmd,如果cmd是1的话说明发送的是指令,要将DC拉高。DC确定完后拉低CS确定从机。之后开始传输数据。数据从高到低发送,数据手册上有说明按照次序将数据线至高至低,每次循环完一次后将时钟拉高,数据左移一位。这是SPI的时钟极性和时钟相位的所规定,总之SPI通讯是这么一回事,具体还得看手册。其中还是有一点小问题,图上的sclk(d0)在空闲情况下可高可低,但是在改动过程序后如果不将空闲时时钟线拉高的话是显示不出图像的,也就是sclk在空闲情况下只能是高。但是为什么数据手册上可高可低,我也确实不得而知,要是有大神懂的话就告诉我呗。
还有一个问题,SPI是有4根线的,现在只有三根,还有一根数据接收线。在我找遍了百度都找不到后,不得不翻开了数据手
串行模式下只允许写入操作,那剩下的读取线自然是没有了,好奇怪4线和3线有什么区别。。。哎英语还是得好好学啊。
好了,基本的通讯写完了,那剩下就是一些零散的寄存器配置了,要是可以搞懂SSD1306的寄存器配置还得读完59页的数据手册。。。。。。。还是偷个懒用原厂代码吧,里面有一些基本函数和字库,做简单的显示用还是应付的过来的。汉字用取模软件可以出,模式是列行式,图片的话吧图片转成bmp格式大小转换成128X64就能显示。
最后上几张测试图如果要用IIC的话图中的R3电阻要放到R4的

程序是根据厂家的程序一个一个函数调过来的,自己做了一个OLED的代码库,这里还是给出原厂代码吧。图片转换器和取模软件都在文件夹中。
1532447930169.jpg
t01b6660b12621e7f16.jpg
TIM图片20180724233052.jpg
TIM图片20180724233101.jpg
TIM图片20180724233112.jpg
Snipaste_2018-07-24_21-46-14.png
Snipaste_2018-07-24_22-39-32.png
Snipaste_2018-07-24_22-47-33.png
Snipaste_2018-07-24_23-40-19.png
Snipaste_2018-07-25_00-09-06.png
0.png

OLED使用经历.zip

12.04 MB, 下载次数: 312, 下载积分: 黑币 -5

回复

使用道具 举报

ID:248500 发表于 2018-7-25 00:23 | 显示全部楼层
时钟极性和时钟相位通过不同组合
回复

使用道具 举报

ID:248500 发表于 2018-7-25 00:24 | 显示全部楼层
主要就是这么一个函数OLED_WR_Byte(),这两处写错了,才看见
回复

使用道具 举报

ID:114519 发表于 2018-10-3 20:25 | 显示全部楼层
谢谢楼主分享,很有用
回复

使用道具 举报

ID:458460 发表于 2018-12-30 13:29 | 显示全部楼层
xiaowuya07 发表于 2018-7-25 00:24
主要就是这么一个函数OLED_WR_Byte(),这两处写错了,才看见

怎么改呢
回复

使用道具 举报

ID:564540 发表于 2019-7-7 18:43 | 显示全部楼层

I2C的话电阻要更改吗
回复

使用道具 举报

ID:433700 发表于 2019-8-28 08:23 | 显示全部楼层
Smartaotao 发表于 2019-7-7 18:43
I2C的话电阻要更改吗

要啊,你买的OLED背后一般有写IIC电阻有哪些,spi3线和spi四线有哪些电阻要焊上
回复

使用道具 举报

ID:648034 发表于 2019-11-27 09:06 | 显示全部楼层
主要就是这么一个函数OLED_WR_Byte(),这两处写错了,才看见
回复

使用道具 举报

ID:1089230 发表于 2023-7-22 17:14 | 显示全部楼层
可以写一下oled显示数字的程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表