GD32F103RCT6/GD32F303RCT6(7)IIC实验,以驱动四针OLED为例

       本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发
       以GD32F103RCT6-TIME0高级定时器-检测CH1,CH2,CH3通道是否开启为例
       后续项目主要在下面该专栏中发布:
      手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客
       感兴趣的点个关注收藏一下吧!
       电机驱动开发可以跳转:
手把手教你嵌入式国产化-实战项目-无刷电机驱动(1)-CSDN博客
       BMS电源系统开发可以跳转:暂未放链接

 向上代码兼容GD32F303RCT6中使用

本项目配套开发板:

       基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板

       图片:

2f316f857c064009a990f71e2cce0b04.jpeg

       原理图以及例程请联系客服获取!

注意:

        本教程致力于解决所有在调试中出现的所有问题,如有未包含在的问题,请联系QQ:2049363803,有奖更新文档!

目录

内部集成电路总线接口(I2C)

OLED介绍

一、四针OLED显示屏

二、七针OLED显示屏

SDA 线和 SCL 线

开始与停止信号

I2C 通讯流程 

内部集成电路总线接口(I2C)

       I2C (内部集成电路总线)模块提供了符合工业标准的两线串行制接口,可用于 MCU 和外部 I2C

设备的通讯。I2C 总线使用两条串行线:串行数据线 SDA 和串行时钟线 SCL。

       I2C 接口模块实现了 I2C 协议的标速模式和快速模式,具备 CRC 计算和校验功能、支持

SMBus(系统管理总线)和 PMBus (电源管理总线),此外还支持多主机 I2C 总线架构。I2C 接口

模块也支持 DMA 模式,可有效减轻 CPU 的负担。

OLED介绍

  1. 有机发光二极管(OLED)技术:OLED显示屏采用有机发光二极管作为发光单元,这些有机材料可在电流刺激下发出光。相比液晶显示屏,OLED不需要背光源,因此可以实现更薄、更轻、更节能的设计。
  2. 自发光原理:OLED显示屏具有自发光特性,每个像素点都可以独立发光,实现真正的黑色和高对比度的显示效果。此特性使OLED显示屏在显示深色和对比明显的图像时表现出色彩更加生动、细节更为清晰的特点。
  3. 驱动方式:OLED显示屏可以采用不同的驱动方式,包括被动矩阵(Passive Matrix)和主动矩阵(Active Matrix)两种。主动矩阵驱动方式通常采用TFT(薄膜晶体管)技术,可以实现对每个像素点的精细控制,有利于提高显示质量和响应速度。
  4. 灵活性:相比传统显示技术,OLED显示屏具有更高的灵活性和可塑性,可以制作成弯曲的、卷曲的或透明的显示屏,适用于更多的创新设计和应用场景。

        OLED显示屏是一种采用有机发光二极管作为发光单元的显示技术,具有自发光、低功耗、高对比度和快速响应等优点。 根据接线方式的不同,OLED显示屏可以分为四针和七针两种。

一、四针OLED显示屏

       1. 接线方式:四针OLED显示屏通常由VCC、GND、SDA和SCL四个引脚组成,其中VCC和GND用于供电,SDA和SCL用于数据传输。

       2. 特点:四针OLED显示屏通常采用I2C通信协议,具有简单的接线方式和易于控制的特点。

       3. 优势:I2C通信协议不需要额外的引脚来传输数据,能够降低设备的成本和复杂度。

       4. 应用领域:四针OLED显示屏适用于小型电子设备中,如智能手表、手持设备等。

二、七针OLED显示屏

       1. 接线方式:七针OLED显示屏通常由VCC、GND、SCK、SDA、RES、DC和CS七个引脚组成,其中SCK和SDA用于数据传输,RES用于复位,DC用于数据/命令选择,CS用于片选。

       2. 特点:七针OLED显示屏通常采用SPI通信协议,具有高速传输和更丰富的功能选择。

       3. 优势:SPI通信协议能够实现高速数据传输,适合在需要快速响应的设备中使用。

       4. 应用领域:七针OLED显示屏适用于大型电子设备中,如工业控制、汽车显示屏等。

       根据不同的接线方式,四针和七针OLED显示屏在应用场景和特点上有所区别,用户可以根据具体需求选择合适的显示屏类型以实现更好的显示效果和控制体验。

本小结涉及到的IIC函数

函数

作用

IIC_Init();

初始化IIC的IO口

IIC_Start();

发送IIC开始信号

IIC_Stop();

发送IIC停止信号

IIC_Ack();

IIC发送ACK信号

IIC_NAck();

IIC不发送ACK信号

IIC_Wait_Ack();

IIC等待ACK信号

IIC_Send_Byte();

IIC发送一个字节

IIC_Read_Byte();

IIC读取一个字节

本小结涉及到的OLED函数

函数

作用

OLED_Init();

OLED初始化函数

OLED_Clear();

OELD清屏

OLED_DrawPoint();

OLED画点函数

OLED_Fill();

OLED填充函数

OLED_ShowChar();

显示一个字符

OLED_ShowNum();

显示特定位数整数

OLED_ShowString();

显示字符串

