我回来啦!
呃,已经很久没有更新博客了,因为都在自己吃独食(bushi)。即使太懒了,学了快一年了算是入了门吧,最近有好几个人问我“东墙东墙,这屏幕又好看又精巧要怎么用呢?”于是我想要不就写一篇自己对IIC和OLED的认识来给大伙整一篇博客吧!
单片机搭载外设
不要拘于买来的开发板上所带的一些东西比如数码管啊这些,因为以后你要接触更多不一样的器件!所以你应该要学会怎么去使用外设,也就是说你要知道怎么去操纵这个外设的寄存器地址之类的!这是必经之路!
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
IIC协议
要按官方话说那就有点乏了,我想这么说不太合适就是复制粘贴呗,那我就按自己的理解来说。(如果要具体可以自行搜索)
把IIC通讯系统看成是“父”,那么连接于它之下的多个IIC通讯设备我称为“子”。而一个父可以有很多很多的子,但子只有一个父。而收发数据呢就像是父子之间互相给钱,两只手串行数据线(SDA)给数据也就是钱,而串行时钟线(SCL)是告诉对方同步收发也就是告诉对方自己什么时间合适拿钱。而每个子呢又有不同的住处(也就是他们的地址),父就要根据不同的门牌号来知道是哪个子。
IIC协议有起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
读写过程
解释下上图的含义:
划线的格子:主机传给从机数据
白格子:从机把数据传给主机
S:传输开始信号(Start!就是主机告诉那些从机们:我要开始传消息啦!)
SLAVE_ADDRESS: 从机地址(主机告诉大家要和谁讲话,所以点名哪个的地址)
R/W- :传输方向选择位,1 为读,0 为写(就是主机要和你讲话还是听你讲话)
A/A- :应答 (ACK) 或非应答 (NACK) 信号(主机听到没有你说的话)
P :停止传输信号(差不多得了😅)
根据字面意思不难理解各个的含义,其实就是人与人说话聊天一样。
通讯时的时序图
通过对SDA与SCL电平高低切换的操作,来实现数据的传输
当 SCL 线是高电平时,SDA线从高电平向低电平切换,此时就是起始信号。当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示停止信号。
(注:起始和停止信号一般由主机产生。)
代码上就是拉高拉低(给1或者0)
大家请看,这幅图上当SCL是高电平的时候,SDA所传的数据是有效的是听得见的,当 SCL 为低电平时,SDA 的数据无效,就是听不见!
应答环节!
Acknowledge!就是应答,大家高中学生物的时候是不是也学过(免疫应答之类的)其实都是差不多意思。若想对方继续发数据,需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
上代码喽
这里就和大家说一下库函数版本吧(但是个人认为大势所趋其实是Hal库)
//起始信号
void I2C_Start(void)
{
OLED_SDIN_Set();
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SCLK_Clr();
}
//结束信号
void I2C_Stop(void)
{
OLED_SCLK_Set();
OLED_SDIN_Clr();
OLED_SDIN_Set();
}
//等待信号响应
void I2C_WaitAck(void) //测数据信号的电平
{
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
//写入一个字节
void Send_Byte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();//将时钟信号设置为低电平
if(dat&0x80)//将dat的8位从最高位依次写入
{
OLED_SDIN_Set();
}
else
{
OLED_SDIN_Clr();
}
OLED_SCLK_Set