合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)

251f4be0fd2953cdd2fd2979ac95d832.gif68717d8484c9f9be2b51d25cc4ed1792.png

这是 北航士谔书院 的第 940 篇推送

北航士谔书院X大班提醒您:

道路千万条,学习第一条

不搞单片机,开学两行泪

——新春快乐,我们又回来了!

本文对 I²C 总线的协议做出详细的介绍,并对其在 51 单片机上的应用代码做出解析。

I²C 总线

集成电路间总线(Inter-Integrated Circuit Bus,I²C Bus,读做 I-squared-C 或 I 方 C)是一种连接多个集成电路的总线。它由 Philips Semiconductors(现 NXP Semiconductors)于 1982 年开发。

I²C 总线的特点

  1. 多对多。在单个 I²C 总线上,可以有多个主设备(Master Device)和多个从设备(Slave Device)。主设备通常是单片机,而从设备通常是简单的外围设备(如传感器、单色显示屏),不过从设备也可以是单片机。通信总是由主设备发起并主导。通常我们仅在 I²C 总线上安排单个主设备,本文也只讨论有单个主设备的情形。如果存在多个主设备,那么它们需要进行较复杂的时钟同步和使用权仲裁,在此暂不讨论。

  2. 简单、易实现。I²C 总线仅需两个引脚就可连接多达 112 个设备,而同类总线,如 SPI 等,则需要更多的引脚。I²C 协议简单直接,不需要复杂的逻辑。

  3. 低速。大多数 I²C 设备仅支持在 100 kbit/s 的标准模式(Standard Mode)工作;少数设备最高支持 1Mbit/s 的快速模式+(Fast Mode Plus)。比起其它总线,I²C 的速度是比较慢的。

  4. 短距离。I²C 允许的走线距离较短,它通常被用于同一块 PCB 板上的 IC 间互联。I²C 总线不适用于长距离传输。

I²C 总线的常见应用

I²C 总线通常被用于将低速的外围设备通过短距离的线路连接到微处理器(单片机)上。常见的外围设备有温度传感器、电流电压传感器、单色显示屏等。这些设备结构简单,且传输的数据量很少,因此适用 I²C 总线。需要较高传输速度的设备(如高分辨率彩色显示屏)通常使用更高速度的连接方式(如 SPI)。

I²C 总线的引脚组成及电气连接

一个 I²C 总线由两条总线(Serial Clock, SCL 和 Serial Data, SDA)组成。I²C 总线上的设备都直接连接到这两个总线上(如图所示)。

9a2747cb504ceb39dd65498635403ebf.png

I²C 总线的连接方式。μC 即单片机

所有连接到 I²C 总线的设备均使用开漏(Open-Drain,OD)连接。每个 I²C 设备的电路可以简化为如下图的结构:

3a7a691dc002d81e54a61bd18edf590c.png

开漏连接

可以将每个 P 沟道 MOSFET(MOSFET-P)想象为由单片机内部端口控制的“开关”:

5674b25ced63b53705eae804839c231f.png

开关

可以观察到,如果 I²C 总线上只连接了设备,那么 I²C 总线不可能处于高电平(因为此时总线没有连接到电源 Vdd)。我们需要在 SDA、SCL 与 Vdd 间各增加一个上拉电阻(如上图 Rp),当“断开开关”时,可以得到高电平;当“合上开关”时,可以得到低电平。

f9ecf4562fddbc3309ba2704fd59523f.png

完整的连接示意图

在下文中,我们将合上开关(使相应总线处于低电平)的动作称为“拉低”;断开开关的动作称为“释放”。由于所有设备都并联在总线上,所以若总线上有任意设备拉低总线,总线即处于低电平状态;只有当总线上的所有设备释放总线时,总线才能处于高电平状态。这就是所谓的 Wired-And。

I²C 通信协议概要

空闲状态

I²C 总线处于空闲状态时,所有设备都释放总线,SCL 与 SDA 均处于高电平状态。

起始条件

I²C 总线上的通信总是由主设备(Master)发起。当主设备希望通信时,它就会产生一个起始条件(Start Condition,S),作为开始通信的信号。

起始条件可以描述为:当 SCL 处于高电平时,SDA 由高电平向低电平转换。即,在 I²C 总线空闲状态下,主设备拉低 SDA,代表起始条件,开始一次通信。

在 I²C 协议中,传输总是以帧(frame)为单位进行的。一帧为 8bit,即一字节。主设备和从设备都可以发送帧。

