看看IIC协议,上面两幅图分别代表的是写和读两种模式。
写数据的时候,先是一个开始标志,然后是输出从机地址,然后是写方向的设置,这时候从机会回答一个ACK信号来响应一下,随后主机主机发送要写入寄存器的地址,从机接收完了回应一下,再发送写入的数据,从机接收完了回应一下,主机发送结束标志,写入过程完成。
读数据的时候,先是一个开始标志,然后是输出从机地址,然后是写方向的设置,这时候从机会回答一个ACK信号来响应一下,随后主机发送要读取寄存器的地址,从机接收完了回应一下。此时主机需要再重新发送一个开始标志,然后发送从机的地址,然后是读方向的设置,随后读取数据,主机接收完了回应一下,主机发送结束标志,读取过程完成。
相信大家都对IIC的传输过程有了一定的了解,那么我们开始对这个过程进行细致化了解~
什么是开始信号?什么是结束信号?如何完成ACK应答?数据是怎么传输的?设备地址是怎么设置的?
SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件。
SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。
处理器发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。这就是应答信号。
SDA上传输的数据必须在SCL为高电平期间保持稳定:因为外接IIC设备在SCL为高电平的期间采集数据方知SDA是高或低电平。SDA上的数据只能在SCL为低电平期间翻转变化。
大家可以画卡诺图去慢慢品味其中的过程。
而设备地址则是在由加入IIC协议的厂商制定的,大都可以看到IIC协议设备有A0等接口,比如MPU6050出厂就有两组地址:0x68、0x69。当我们把A0拉高的时候就是0x69,拉低的时候就是0x68。
IIC协议介绍完了,我们就看看OLED的IIC操作吧。
读写地址分别是0x78和0x79。
每一段数据内容都是先有一个控制位Control byte:0x40是数据,0x00是命令。
然后是n个数据位,代表写入的数据或命令。
当我们会写入数据之后就只管按照命令表进行初始化操作了:
来自SSD1306驱动手册的28页~
具体的初始化就根据需要来配置了。
接下来我们就可以看看oled的驱动函数库了。
写一个字节就是把一个字节的每一位都写入,因为我们的写法是高位在前,所以每次都与上0x80发送完再左移一位。
写数据就是中间的控制位发送0x40 。
而写命令就是中间的控制位发送0x00。
初始化过程就是按照我们的需求写入命令。
在我们使用OLED显示的时候,需要先设置光标,再写入数据~
按照命令格式来就行。
清屏就是把所谓数据位置都写0。
清除指定行就是将指定行的数据全部写0。
显示图片就是把图片的每个像素都显示。
而显示不同大小的字其实就是把字对应的像素图显示出来。
我们的每个字都是转换成点阵存在字库驱动文件里的。
同样的汉字也是一样的图案。
所以如果我们只用简单的英文和数字显示,这里的字库就已经够用了,但是如果我们要显示其他汉字,就要自己写字库了。
字库的制作其实很简单,使用相应的取模软件就可以了。
因为OLED是一个128*64的点阵,64行分为8个页,刚好每个页的高度是8位,为了写入方便,我们的字体基本上都是8bit高或者16bit高的,比如:6*8、8*16、16*16。
而对于每一页来说,又被分成128段,每一段是竖着的8bit,并且高位在下。
看看我们的取模软件~
先在这里输入要取模的字,按ctrl+Enter,屏幕中间就出现了点阵。
取模方式选择C51
参数设置选择纵向取模,字节倒序~
因为刚刚我们也已经说过了,我们的字是竖着8bit开始写的,写完一竖条继续下一竖条。
而字节倒序是因为我们是高位在下,所以方向会反过来。