主要特征

  • 并行总线至 I2C 总线协议的转换及接口;
  • 同一接口既可实现主机功能又可实现从机功能;
  • 主从机之间的双向数据传输;
  • 支持 7 位和 10 位的地址模式和广播寻址;
  • 支持 I2C 多主机模式;
  • 支持标速(最高 100 kHz)和快速(最高 400 kHz);
  • 从机模式下可配置的 SCL 主动拉低;
  • 支持 DMA 模式;
  • 兼容 SMBus 2.0 和 PMBus;
  • 两个中断:字节成功发送中断和错误事件中断;
  • 可选择的 PEC (报文错误校验)生成和校验;

内部结构图

bfe2a87bbf994f748f2ae03b9fff9a12.png

手册P434页

发送器

       发送数据到总线的设备

接收器

       从总线接收数据的设备

主机

       初始化数据传输,产生时钟信号和结束数据传输的设备

从机

        由主机寻址的设备

多主

        多个主机可以尝试在不破坏信息的前提下同时控制总线

同步

        同步两个或更多设备之间的时钟信号的过程

仲裁

        如果超过一个主机同时试图控制总线,只有一个主机被允许,且获胜主机的信息不被破坏,保证上述的过程叫仲裁

SDA 线和 SCL 线

       I2C 模块有两条接口线:串行数据 SDA 线和串行时钟 SCL 线。连接到总线上的设备通过这两

根线互相传递信息。

        SDA 和 SCL 都是双向线,通过一个电流源或者上拉电阻接到电源正极。当总线空闲时,两条

线都是高电平。连接到总线的设备输出极必须带开漏或者开集,以提供线与功能。I2C 总线上

的数据在标准模式下可以达到 100 kbit/s,在快速模式下可以达到 400 kbit/s,。由于 I2C 总线

上可能会连接不同工艺的设备(CMOS,NMOS,双极性器件),逻辑‘0’和逻辑‘1’的电平并不是

固定的,取决于 VDD 的实际电平。   

       手册P434页

开始与停止信号

       所有的数据传输起始于一个 START 结束于一个 STOP(参见17-3. 开始和停止信号)。

       START信号定义为,在 SCL 为高时,SDA 线上出现一个从高到低的电平转换。

       STOP 信号定义为,在 SCL 为高时,SDA 线上出现一个从低到高的电平转换。

a123691617a349bd84d5f89eccfaec50.png

I2C 通讯流程 

       每个I2C设备(不管是微控制器,LCD驱动,存储器或者键盘接口)都通过唯一的地址进行识别,根据设备功能,其既可以是发送器也可作为接收器。

       I2C从机检测到I2C总线上的START信号之后,就开始从总线上接收地址,之后会把从总线接收到的地址和自身的地址(通过软件编程)进行比较,当两个地址相同时,I2C从机将发送一个

确认应答(ACK),并响应总线的后续命令:发送或接收所需数据。此外,如果软件开启了广播

呼叫,则I2C从机始终对一个广播地址(0x00)发送确认应答。I2C模块始终支持7位和10位的

地址。

       I2C主机负责产生START信号和STOP信号来开始和结束一次传输,并且负责产生SCL时钟。

cee3e1be85644a35a444ae5d9e037c2c.png

       本小结我们以软件IIC驱动OLED为主,因此我们在硬件IIC上不做过多介绍;基于上述知识,我们开始去编写IIC通讯协议!

       首先我们需要对使用到的模拟IIC时钟线SCL以及SDA进行初始化配置

27548e9dda7a4bf4932f309de7c8eb71.png

        其次开始编写软件延时函数,这里我们直接调用前面一节的系统滴答定时器的延时函数

efebb9becdfb480b81f90ac22e1367a6.png

       那么接下来让我们开始编写IIC的起始信号

7ebd9c78c0da433284d52d1187f53567.png

       然后是停止信号

9f86711a1185475fb03222e6fc43a562.png

       接下来在有了起始信号和停止信号后,该考虑应答信号了,应答信号是IIC通讯必不可少的一部分,是IIC的心脏

510f7688a62444d58172dc3c675c98d7.png

7e141f69971f4f01b0b5295fae68d9a7.png

3283cf1398e0456e811ba97dc5c1d0c1.png

       接下来,在有了IIC通讯时序的基础上,我们开始编写发送数据以及读取的函数

f7f8eaefbc3b493881401db11972662e.png

2064e39cdd4f481c8b9dfab08fb61693.png

cb7f6124d2ce4fb589fab8e04a68c7eb.png

       那么到此我们IIC的时序函数就已经全部写好了,这里出现的

       IIC_SCL(x)

       IIC_SDA(x)

       我们在oled.h文件中有定义

08137447018f49b4a6d7ce76e5bbc644.png

        作用是操作GPIO

       接下来让我们去编写IIC的操作函数

       我们所要用到的函数可以参考中景园0.96OLED的STM32代码例程里面的函数

44c3aec4a7c943e49c0d656708b12354.png

010fcc4bc2c144098f7ec8a420dbb474.png

179cd15f4a274b0689300f3d0f2f866f.png

c0e8c8a3c8ac4354a8b53da278485027.png

f7d6229103fa40d69c9b284b4b10cfc5.png

116ac8a4a9f44d219aa95981a93ae618.png

3f21d048aa064430923189b3b9743858.png

02a1404175a947c0a768b667f62dc817.png

65ac4bf2cf4243c0b36678dee9a7b69e.png

       然后在主函数中进行调用

3401e02cd30e489c8cee5a31ee27f403.png

       实验完成结果

469d1cfb9181417782b1f65ee94c3380.jpeg

群号:621154399

有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。​​​​​​​

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不及你的温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值