1. oled屏幕的接口IIC
应用场合:
2.IIC通信原理
概念:
IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让嵌入式系统或手机用以连接低速周边设备而发展。I²C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。
IIC:也是一种串行总线,半双工。
IIC是一种主从结构
主从结构的通信,必须有主机发送起始信号,才可以开始进行通信。
IIC总线对工程师的好处:
专有名词:
IIC收发过程:
1 假设微控制器 A 要发送信息到微控制器 B
• 微控制器 A 主机 寻址(包含了读写标志)微控制器 B 从机 (从机要给应答信号)
• 微控制器 A 主机 发送器 发送数据到微控制器 B 从机 接收器
• 微控制器 A 终止传输(终止信号)
2 如果微控制器 A 想从微控制器 B 接收信息
• 微控制器 A 主机 寻址(包含了读写标志)微控制器 B 从机
• 微控制器 A 主机 接收器 从微控制器 B 从机 发送器 接收数据
• 微控制器 A 终止传输
IIC总线时序
IIC总线时序
硬件组成:
SDA 和 SCL 都是双向线路
SDA:根据数据传输配置输入或者输出---开漏输出
SCK:复用推挽输出(硬件IIC)
SCK:通用推挽输出(软件(模拟)IIC)
传输速率:
I2C 总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达 3.4Mbit/s 。
传输方式:按位传输(内部传输,主机或者从机内部)
数据的有效性:
SDA 线上的数据必须在时钟的高电平周期保持稳定 数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变
时钟为高电平,只能传输数据
时钟线为低电平,只能切换要传输的数据
起始信号和停止信号:
起始信号的状态:
时钟线为高电平的时候,数据线由高拉低
停止信号的状态:
时钟线为高电平的时候,数据线由低拉高
传输数据
发送到 SDA 线上的每个字节必须为 8 位 每次传输可以发送的字节数量不受限制 每个字节后必须跟一个响应位 首先传输的是数据的最高位 MSB
数据宽度:8bit
响应位:是否正确应答
响应:
时钟为高电平的时候,数据线输出稳定的低电平
单个数据发送的应答信号:
仲裁机制:
所有主机在 SCL 线上产生它们自己的时钟来传输 I2C 总线上的报文 数据只在时钟的高电平周期有效因此 需要一个确定的时钟进行逐位仲裁
从设备的地址格式:
7bit+读写标志位=8位
写操作:低电平
读操作:高电平
数据传输帧格式:
主机 发送器发送到从机 接收器 传输的方向不会改变
在第一个字节后 主机立即读从机
OLED屏幕介绍:
OLED屏幕的基本特性:
大小:0.96寸(对角线)
分辨率:128*64(0.96寸的屏幕上总共有128*64个像素点)
像素点:成像的最小单位
单色屏:由两种颜色组成,背景色和前景色都是只有一种,黑白 黑和蓝......
像素点大小:1bit 0或者1
多色屏幕中像素点的颜色显示格式:RGB565 RGB888
RGB565的颜色显示格式:一个像素点大小就是2字节
OLED屏幕的IO口:
写操作:
保存的图像或者字符在OLED屏幕中保存方式:
128*64---像素点个数
长度128个像素点(128列)
高度64像素点(64行)
PAGE0(com0--com7)--第0页(0--7行)
因此我们的屏幕中就有8页。
指令部分:数据手册27页
IIC通信接口,只负责发送或者接收数据
比如:我需要在屏幕的第二行去显示字符,首先设置显示起始位置,因此我们在操作显示屏幕的时候,需要先发送指令,告诉从设备,主机先要执行那些操作。
代码编写部分:
软件IIC编写代码:
IIC通信连接在单片机的哪些IO口上:
PA6--CLK---通用推挽输出
PA7--SDA--开漏输出(只能输出低电平,无法输出高电平(是一个高阻态))
为什么不用推挽???
1.我们使用开漏输出,需要外界上拉电阻,IO内部结构中有上拉
2.选择开漏是因为,SDA数据线,还需要去接收从设备数据(输入)
这时如果设置成推挽,从设备给主机发送数据,此时主机还在输出,有可能产生短路
如果设置成开漏,当设备输入的时候,就可以直接检测外界的电平状态
内部上拉能力不够???这个时候就需要外接上拉电阻。
以上两个IO口为例,进行代码编写
1.参考官方提供的例程代码
参考文件内容:
将以上OLED驱动和字体内容添加到工程
有一个错误需要修改:
显示字符串:
因为font.c中已经将全部的英文字符取模
全部是根据ASCII表格进行取模处理
直接网页搜索取模工具,也可以在线取模