香橙派开发系列-点亮OLED显示屏

前言

我因为没买屏幕所以一直都是用ssh来远程连接,但是这会出现一个问题,香橙派的IP地址是动态的,它每隔一段时间就会换一下IP地址,而每次换IP地址后原来的IP地址就失效了。虽然可以固定IP地址,但是我觉得在每次开机直接通过一块OLED显示屏将IP地址显示才是最好的。

一、IIC协议

我这里使用的是0.96寸OLED IIC协议的显示屏,是之前做外包剩下的,所以直接拿来用一下,在网上9块钱可以整一块

这块显示屏是IIC协议的,所以我们需要先了解一下IIC协议,虽然香橙派中IIC协议是有硬件程序,但我们也是需要了解一下这个协议。

1.IIC协议的组成

IIC协议要顺利运行是需要两个东西一起工作才可以实现,第一个是SDA,也就是数据引脚,这个引脚是负责传输数据信息的。第二个是SCL,时钟引脚,用来传输时钟信息的。

时钟引脚是按照一定的频率来进行震荡的,这样才能为从机提供时钟信息,也是为了让主机和从机按照一定的频率来进行数据交互。

数据引脚是可以让从机和主机进行数据交换的,这个引脚可以传输命令或者是数据。

2.IIC的时序图

了解了这两个引脚后我们就可以看一下时序图来了解什么时候该传输什么信息。

img

可以看到一开始主机需要发送一个start信号,也就是起始信号,发送完其实信号后发送了一个控制信息MSB,然后由MSB控制信息决定是读取命令/数据还是写入命令/数据,然后就开始传输数据,当传输完成后主机或者从机就会发送一个ACK响应信号。

如果一开始是主机向从机发送数据或者命令,那从机会发送一个ACK响应信号。

如果一开始是从机向主机发送数据或者命令,那主机需要发送一个ACK响应信号。

然后传输完成后发送了一个stop结束信号,当这个信号发送了后,说明一次的IIC协议就传输完成。

接下来好好分析一下IIC的这些内容。

3.IIC起始信号和结束信号

先将这两个信号单独拿下来分析。

首先看一下起始信号

img

可以看到起始信号是时序图很简单,让SCL时钟信号保存高电平,然后SDA数据信号有一个从高到低的下降沿,代码我们就可以这么写:

1
2
3
4
5
digitalWrite(SCL, 1);
digitalWrite(SDA, 1);
digitalWrite(SDA, 0);
digitalWrite(SCL, 1);
digitalWrite(SCL, 0); // 为传输数据做准备

这样就可以启动IIC协议,当然,我们今天的重点不是用软件模拟IIC协议,所以上面的代码仅供参考,毕竟还有时间的问题。

然后再来看看结束信号

img

结束信号也是很简单,让SDA从低到高有一个上升沿,SCL一直保持高电平即可,代码就可以这么写:

1
2
3
4
digitalWrite(SCL, 1);
digitalWrite(SDA, 0);
digitalWrite(SDA, 1);
digitalWrite(SCL, 1);

这样就可以结束这一次的IIC协议。

4.控制信息

控制信息是主机来选择控制的从机是发送数据还是接收数据的一个操作信息,因为IIC可以支持多从机并联,这个时候就得用地址来区分控制的设备了。

控制信息由两个部分组成:

img

一个是从机地址,另一个是传输的数据模式,从机地址是这个设备生产的时候就已经写入进去了,如果你需要多个不同的从机地址,你可以去找厂商去更改一下,OLED显示屏的地址是0x78

数据模式就是在控制信息后是读取命令数据还是写入数据命令,如下表:

说明
1 读取
0

比如说我们这写入数据,那代码就如下:

1
2
3
4
5
6
7
8
9
10
11
void readDataStart(){
int i;
unsigned char address = 0x78;
for (i = 0; i < 8; i++){
digitalWrite(SCL, 0);
digitalWrite(SDA, (address << i & 0x80)); // 从高位开始传递
digitalWrite(SCL, 1);
digitalWrite(SCL, 0);
}

}

如果是需要读的话,地址就改为0x79

img

这个就是传输数据的时序图,当SCL上升沿后,就会把SDA的数据传输过去。

5.传输数据或者命令

在传输帧中,因为要区分命令或者数据,所以一开始需要传输一个标志来区分出后面的数据是命令还是地址,这个传输帧如下:

img

如果我们要传输数据,那这先得传输一个0x40,如果是一个命令,那传输0x00,传输完成后就可以传输要传递的数据了。

根据这个就可以写出传递数据的函数了:

1
2
3
4
5
6
7
void sendData(){
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); //从机地址
OLED_I2C_SendByte(0x40); //写数据
OLED_I2C_SendByte(Data); // 要传输的数据
OLED_I2C_Stop();
}

这些是封装好了的函数,等后面会写的。

二、香橙派的硬件IIC

在香橙派中是有IIC这个硬件协议的,并且在wiringPi库中也是有对应的函数的,所以我们可以直接使用硬件的IIC来完成我们的项目,但是要使用IIC就需要在设置中将其打开,打开的方式很简单。

首先在命令行中输入

1
sudo orangepi-config

然后就进入到设置页面,在这个页面只能用键盘来进行操作,回车是确定,空格是选择

img

然后选择System后按下回车,就进入下面的界面

img

然后用方向键移动到Hardare后按下回车,就可以进入一些功能设置界面了

img

可以看到有很多的功能,这里我们需要使用到IIC所以就只打开IIC,需要注意一下,这里有3个IIC,这3个对应着不同的引脚,下面的引脚图可以参考

Pi3的GPIO引脚

img

zero 3的GPIO引脚

img

我们着选择m1就行了,选择完成后就可以回车了,然后让我们重启一下,当重启完成后再按照上面的办法进行打开来查看一下是否打开成功。

三、Pi3的OLED驱动代码

这里说一下如何编写OLED的驱动代码。