提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
STM32常用协议系列文章

一、IIC协议简介
1.1 简介
IIC(Inter - Intergrated Circuit)总线是由Philips公司开发,工作方式是半双工、同步、串行传输。虽结构简单【两条双向信号线SDA和SCL】,但其传输距离较短,传输速率较低一般为几百kbps左右。主要用于低速场合、小数据量场合。因计算机科学中,大部分复杂问题可以通过分层的思想进行简化。这里也以分层的方式来理解,对待协议最基本的分层方式是将其分为物理层和协议层。其中,物理层规定通信中具有机械、电子功能特性,确保原始数据在物理媒体中的传输。协议层主要规定通信逻辑,统一收发双方的数据打包、解包标准。套用火哥的话来说就是:“物理层规定是用嘴巴还是肢体来交流,而协议层是规定我们是用英文还是中文来交流。”
1.2 IIC物理层

上图是通信设备常见连接方式,具有如下特点:
- 一个支持多设备的总线【总线:指多个设备共用的信号线】。在一个IIC通信总线中,可连接多个IIC通信设备,支持多个通信主机和多个通信从机。
- 一个IIC总线有且只有两条总线【SCL总线和SDA总线】,SCL总线:串行时钟总线,用于同步数据收发;SDA总线:双向串行数据线,用于表示数据。
- 连接到总线上的设备都有一个独立的地址,因此,主机通过寻址的方式对不同设备进行访问;
- 总线通过上拉电阻连接到电源。当IIC设备空闲时,会输出**高阻态**,而当所有设备都空闲,都输出高阻态时,上拉电阻把总线拉成高电平。而当连接到总线上的任一器件输出低电平时,都将使总线的信号变低,可知各器件SDA及SCL都是线“与”关系。
- 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
- 具有3种传输模式:标准【100kbps】、快速【400kbps】和高速【3.4Mbps】(目前大多设备并不支持该高速模式)。
- 连接到相同总线的IC数量受到总线的最大电容400pF限制。
备注:第5点和第7点,个人目前不是很理解其机理。
1.3 协议层

1.3.1 IIC基本读写过程

主机写数据到从机中
- step 01:由主机的IIC接口产生并传输起始信号(S)到总线上,此时连接到总线上的所有从机都会接到这个信号。【备注:同一时刻只能有一个主机】
- step02:起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号【该地址可以是7位也可以是10位】,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,而没被选中的设备将会忽略之后的数据信号;在选择完从机地址位后,需要选择传输方向,这里是写数据,所以该位置‘0’。
- step03:从机在接收到匹配地址后,会返回一个ACK信号或NACK信号给主机。
- step04:主机在接受到ACK信号之后,便可以发送数据了【每次只能发送一个字节】。
- step05:等待从机接收后,发送应答ACK信号给主机。
- …N个数据【N没有限制】…
- stepn:从机返回NACK信号时,主机向从机发送停止信号; 或主机发送数据后,不用管从机,直接向从机发送停止信号。
主机读数据到从机中
与主机写数据到从机中的步骤大致相同,差异如下:
- 第一点:传输方向,读数据【传输位应该置’1’】
- 第二点:当主机希望停止接收数据时,需要向主机返回一个非应答NACK信号,则主机会发送停止信号给从机。但从机在未得到主机的NACK信号时,却无法发送停止信号【不具有发送停止信号的权利】。
主机读和写数据【IIC复合格式】
与前两者的差异较大,差异如下:
- 该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过SLAVE ADDRESS寻找到从设备后,发送一段“数据”【这段数据通常是从设备内部的寄存器或寄存器地址】;在第二次传输中,才会对该地址的内容进行读或写。也就是说:第1次通信是告诉从机读写地址,第2次则是读写的实际内容【后续会有实验进行说明】。
1.3.2 通信的起始和停止信号
- 起始和停止信号一般由主机发送
- 起始信号:SCL为高电平信号时,SDA由高电平切换为低电平,表示通信的开始;
- 停止信号:SCL为高电平信号时,SDA由低电平切换为高电平,表示通信的结束;

1.3.3 数据有效性

IIC使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每个时钟周期传输一位数据,如上图所示。传输时,SCL为高电平的时候,SDA表示的数据有效,即此时的SDA为高电平则表示数据为“1”,反之则为“0” 。而当SCL为低电平的时候,SDA表示的数据无效,一般这个时候SDA进行数据切换,为下一个要表示的数据做好准备。至于为什么要在这个时候切换,联想之前的开始和停止信号。
1.3.4 地址及数据方向

- IIC总线上的每个设备都有自己的独立地址;
- SLAVE ADDRESS可以是7位或10位,通常情况下7位使用更为频繁;
- 数据传输方向位:1表示读 / 0表示写
- 读数据方向时,主机释放SDA总线由从机控制SDA总线,主机接受信号; 写数据方向时,SDA由主机控制,从机接收信号
1.3.5 响应

IIC的数据和地址传输都带有响应【ACK和NACK两种信号】,作为数据接收端时,当设备(无论住从机)接收到IIC传输的一个字节数据或地址后:
- 若希望对方继续发送,则需要向对方发送“应答ACK”信号,发送方会继续发送下一个数据;
- 若希望结束数据传输,则需要向对方发送“非应答NACK”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
二、IIC特性
NOTE: 本节主要引自于大佬 果果小师弟 的文章
2.1 软件模拟协议
2.1.1 引言
若我们直接控制STM32的两个GPIO引脚,分别用作SCL和SDA,按照上述信号的时序要求,直接像控制LED那样控制引脚的输出(若是接收数据时,则读取SDA电平),就可以实现IIC通信。对于USART同样,也能实现USART通信。所以只要遵守协议,就是标准的通信,不管如何实现它,不管是ST生产的控制器函数ATMEL生产的存储器,都能按通信标准交互。这种直接控制GPIO引脚电平产生通信时序时,由CPU控制每个时刻的引脚状态,称之为“软件模拟协议”方式。

2.1.2 IIC初始化函数
功能:配置IIC的时钟线和数据线
void IIC_Init(void)
{

本文深入讲解IIC协议的工作原理,包括其物理层和协议层特性,探讨软件模拟和硬件实现方式,并通过实验验证理论知识。
最低0.47元/天 解锁文章
1970

被折叠的 条评论
为什么被折叠?



