数码之家

 找回密码
 立即注册
搜索
查看: 458|回复: 14

[STM] 基于STM32F1的0.96寸OLED显示屏驱动程序,支持硬件/软件I2C

[复制链接]
发表于 2024-2-26 17:39:41 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
基于STM32F103的0.96寸OLED显示屏驱动程序(4针脚I2C接口),支持硬件IIC/软件IIC。
这款驱动程序比较完善,可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示,可以画点、直线、矩形、圆、椭圆、三角形等,支持多种字体,差不多相当于一个简易版图形库了。

该程序是基于江协科技的代码二次修改的,原版程序只支持软件I2C,我修改后支持硬件I2C,也可以修改宏定义改成使用软件I2C。

程序是使用ST标准库写的。
测试硬件为STM32F103C8T6和AIR32F103CBT6,在这两款单片机上都测试过能跑,其中使用硬件I2C时STM32通信速率最高可以跑到1.3Mbit/s,AIR32最高只能跑600kbit/s。

关于OLED的驱动原理,以及驱动程序的使用教程可以看江协科技的视频:https://url.zeruns.tech/L7j6y
STM32使用硬件I2C读取SHTC3温湿度传感器:https://blog.zeruns.tech/archives/692.html
移植好U8g2图形库的STM32F407标准库工程模板:https://blog.zeruns.tech/archives/722.html

