当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > 5.7.2 ARM微控制器外设:I2C的通讯协议 > 5.7.2 ARM微控制器外设:I2C的通讯协议
各位同学大家好
我是清华大学工程物理系的曾鸣老师
我们来继续我们的
ARM微控制器与嵌入式系统MOOC之旅
那么在这个单元里呢
我们继续学习I2C
这样一类同步串行通讯
那么在上一个单元的学习里
我们知道了I2C的一些比较显著的特点
大家一定要深入理解和记住的
是I2C的那个引脚的
电气的一些特殊性
它是一个开漏或者是开集电极的
一个输出引脚
形象的比喻就是主设备 从设备
很多设备或者叫很多人
用手拉着一根共用的数据线
大家都不使劲的时候
它就是高电平
任何一个往下拽就可以把它拽成低电平
这样一种彼此之间逻辑上线与的关系
如果对这件事情理解
对于我们后面学习这些电平的关系
和通讯协议有非常大的帮助
那么我们在上个单元的最后呢
讲到了I2C的电平标准里头的几个关键点
一个呢它是时钟信号01跳变的时候
总是时钟信号的电平有效
其次呢
要求数据线上的数据总是在时钟信号
为高电平的时候保持不变
每当时钟信号为低电平的时候
可以发生改变
同时定义了两个特殊的信号
跟我们那个UART的数据帧的
开始和结尾很像
我们的信号仍然是一种不归0的码 对吧
数据信号平时是逻辑1
因为大家都没有往下拽
当时钟为高电平也就是正常情况下
不会发生变化的时候
这个数据线发生了一次由高向低的变化
我们称为Start bit起始位 记为S
那么当时钟信号为高电平的时候
发生了一次数据线
由低向高的跳变的时候
我们称为停止位 也就是P
那么我们接下来将会详细的学习
这个I2C的数据帧的结构
或者叫通讯协议的结构
那么为什么我有时候
会说它是通讯协议呢
大家先定性的看一看这样一种时序图
就会发现它里头成分单元比较多
跟我们在UART里头
学习的那个简单的起始位 停止位
中间是个数据加上奇偶校验位
那种简单的数据帧已经不是完全一样的了
这也是我们学习I2C当中一个新的难点
如果大家跟着我在这个单元里
一点一点的把这样一种数据帧
这样一种通讯协议理解清楚
其实就奠定了大家日后自己学习USB通讯
或者以太网通讯的一些基础
那么在这样一张时序图开始讲之前
我想我们一个一个概念的梳理
首先第一个概念就是上节课最后提到的
我们的I2C通讯是一个Bus
一个总线性的通讯
所以它会有一个主设备和多个从设备
所以在一个I2C通讯里
势必我们只有两根
一根数据线 一根时钟线
只有两根线的情况下
我们如何在通讯中
对设备或者对于每一笔通讯的
彼此双方加以区分呢
那就一定会有地址的概念
我们在做编程的时候
会用指针会访问内存
那个时候会有独立的地址线数据线
在这样一种串行通讯的协议里头
我们也会有地址的概念
我们待会讲地址怎么实现
先说地址的编址
那么在I2C的Bus这样一种总线通讯里头
主机的地址无所谓
但是从机会用七个比特来标识它们的地址
所以连在一个I2CBus里头
每一个从设备都应该有一个
在这个总线里
独一唯一的七比特的地址
所以这样一个七比特的地址
就标识了每一个设备的
我们认为是它的编号也好
是它的名称也好
所以帮助我们在后面的每笔通讯里
确认主机是在跟谁说话
这就像电话号码一样非常好理解
那么有了这个七比特的地址的概念
我们再来看看我们的协议上
如何实现从主机到每个从设备
能够彼此区分
彼此不干扰的通讯
那么构成了刚才看到的这张图
这样一张时序关系
那么在这张时序关系的
这个数据帧的结构图里头
大家先注意有两种不同的颜色
灰色都代表由主机向从机发送的数据
也就是在我们SDA的data数据线上
它的方向是由主机驱动从机读取输入
那么如果是白色的部分呢
就意味着在这根data线上同一根线
数据的方向变成了
由正在通讯的
那个从设备驱动而主机读取
也就是说在一根线上会切换谁来管它
那么结合我们前面讲到的
这个开漏或者开集电极的
这样一种电气特性 大家会理解
是一根上拉电阻
拉在那根线
在灰色的部分
由主机来拽它产生
松手就是1
拽下来就是0来产生数据
而到了白色的部分的时候
打个形象的比喻
就意味着主机一直是撒手的
而由对应被选中的这个从设备来拽它
拽下来是0
撒手是1产生数据
所以实际上这样一种灰白灰白切换的过程
是主机和从设备
在分别拥有主动权来拉动这根数据线
获得数据线上0或者1的改变
而接收的那一方去读取它的值
这个形象的概念
大家如果首先建立
对于后面的理解会简单很多
其次就是对于我们这样一个
数据帧结构图里头
这些助记符这些字母它们的含义
我们一个一个加以解释
最前面的S和最后面的P
就是我们刚才讲到的起始位和停止位
因为我们后面的所有的数据切换
都必须在时钟信号
为低电平的时候发生变化
而在时钟信号为高电平的时候保持不变
这是一个约定成俗
只有开始位和停止位刚才讲过
是时钟信号为高电平的时候
数据位发生一次由高往低的变化
或者由低往高的变化
分别代表数据帧的开始和结尾
那么在开始位和停止位
中间的这些数据段都有明确的定义
首先是这个SA
SA占七个比特就是我们的刚才讲到的
从设备的地址
所以每一次通讯的发起
都是在时钟信号
被主机驱动跳变的过程当中
主机在时钟信号为高电平的时候
发起一次数据引脚
由高向低的跳变拉一下
告诉所有的从设备一次通讯开始了
接着由主机注意这个部分是灰色
依次拉动或者松开这个数据线
随着时钟信号的同步
产生七个比特的地址位
那么这七个比特的地址位
就是由主机决定
我要跟哪个从设备进行通讯
这是由主机来决定的
那么这个SA这个段之后
有一个比特宽大家看这个时序图
上和下分别是由主机向从机
进行写操作的通讯帧格式
下面是由主机从从机
进行读取的数据帧格式
大家发现这两个数据帧
在第三个单元变得不一样
第三个单元分别是W或者R
那么W代表写入
也就是写方向标志位
它的标志
它的逻辑是0
是逻辑低电平
那么R呢是读取的标志位
代表读取的方向从
将要做的通讯由设备给主机发数据
也就是主机从设备读取
那么R的逻辑是逻辑1
所以一次通讯发起的时候
是主机发起始位
发要通讯对象的那个设备最后跟一个比特
如果这个比特是1
就是R
就表示接下来是我主机
要从你从机读取设备
所以任何一次通讯
大家注意这个主从协议
都是由主机发起的
主机决定跟谁说话
主机决定是给你数据
还是要你回给我数据 对不对
那么我们会发现七个比特的地址位
加上读或者写的这一个比特的
方向标志位
正好构成了一个字节 八个比特
也就是我们红框里的内容
那接下来从机该做什么呢
那么作为一个完整的通讯协议
不再像UART是单向的了
它是一个双向的
那么这个时候会有白色
大家注意是由从机回应主机 对不对
我们会有一个A
这个A表示应答位
那么如果这一位
由从机发起的通讯反馈了一个逻辑0
就代表从机说OK
正确收到 正确响应
我们称为ACK
如果这一位是逻辑1
就表示从机不回应这次发起的请求
我没有就绪
没有这个设备
或者说这个地址不对跟我不一样
那么大家想想为什么ACK是逻辑0
NACK是逻辑1
想一想其实这里头是有道理的
它的道理就是我们刚才讲电气标准当中
大家之间逻辑的那个线与关系 对不对
我们这样一根线大家想到的
不是一个点对点通讯
它是总线通讯
一个主机下面可能有若干个从设备
当然在我们的实验里
其实只接了一个设备
但是你必须从总线的角度
考虑它可能有多个
那么主机说话说我要给编号
比如说编号0005的设备通讯
我要做写操作
那么大家想想每个从设备
其实通过总线都收到了这么一个信息
那么如果一个设备
确认自己是0005号设备
并且可以被写入数据
它是不是要做出响应
那么它的响应ACK是逻辑0
逻辑0就意味着
它需要在这个时候控制总线
那么这个时候大家想一想
电平上的操作是什么
因为这个是难点
大家跟着我的思路走
那么如果大家想想在这个时候
主机发完了通讯开始
发完的地址 发完了写操作的比特
主机就应该撒手
不再控制数据线
但是主机其实仍然在驱动时钟线对吧
数据线主机撒手了
这个时候主机等着从机
来接管这个数据线给它回馈
这个时候在这个总线里正常情况下
我说了一个地址
这个地址对于每个从设备
每个从设备有且只有一个地址
所以最多只会有一个设备
发现自己的地址
与主机所呼叫的地址是相符的
说五号设备应该只有一个设备说我是5号
那么这个设备它的响应
是给出了ACK逻辑0
它把数据线向下拉一下
给出一个比特宽的逻辑0在总线上
表示我收到了
那么这个时候因为所有设备的数据线
都是接在一根线上的
只有一个设备往下拉
主机就表示知道这里头
肯定有一个设备就是5号
它存在 它收到了
那么这个背后的逻辑是别的设备
因为它不是5号
它仍然是高阻
它并没有拽动这根线
所以它没有干扰这次通讯这是第一
第二呢
如果在这根总线上
并不存在一个5号设备
也就是没有任何一个设备
把这个数据线往下拉一下产生0
那对于主机是不是就刚好收到了
一个逻辑1是NACK啊
所以我们的NACK
就是总线的默认状态逻辑1
然后有设备做出回应往下拉的时候
我们主机就知道这个设备存在
通讯可以接着往下走
是不是这么一个逻辑
所以灰色往白色切换的过程
是意味着主机并没有放弃
对于时钟线的控制
仍然一个节拍一个节拍的走
但是放开了对数据线的控制
交由数据线
一个比特的时钟周期
这个比特由设备产生响应
如果至少有一个设备产生了响应
就表示此次通讯有人响应
我接着往下走
那么后面的部分大家会发现
在这两个数据帧里灰白就是相反的
我们先从简单的看
主机向从机写入数据的时候
既然从机响应了
是不是接下来主机
就应该由D一个8比特或者一个字节的数据
就写给从设备了
那么一个字节写完了
同样主机对于数据线再撒手
时钟线主机仍然控制着
松开一个比特的时间
那么从机应该适时的拉动一下这个ACK
表示这个字节成功收到
那么周而复始
我们的主机可以一个字节一个字节的
给从机发入多个这个字节的数据
完成这样一个连续的
对一个单一设备的写操作
那么在这样一种通讯里头
它的反面我们主机也可以对从设备
给出一个从设备地址
然后开始一个字节一个字节的读
那么在读取当中的时候
通讯的数据部分的驱动能力
就交由设备了
也就是设备开始八个比特发数据
由主机拉一下表示ACK你发的数据我收到了
所以通讯的截止两种情况下都有可能
一种是主机主动发起了一个P信号
也就是stop
主机宣布这个通讯结束了
我不再向你写入了
或者我不再向你读了这是主机的权利
或者是在通讯的过程当中
数据的接收方某一次返回了一个NACK
也就是我无法响应这个数据了
也可能是因为这个设备不存在了
也可能这个设备数据的buffer满了
不管是什么样的机制
当接收端返回NACK
对于某一次通讯没有给出ACK信号的时候
也就是ACK那个比特
是逻辑1的响应的时候
这个通讯也应该停止
接着主机会给出一个stop信号
一笔通讯就完成了
所以这就是一个I2C的完整的数据帧
在每个数据帧里
只能完成一个主机与一个设备之间的
一个单向的数据通讯
每一个数据帧都以开始位开始
以停止位停止
而在开始位后面紧跟的
是应该由主机送出的
七比特的设备地址
加上主机送出的一个读写的方向信号
后面跟随若干个字节的连续的
读或者写的数据
而每一个字节的通讯完成的时候
都应该由接收方无论是主还是从
来交换一下这个数据的控制权给出一个ACK
当主机要求停止的时候
或者是接收方给出NACK的时候
我们的通讯就截止了
那么最后要多说一句是I2C
是一个完整规范的协议
所以我们刚才讲了它不像SPI那么灵活
而是非常的完整和严谨
就严谨到了我们的数据的
LSB和MSB也有严格的规范
在I2C的通讯里永远是MSB在前
LSB在后
用更中文的语言说
就是我们一个二进制数它的高位先发送
低位后发送
所以这样一系列的因素构成了一个
完整规范的I2C的通讯的数据帧格式
所以如果两个设备符合I2C
它们的电平标准大家商量好
都是3.3伏或者5伏
接在一起我们只需要很简单的配置
完成刚才这样一种数据帧的结构
就可以正确的通讯起来
而不用在电气层上很担心
那么麻烦在哪呢
就是麻烦在刚才我们所说的这个数据帧
大家发现这里头出现了逻辑的关系
就是主机给地址给方向
然后还要判断设备是否给了ACK
如果给了怎么样
如果没有给怎么样 对不对
它就会发现它不再是一种
数据写入寄存器就不管
然后过会儿就接收
这么一种简单的通讯方式
这样一种互相有交互的
对于数据帧有所管控的通讯
我们就进入了
有通讯协议的这样一种阶段
那么这也就是我所说的
日后大家学习USB或者学习以太网
接收到它那个数据帧
它那个通讯协议的时候
慢慢会越来越复杂的理解的第一步
或者叫起点
那么如果我们把这样一个完整的流程
拉开说一个I2C的完整的数据通讯
按时序图拉开看就是这两张长图
有兴趣的同学大家自己可以看一看
就是在时钟线为高电平的时候
数据线比较反常的
发生一次由高向低的跳变
意味着一个数据帧的开始
接着时钟就开始周期的跳变
产生时钟信号
然后数据帧就比较规范的
总是在低电平的时候发生数据的变化
然后在高电平的时候保持不变
依次变化七个比特
产生地址
再变化一个比特产生方向
接着接收一个来自从设备的ACK
然后接着再由主机进行下一步的通讯
从机给ACK这是写操作
下面这张图是读操作
大家注意呢
我们是数据线把主机
和它所通讯的那个从机的视角的
数据线的信号画成了两个流程图
但是实际上它们接的是一根线对吧
所以实际上我们真正在数据SDA
那根引脚那根线上看到的信号
是我们从主机视角看到的逻辑
和从机视角产生的逻辑之间的
与以后的结果
我不知道大家这个概念清不清楚
换言之
这个主机和从机的数据时序只是零有效
代表了主机和从机拽不拽这根线
而这根线上的电压是两者一起拽的结果
大家都不拽的时候才是逻辑1
如果大家这个概念清楚了
那么I2C我相信大家都理解的比较清楚了
如果不清楚大家可以倒回去
从一开始电平那个开漏
开集电极的那个逻辑
那个电气部分
再来认真的回忆一下
那么我们还有一个高阶的事情
一个是叫重复起始
重复起始就是说如果我们有两笔通讯
逻辑上来讲两个数据帧
写写写写写 读读读读读 写写写写写
理论上中间出现方向变化的时候
应该是开始比特
数据通讯的地址 方向
然后加上数据通讯内容 停止
然后再来一个开始比特
再到数据方向再停止
那么是在I2C里头
允许略掉那个停止比特
就中间那个停止比特是中间空闲的位置
只需要在开始比特读写这个地址之后
一个方向的数据传输到某个时候
重新发一次开始位
也就是在高电平的时候
再产生一次数据线由高向低的跳变
就可以进行下一笔通讯
那么在下一笔通讯开始时候
就是一个完整的新的数据帧
仍然是给出地址
给出数据
而且方向可以跟上次不一样
这个时候中间的这个开始位
我们称为restart
也就是在电平上跟起始信号完全一样
在位置上可以顶在
前一个数据帧的停止位的位置
使两个数据帧之间连起来节约时序
这是第一个高阶的概念
称为Restart
那么第二个高阶的概念呢
就是子地址的概念
那么我们往往在刚才那个通讯模式里头
描述了一种极简单的状态
我不知道大家能不能理解
我来给大家讲这样一种应用
那么很多时候我们会说访问一个从设备
从设备自己有一个地址
那么从设备的这个地址
就有点打个比方的话
像我们大家住的学生宿舍的门牌号码
比如504房间对吧
然后我们说504房间进去四个人
然后接着发4个字节
咚咚咚四个字节就进去了
然后我们说504房间出来四个人
我们做一次读操作
那么主机先发起
先写这个地址504
然后说方向是读取
接着咚咚咚出来四个人
四个字节出来
这是我们想象的一类设备
但是很多时候我们的设备
是有比较复杂和完善的功能
它内部可能有不止一个存储单元
而且这些存储单元
可能有各自的定义和含义
最典型的就是我们有可能用I2C
外扩接了一个有复杂功能的
外设模块或者芯片
比如GPS 比如温度传感器
或者我们做实验用的加速度传感器
那么这个时候它的片内
可能有多个存储单元或者有多个寄存器
这个时候在这个设备的内部
可能还会有子地址
那么这个时候我们就要通过编程
实现对于I2C设备内子地址的访问
那么这件事情说起来有点绕
我还是绕回刚才那个比喻
说我们有一个房间是504
但这个房间里有四个铺位
住着四个同学ABCD
然后我们说我们访问504房间
请一号铺位上的A同学出来
那这个时候我们要做的操作呢
是先给这个504房间发504的地址
接着再给这个504房间发一号铺位的地址
然后最后做一个读操作
这个一号同学这个字节出来 对吧
那么如果我们说指定要写入一个字节
比如504这个房间三号铺位的C同学
我要把它送进去
这个时候我们要在通讯的角度
先写一个字节504的地址
再做一次对设备的写操作
写这个3号铺位的这个地址
接着再把真正要放进去C同学这个字节
写给设备
于是是三次写操作
或者叫地址后面跟着两次写操作
一次写的是子地址
一次写的是C同学这个具体的字节
我不知道这个比喻大家有没有明白
也就是说我们访问的从设备的内部
如果还有地址的话
地址是我们传输的数据当中的一部分
是我们要传输的第一个数据
所以在有子地址的访问的时候
我们的读写就变得比原来要复杂了
写操作相对简单
那么由起始位开始
主机说一个七比特地址选中一个从设备
选中一个芯片
接着再发一个字节的通讯
也就是数据部分的第一个字节
实际上是一个地址编号
比如三号铺位
或者两号铺位
那么选中里头一个子地址
然后紧接着发的数据的第二个字节
就是再下一笔通讯是针对这个子地址
我们要写入的数据
当然我们可能写入不止一个数据
我们还可以连着往后写
这是对于带有子地址的设备的写操作
读操作就比它麻烦
为什么呢
大家看它涉及到方向的切换
我们要先写入主机发起一个通讯
然后发起这个通讯的时候
七比特的设备地址写出去
但是这个时候我们虽然是要读里头内容
但我们第一笔通讯仍然是一个比特是写
做一个写操作
为什么呢
因为我们紧跟着要写一个字节的子地址
也就是这个房间里的铺位号我得先写给它
所以是设备地址选中做写操作
写入一个字节的这个子地址
铺位号 三号铺位 一号铺位
写完了以后这笔通讯结束
Restart一下
因为不Restart一笔通讯里只能是一个方向
Restart一下
主机再发起一笔新的通讯
仍然是这个房间号
仍然是这个设备的子地址
七个比特
这个时候跟的读写方向
跟成读这个方向的读字节
读比特
那么也就是发生写操作
写入子地址
Restart一下
再发生一个新的通讯
给入设备地址
此次是读地址
那么这个时候设备
把刚才你给的那个子地址的内容
送回来给主机
那么这个地方比较麻烦比较绕的
就是因为I2C的数据帧
在单次由主机发起的通讯里
只能完成一个方向
所以涉及到子地址的写的时候
我是写房间号
写子地址 写铺位号
写我要写的数据送进去了
做读操作的时候
做写操作
写房间号 写铺位号
重启切换方向
写房间号
读 把我刚才告诉你的铺位号的
那个数据那个人送出来给我
所以就是这样一种对于子地址的操作
希望大家能够通过我这个
不太巧妙的比喻加以理解
那么这就是I2C通讯里头的
一些高阶内容
既讲了对于I2C从电气层
到通讯这个数据帧数据协议的概念
也给大家讲了它如何访问内部
有子地址的复杂结构的通讯
那么在下个单元
我们对于加速度传感器的编程里
我会带着大家直接把它用上
这个单元就到这里
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例