在发送帧时,发送方会逐位 (bit) 发送一字节 (byte) 数据,且先发送最高位(most significant bit,MSB)。例如,如果发送方需要发送 183 = 10110111,则按 1,0,1,1,0,1,1,1(从左到右)的顺序发送。发送一位数据的过程如下:

  1. 主设备首先将 SCL 拉低。

  2. 发送方(主或从)在检测到 SCL 被拉低后,使 SDA 处于相应的电平:如果要发送 0,就拉低 SDA;如果要发送 1,就释放 SDA。

  3. 主设备等待一定的时长后,释放 SCL;此时发送方不改变 SDA 状态。

  4. 接收方在 SCL 为高电平时,读取 SDA 的状态,得到相应数据并存储下来。

发送完一位后,主设备再次拉低 SCL,进入下一个循环,发送方发送下一位数据,接收方读取下一位数据。如此循环 8 次,即完成发送一帧。

在发送完一帧的 8 字节后,主设备会将 SCL 再拉低一次。接收方在检测到 SCL 第 9 次被拉低后:

  • 如果接收当前帧成功,则会将 SDA 拉低,表示自己成功收到了数据,这称作一个 ACK 信号(acknowledgement signal)。

  • 如果没有成功接收当前帧,则在 SCL 为低电平时,接收方不会作出任何动作,而使 SDA 保持在释放状态,这称作一个 NACK 信号(not acknowledgement signal)。NACK 信号并不是“主动发出”的,只要接收方没有作出任何反应,就代表一个 NACK 信号。

如果总线上没有任何设备,或者相应的接收方没有正常工作,则发送方会收到一个 NACK。

edd00741f3eca4d733257aba586e56be.png

I²C 帧的传输流程

可以观察到,在传输帧时,SDA 仅在 SCL 为低电平时发生变化。如果当 SCL 为高电平时 SDA 发生变化,则会构成起始条件或停止条件。

停止条件与重复起始条件

在传输完一帧后,主设备可以选择继续传输帧,也可以选择停止传输,还可以选择从头开始一次新的传输。

如果它希望停止传输,则需要产生一个停止条件(Stop Condition,P),其可以描述为:当 SCL 处于高电平时,SDA 由低电平向高电平转换。

如果它希望从头开始新的传输,则需要产生一个重复起始条件(Repeated Start Condition,Sr)。重复起始条件与起始条件是相同的。

c55159b5a20a7f142e63993f2614d027.png

起始条件和停止条件

SCL、SDA 名称的含义

有同学可能会对 Serial Clock 和 Serial Data 名称的含义感到不解。

SCL 总是由主设备控制,且它以几乎固定的频率切换,因此它被称作 clock。SDA 则负责传输数据,因此被称作 data。

Serial 的含义是“串行”,即同一时间只能发送一位(one bit),而要传输的许多位数据“排队”被传输。与“串行”(serial)相对应的是“并行”(parallel)。并行总线通常由多根数据线组成,它一次能够发送多位数据。并行总线看似效率更高,但实际上它面临电平问题和串扰问题。

目前的计算机板卡互联协议中,串行协议占据统治地位。PCI-E、SATA 等都是串行传输的。一些较老的传输协议是并行协议,如 AGP、PCI 和 IDE。有关串行和并行传输方式的更多内容,可以参见这个知乎问题。

I²C 从设备地址

每个 I²C 从设备均有一个(在单个总线上)独一无二的 7 位从设备地址(slave address),该地址由设备厂商决定,不过有时也可以由用户自行定义其中的某些位,以允许在同一个 I²C 总线上同时存在相同的多个设备。具体的地址可以在芯片数据手册中找到。

通常在从设备地址后会附加一个数据方向位(data direction bit),一共 8 位数据,构成一个完整的帧。通常数据方向位为 0 时表示主设备发送、从设备接收,称为 WRITE;数据方向位为 1 时表示主设备接收、从设备发送,称作 READ。

以蓝桥杯开发板 CT107D 上的 PCF8591 芯片为例。该芯片是一个具有 I²C 功能的模数转换芯片(Analog to Digital Converter,ADC),用于将模拟信号(analog signal,如通过光敏电阻的电流)转换为数字信号(digital signal,由具体二进制表示的电压大小),相当于一个电压表(将电压转换为具体的读数)。

3b9fff485d2d2651d425d188de5ad6d2.png

PCF8591 完整脚位图

在 PCF8591 数据手册 8.1 Addressing 一节及 Table 5, 6 中,我们可以找到有关芯片地址的详细信息。

823b6419695ed86d64934a5ef69ec1f2.png