效果图
1708872657268.gif
IMG_20240225_225532.jpeg
IMG_20240225_225427.jpeg
I2C协议简介
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备(那些电平转化芯片),现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C只有一跟数据总线 SDA(Serial Data Line),串行数据总线,只能一位一位的发送数据,属于串行通信,采用半双工通信。
半双工通信:可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替进行,其实也可以理解成一种可以切换方向的单工通信,同一时刻必须只能一个方向传输,只需一根数据线。
对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性(硬件部分),确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准(软件层面)。
I2C物理层
I2C 通讯设备之间的常用连接方式
image.png
(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线SDA(Serial Data Line ),一条串行时钟线SCL(Serial Clock Line )。数据线即用来表示数据,时钟线用于数据收发同步
(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
I2C通信时单片机GPIO口必须设置为开漏输出,否则可能会造成短路。

关于更多STM32的I2C相关信息和使用方法可以看这篇文章:https://url.zeruns.tech/JC0Ah
还有江协科技的STM32入门教程:https://www.bilibili.com/video/BV1th411z7sn?p=31
我这里就不详细讲解了。

需要用的元件
江协科技的STM32入门套件:https://s.click.taobao.com/NTn9Txt

程序
完整工程下载地址
百度网盘:https://url.zeruns.tech/kSxoe 提取码: wgc3
123网盘(不限速):https://www.123pan.com/s/2Y9Djv-HGcvH.html 提取码:m7sp
工程使用Keil5创建,用Vscode+EIDE开发,两个软件都可以打开此工程。
工程文件全部使用UTF-8编码,如果打开显示乱码需要修改编辑器编码为UTF-8。

因为字数限制这里放不了代码,可以到这看:https://blog.zeruns.tech/archives/769.html

推荐阅读

打赏

参与人数 2家元 +39 收起 理由
杨小伟 + 24 謝謝分享
kkdkj + 15 謝謝分享

查看全部打赏

发表于 2024-2-26 20:08:11 | 显示全部楼层
今天把IPS屏的电容触摸功能调试成功,很灵敏且稳定,协议也是I2C,用软件模拟的更方便
回复 支持 反对

使用道具 举报

发表于 2024-2-26 20:08:58 来自手机浏览器 | 显示全部楼层
这个要顶,第一次看到这么完善的工程…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 20:30:14 | 显示全部楼层
inthsunshine 发表于 2024-2-26 20:08
今天把IPS屏的电容触摸功能调试成功,很灵敏且稳定,协议也是I2C,用软件模拟的更方便 ...

软件模拟的好移植很多,而且I2C其实软件模拟速度不比硬件I2C慢,我用逻辑分析仪实测了一下,STM32F103用软件I2C速度也能跑个1.2Mbit/s左右
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 20:30:57 | 显示全部楼层
inthsunshine 发表于 2024-2-26 20:08
今天把IPS屏的电容触摸功能调试成功,很灵敏且稳定,协议也是I2C,用软件模拟的更方便 ...

IPS屏还用I2C啊?不应该用SPI或并口吗?I2C速度够用?
回复 支持 反对

使用道具 举报

发表于 2024-2-26 21:08:26 | 显示全部楼层
zeruns 发表于 2024-2-26 20:30
IPS屏还用I2C啊?不应该用SPI或并口吗?I2C速度够用?

是触摸屏用I2C, IPS屏本身肯定SPI或并口
回复 支持 反对

使用道具 举报

发表于 2024-2-26 21:10:59 | 显示全部楼层
本帖最后由 inthsunshine 于 2024-2-27 09:26 编辑
zeruns 发表于 2024-2-26 20:30
软件模拟的好移植很多,而且I2C其实软件模拟速度不比硬件I2C慢,我用逻辑分析仪实测了一下,STM32F103用 ...

用I2C的场合通常对通信速度没什么要求,IO模拟就能胜任,我板子除了触摸屏用I2C,还有个芯片配置也是I2C, 只要更改端口配置,就可以方便共用底层驱动

最初标准的I2C最大只有400KHz,后面有改良的,能到1M以上,触摸FT6336只支持400KHz
回复 支持 反对

使用道具 举报

发表于 2024-2-26 21:39:45 | 显示全部楼层
这东西用什么语言编程?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 21:41:43 | 显示全部楼层
kkdkj 发表于 2024-2-26 21:39
这东西用什么语言编程?

一般用C语言
回复 支持 反对

使用道具 举报

发表于 2024-2-26 22:02:25 | 显示全部楼层
inthsunshine 发表于 2024-2-26 21:10
用I2C的场合通常对通信速度没什么要求,IO模拟就能胜任,我板子除了触摸屏用I2C,还有个芯片配置也是I2C,  ...

有硬件I2C我绝不用软件模拟I2C,一来占用CPU资源,二来有些功能不好实现,如从机忙检测、广播响应、10位地址。

回复 支持 反对

使用道具 举报

发表于 2024-2-26 22:06:47 | 显示全部楼层
本帖最后由 inthsunshine 于 2024-2-27 09:27 编辑
mmxx2015 发表于 2024-2-26 22:02
有硬件I2C我绝不用软件模拟I2C,一来占用CPU资源,二来有些功能不好实现,如从机忙检测、广播响应、10位 ...

stm32的硬件I2C不是有bug吗?I2C多从机的场合不多,很多时候仅仅为了配置芯片或者低速读点数据,IO模拟戳戳有余

有时,板子设计时,I2C我会安排在硬件I2C端口上,但软件还是用模拟

我更喜欢用SPI,中高速场合都能实用,再快得上并口

回复 支持 反对

使用道具 举报

发表于 2024-2-27 09:40:20 | 显示全部楼层
有没有试过长时间运行,比如连续工作好几天,会不会有死机的情况?我几年前也调通过硬件IIC驱动OLED屏,短时间工作没问题,连续工作几小时就死机了,后来改成IO模拟IIC,连续工作几天都没事。
回复 支持 反对

使用道具 举报

发表于 2024-2-27 11:13:09 来自手机浏览器 | 显示全部楼层
595953427@qq 发表于 2024-2-27 09:40
有没有试过长时间运行,比如连续工作好几天,会不会有死机的情况?我几年前也调通过硬件IIC驱动OLED屏,短 ...

长时间运行得做纠错,防止iic总线锁死。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-27 12:24:18 | 显示全部楼层
595953427@qq 发表于 2024-2-27 09:40
有没有试过长时间运行,比如连续工作好几天,会不会有死机的情况?我几年前也调通过硬件IIC驱动OLED屏,短 ...

试过最长就半天,没试过一直运行,暂时还没遇上死机
回复 支持 反对

使用道具 举报

发表于 2024-2-27 14:20:00 | 显示全部楼层
inthsunshine 发表于 2024-2-26 22:06
stm32的硬件I2C不是有bug吗?I2C多从机的场合不多,很多时候仅仅为了配置芯片或者低速读点数据,IO模拟戳 ...

这个问题st官方给出了解决方案。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 14:16 , Processed in 0.140400 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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