嵌入式开发学习日志40——stm32之I2C协议层

在了解完I2C的物理层之后,就要正式开始转入协议层了,这一部分可以说涵盖了I2C绝大部分的功能原理,掌握了它才算真正触及了I2C的核心。

I2C定义了通信的数据有效性、起始与停止信号等环节,根据其要求,通信过程被划分为发送起始信号------寻址------数据传输------发送停止信号。

首先来看数据有效性规定,根据上一章所述,I2C总线有两根线,一根数据线,一根时钟线,数据的读写正是根据这两根线的电平高低关系来决定的。SCL(时钟线)保持高电平期间,是进行数据的读取操作的时间,此时的SDA(数据线)上的电平不能发生改变。当SCL电平是低电平时,才能够使SDA上的电平发生变化,此时就会进行数据的写操作。

关于起始与终止信号,I2C也是通过SCL与SDA上的电平变化来决定的。SCL此时需要保持高电平,而SDA由高电平变为低电平时,这一变化会表示起始信号,SDA由低电平变为高电平时,会代表停止信号。

之前提到过,主机会通过总线对从机进行寻址后,进行数据的读写操作,那么在从机接收完某次传递数据或者主机读取完某次的数据后,要如何告诉主机(从机)接下来是停止进一步传输还是继续传输呢?

答案很简单,I2C通过应答响应来解决这个问题。

什么是应答响应?通俗点来说,其实可以看作数据传输时紧跟着的特殊校验位,这里也称应答位。在主机控制SDA拉低电平产生起始信号后,若一直处于低电平状态,释放SDA,由从机控制,此时就会在主机与从机之间进行数据传输。当一段数据发送完后,如果从机主动拉低电平,那么说明从机可以继续接受数据,此时就会产生应答信号,主机在接收到这一信号后就会继续发送数据。

当然,如果从机不想再接收数据时,可以保持高电平,此时主机就会接收到非应答信号,那么主机就会拉高电平,发出终止信号终止数据的进一步传输。

当然,要实现上述功能,首先主机得寻址到从机才行,I2C提供了7位从机地址和10位从机地址,但一般常使用7位。说是7位寻址,实际上传输的寻址位后还要加上一个方向位,方向位写0,表示主机向从机写数据,1则是从从机里面读取数据。

寻址成功时,从机也会向主机发送一个应答信号(ACK),如果应答失败,那么需要看看从机的地址是否出错?如果没有出错,那可能从机正繁忙,无暇接收信号。最坏的情况可能就是从机故障。

说到这,其实I2C的数据传输方式也是呼之欲出了。

根据情况的不同,大抵可以分为三种形式。

第一种是主机向从机发送数据。首先由主机拉低电平产生起始信号,并且后面紧跟从机的地址进行寻址,此时地址位后写0。当从机被寻址到并且可以接收时,会返回应答信号,此时由主机向从机传输数据,如果从机满了或者不想再接收时,就会在某次接收完数据后返回非应答信号(NACK),此时主机就会拉高电平,产生停止信号。

第二种是主机从从机读取信号,这个过程和写数据大差不差,只是寻址时方向位写1,同时应答信号与非应答信号都由主机发送给从机。

第三种就是两者的综合,以先写再读为例,读和写的流程都和上面差不多,但是要注意,二者的连接需要重新发送起始信号,同时再次寻址,用方向位来改变操作。

读到这,那么恭喜你,你对I2C的工作方式已经有了大致的了解,剩下的就是多做题目熟练即可。

相关推荐
来生硬件工程师4 小时前
【STM32笔记】:P03 ISP 一键下载电路详解
c语言·笔记·stm32·嵌入式硬件·硬件工程·接口隔离原则·硬件设计
ha20428941944 小时前
Linux操作系统学习之---线程控制
java·linux·学习
Laplaces Demon6 小时前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
可爱的鸡仔6 小时前
STM32--------ADC转换
stm32·单片机·嵌入式
青衫码上行6 小时前
【从0开始学习Java | 第22篇】反射
java·开发语言·学习
hmbbcsm7 小时前
python学习之路(四)
学习
Greedy Alg7 小时前
Socket编程学习记录
网络·websocket·学习
知识分享小能手7 小时前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app
DuHz7 小时前
C程序中的数组与指针共生关系
linux·c语言·开发语言·嵌入式硬件·算法