STM32常用协议之IIC协议详解

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

STM32常用协议系列文章


在这里插入图片描述


一、IIC协议简介

1.1 简介

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

1.2 IIC物理层

常见的IIC系统
上图是通信设备常见连接方式,具有如下特点:

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

备注:第5点和第7点,个人目前不是很理解其机理。

1.3 协议层

协议层逻辑框图

1.3.1 IIC基本读写过程

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控制每个时刻的引脚状态,称之为“软件模拟协议”方式。
IIC软件模拟协议

2.1.2 IIC初始化函数

功能:配置IIC的时钟线和数据线

void IIC_Init(void)
{
   
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值