STM32库函数版IIC驱动OLED屏

概述

因为毕设,又得重新拾起嵌入式知识了,之前主要用51单片机,当年直接copy的代码,对很多东西不求甚解,这次用STM32重头梳理一遍,本文会讲解IIC和OLED的部分原理。能力有限,有错误请指出。

需要程序自动跳最后面,有网盘链接,亲测可用。

IIC通信协议

IIC通信物理连接时非常方便,只有两根数据线:SCL和SDA,具体操作步骤直接读时序图就可以理解,非常的方便。
SDA:SerialData的缩写,主要就是通信中数据传输。
SCL:Supply Chain Logistic缩写(来源百度百科),主要用来决定数据收发的。
我个人觉得有错,应改为:SerialClock,所有人都称呼这个是时钟线唉!难道不是时钟的缩写嘛!!!毕竟SCL的作用就是决定数据何时传递的,难道不应该理解为时钟嘛?

IIC的主要使用,需要配合时序图使用:(这里参考野火的教程里的图)
在线链接: STM32库开发实战指南-刘火良;杨森-微信读书.
IIC时序
起始信号的关键在于,SCL和SDA都在高电平时,SDA的下降,因此体现在代码中:

#define OLED_GPIO GPIOB
#define OLED_SCL GPIO_Pin_6//这是我的SDA和SCL引脚
#define OLED_SDA GPIO_Pin_7

#define OLED_SCL_LOW() GPIO_ResetBits(OLED_GPIO,OLED_SCL)//SCL高低电平
#define OLED_SCL_HIGH() GPIO_SetBits(OLED_GPIO,OLED_SCL)

#define OLED_SDA_LOW() GPIO_ResetBits(OLED_GPIO,OLED_SDA)//SDA高低电平
#define OLED_SDA_HIGH() GPIO_SetBits(OLED_GPIO,OLED_SDA)

//IIC,起始信号时序,SCL高电平,SDA由高到低,然后SCL也变低,数据开始传输
void I2C_Start(void)
{
	OLED_SDA_HIGH();
	OLED_SCL_HIGH();
	OLED_SDA_LOW();
	OLED_SCL_LOW();
}

同理,停止信号也是这样写的:

void I2C_Stop(void)//同理,看时序图
{
   OLED_SCL_HIGH();
   OLED_SDA_LOW();
   OLED_SDA_HIGH();
}

起始都设计好了,那么数据怎么传输?
IIC时序图2
注意时序图,SCL由低到高时,并保持在高电平的时候,数据才有效,
那么开始思考,数据怎么传,我是一大段数据一口气发出去?还是一位一位发送?
一大段传的话,个人没有太好思路。有会的可以指导我一下。
下面是代码:

void Send_Byte(uchar data)//写入一个字节
{
	uchar i;
	for(i=0;i<8;i++)
	{
		OLED_SCL_LOW();//将时钟信号设置为低电平
		if(data&0x80)//将dat的8位从最高位依次写入,也就是一位一位写,每写一位,数据左移一位
		{
			OLED_SDA_HIGH();
    }
		else
		{
			OLED_SDA_LOW();
    }
		OLED_SCL_HIGH();//将时钟信号设置为高电平
		OLED_SCL_LOW();//将时钟信号设置为低电平
		data<<=1;
  }
}

为什么这里用0x80呢?,0x80,转换成二进制为:1000 0000 ,数据于0x80进行“与运算”,并保持SDA为高电平,因为与运算的话,只有第一位能保留下来,比如:7|0x80 ,过程为:0111|1000 0000 ,结果为:1000 0000 ,然后数据左移一位,继续,直到数据走完,那么一个SDA高电平中就存了7这个数。

,那么一个数据发送完后,我该换下一个值了,但还要继续接收数据上虽然没值了,但如果我传的还是高电平怎么办?继续传的你还收不收?你是等待下一个数据发过来哈斯还是结束?这个时候就需要等待状态来了,(TNND!这水印怎么去!!!,下面水印挡住的文字是:等待响应)
等待

void I2C_WaitAck(void) //等待信号的电平
{
	OLED_SCL_HIGH();
	OLED_SCL_LOW();
}

至此,IIC通信你大致了解了基本逻辑,接下来就是配合硬件了

OLED屏(兼下载链接)

0.96寸OLED屏,驱动IC为:SSD1306;
多有代码都围绕这个进行编写,我目前看的代码少,暂时来说中景园的代码和资料就非常NICE,非常适合初学者读和思考,这里我直接放资料了:
链接: https://pan.baidu.com/s/1KZN-d0wCnlVR_jEqLZSPVw
提取码:4kej
代码和资料都在里面。

优点:代码是51改的,非常通俗易懂,学过51必看懂,
缺点:冗余,很多没必要的代码段在里面。里面说是IIC代码,实际还是SPI,只不过只用到了SDA和SCL两个引脚,其他没用,可以删除。
当然,好处就是7pin的SPI的oled也可以照葫芦画瓢。
后续我会将我修改完的(改了一半,没改完,就先不放出来了,后续改完会发github上。)
暂时就这。

参考资料:
STM32库开发实战指南-刘火良;杨森
中景园电子OLED淘宝店参考资料

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值