如表格所示, PCF8591 的地址为 1001xxx,其中最后 3 位由 A2 – A0 脚(即脚位图中的 5 – 7 脚)决定。如果相应的脚为低电平,则对应的位为 0;否则对应的位为 1。例如如果这三个脚都是高电平,则芯片的地址是 1001111。

一次完整的 I²C 传输

  1. 主设备产生起始条件,代表一次通信的开始。

  2. 主设备发送一帧,表示需要通信的从设备地址和数据方向位。如果相应地址的从设备存在,则从设备将 SDA 拉低,发出 ACK 信号;如果没有相应地址的从设备存在,则主设备会收到 NACK 信号。

  3. 主设备和从设备以帧为单位进行通信;除最后一帧外,每帧传送完后,接收方需发送 ACK 信号以确认。具体的通信过程需要参照相应设备的数据手册,具体细节一般在数据手册的 Functional description 中。PCF8591 数据手册的第 8 节即为 Functional description。

  4. 在最后一帧传送完后,接收方不发出 ACK,此时主设备作出以下动作:

  • 若希望与其他从设备通信,则产生一个重复起始条件,然后继续进行第 2 步;

  • 若希望停止通信,则产生一个停止条件。产生停止条件后,两条数据线均被释放,I²C 总线进入空闲状态。

接下来我们以 PCF8591 和 51 单片机为例,看看如何使用 I²C 总线通信。

(未完待续)

图文|田韵豪

排版|李亦龙

出品|士谔书院X大班

5136df81aa672caa1e4bbb6e0f627b4e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack打包测试_2020年了,再不会webpack敲得代码就不香了(近万字实战)

前言2020年即将到来,在众多前端的招聘要求里,webpack、工程化这些字眼频率越来越高。日常开发者中,我们常常在用诸如vue-cli、create-react-app的脚手架来构建我们的项目。但是如果你想在团队脱颖而出(鹤立鸡群)、拿到更好的offer(还房贷),那么你必须去深…

可解释性 or 准确性?AI 模型就一定不能两者兼得吗?

来源: AI科技评论编译: 张大倩编辑:丛末模型的可解释性,已然成为了AI 领域最具挑战性的主题之一。一般规律中,模型的复杂度和准确性往往是正相关的关系,而越高的复杂度也意味着模型越可能无法实现可解释性。…

仓库温度湿度控制措施_药品仓库如何保持温湿度均衡?

各种药物器械本身的性质不同,储存的方式也就有所不同。一般常规的药品储存在温度10度-30度的仓库中最适宜,避免高温使药品因为受热,或低温潮湿,使受潮湿而发霉变质变形。药片更容易受潮,一般储存的仓库温湿度要在45%-7…

在疫情防控一线,技术能发挥什么作用?

来源:雷锋网新型冠状病毒感染的肺炎疫情在继续扩散。 截至 2020 年 1 月 26 日 24 时,国家卫生健康委收到 30 个省(区、市)累计报告确诊病例 2744 例,现有重症病例 461 例,累计死亡病例 80 例,累…

爱荷华大学计算机科学专业,爱荷华大学计算机科学专业好不好?专业设置详情一览...

自从计算机诞生以后,关于和计算机相关的行业发展的是越来越快,其中计算机科学专业就是其中一个,计算机专业的飞速发展对于人类的生活起到了重大的帮助,生活也发生了翻天覆地的变化,而美国是计算机的发源地,…

cpu工作原理flash动画_秒懂桥式整流工作原理(动画)

限时领取 | 20套电力系统及电气设备PPT资料(点蓝字,免费领资料↑↑)本文分享几张桥式整流电路工作原理的动画图。变压器u2正半周时电流通路变压器u2负半周时电流通路整个周期电流通路是这样的桥式整流电路输出波形与全波整流电路的一样,也是全波波形&…

python 创建一个空向量_Python之Django系列-创建第一个应用-5

上一篇:Python之Django系列-创建第一个应用-4这一章我们会讲到视图层怎么与数据库操作并返回数据到模板层进行渲染最终显示在页面上投票应用基本上会有这么几个视图问题列表页问题详情页问题结果页投票处理器在Django中,网页和其他内容都是通过视图派生而…

新计算机无法 盘启动不了,U盘无法被电脑识别导致制作U盘启动盘失败怎么办?...

我们知道,装系统的方式有很多,从之前的光盘装系统到现在的网上直接下载资源装系统,装系统的方式已经变得越来越简便了,但是相对来说,不少用户还是更加喜欢选择使用U盘来装系统的方式,因为U盘要比光盘和硬盘…

塔勒布: 2019-nCoV的系统风险:一份笔记

来源:混沌巡洋舰塔勒布的思考值得更多人了解,下面是对该文的全文翻译和注解:新型冠状病毒在中国武汉出现,这一病毒具有致命危险,也具有高度传染性。中国至今的反应措施有,几大主要城市已经对数以千万计的人…

arm指令手册_平台/代码从上电到运行(ARM/Cortex-M)(一)

事实上, 网上可以搜出很多讲代码运行的相关帖子。但对于一些没入门的人来说理解起来仍有挑战性。 当然, 这篇日志也没必要从二极管、门电路、地球是怎样形成的之类的本源开始。 但尽量写的详细些, 主要目的在于把目前在这一方面认知整理成文&…

c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017

安装解压我就不必多说了。将opencv解压到相应的文件目录下&#xff1a;在vs2017创建一个空的项目。可以设置成release或者debug模式&#xff0c;64位&#xff0c;具体随意&#xff0c;代码如下&#xff1a;#include <iostream>using namespace std;#include <opencv2/…

F-35战机头盔:揭密世界最先进的显示系统(HMDS)

F-35战斗机头盔显示系统&#xff08;HMDS&#xff09;来源&#xff1a;今日头条F-35战斗机的第三代头盔是世界上最先进的头盔显示系统(HMDS)&#xff0c;首次使用了虚拟成像技术&#xff0c;可以直接将画面投射到驾驶员的面罩之上&#xff0c;配以计算机的处理运算技术&#xf…

定义一个Matrix类,实现矩阵的加法和乘法

1 #include<iostream>2 using namespace std;3 4 class Matrix5 {6 int row;//矩阵的行7 int col;//矩阵的列8 int **a;//保存二维数组的元素9 public:10 Matrix();//默认构造函数11 Matrix(int r, int c);12 Matrix(const Matrix &is);//拷…

无法读取配置节aspnetcore_ASP.NET Core 配置和使用环境变量

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;HueiFengcnblogs.com/yyfh/p/12339961.html前言通常在应用程序开发到正式上线&#xff0c;在这个过程中我们会分为多个阶段&#xff0c;通常会有 开发、测试、以及正式环境等。每个环境的参数配置我们会使用不同的参数…

计算机软件英文参考文献,软件工程英文参考文献(优秀范文105个)

当前,计算机技术与网络技术得到了较快发展,计算机软件工程进入到社会各个领域当中,使很多操作实现了自动化,得到了人们的普遍欢迎,解放了大量的人力.为了适应时代的发展,社会各个领域大力引进计算机软件工程.下面是软件工程英文参考文献105个&#xff0c;供大家参考阅读。软件工…

面对新型肺炎疫情,AI能做什么?

来源&#xff1a; AI科技大本营根据最新的新型冠状病毒疫情通报&#xff0c;截至1月30日24时&#xff0c;国家卫生健康委公布确诊病例9692例&#xff0c;重症病例1527例&#xff0c;累计死亡病例213例&#xff0c;另有疑似病例15238例。为防止疫情扩散&#xff0c;全国31省市自…

残疾人计算机高考试题,残疾人勇夺玉溪高考榜眼:想去清华学计算机

没有脚&#xff0c;思想可以替我走很远。矣晓沅网易教育频道综合讯 据春城晚报报道&#xff0c;6年前&#xff0c;备受类风湿关节炎折磨的矣晓沅在家中写下了一篇名为《第一片落叶》的故事&#xff0c;讲述了一个中学生纷繁复杂的校园生活。彼时的他只能坐在轮椅上&#xff0c;…

directx repair_DirectX修复工具增强版

DirectX修复工具最新版&#xff1a;DirectX Repair V3.9 增强版 NEW!版本号&#xff1a;V3.9.0.29371大小: 111MB/7z格式压缩&#xff0c;196MB/zip格式压缩&#xff0c;345MB/解压后其他版本&#xff1a;标准版 在线修复版MD5校验码&#xff1a;DirectX Repair.exe/eeab9900cc…

灯亮怎么办_车辆隔音效果不好怎么办?

会开车并不代表对车了如指掌日常生活中还是有好多车主被诸多问题困扰&#xff0c;比如车辆隔音效果不好怎么办&#xff1f;扳手形状的故障灯亮起是什么意思&#xff1f;今天&#xff0c;就由利星大连为您答疑解惑汽车隔音效果不好该怎么办&#xff1f;有车以后遇到噪音偏大的情…

Linux下使用iotop检测磁盘io使用情况

介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况的 top 类工具。iotop 具有与 top 相似的 UI&#xff0c;其中包括 PID、用户、I/O、进程等相关信息。 实…