1
通信接口
I2C
Same as STM32F-1
2
培训
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
3
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
4
I2C协议回顾
协议背景
1980年由Philips开发
开发原因:MCU的并行地址和数据总线造成PCB板上过多走线,
更容易受到EMI/ESD干扰
解决方案:2线通信接口 – I2C
协议版本
早期版本@1982年
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
模式(100Kb/s)和7位地址
1.0版本@1992年
增加快速模式(400Kb/s和10位地址)
2.0版本@1998年
增加高速模式(3.4Mb/s)
2.1版本@2000年
放松在高速模式下对一些时序参数的要求
5
I2C协议基本概念
2根总线实现半双工通信
SDA:双向数据线
SCL:时钟线,由主设备发出
总线上设备的角色
主设备
发出时钟信号SCL、起始位和停止位
控制数据流
从设备
地址检测和停止位检测
每个设备拥有自己的地址
在作为从设备被寻址时用到
每个设备都可以发送或接收数据
6
I2C通信流程
通信开始
主设备发送起始条件
主设备发送要寻址的从设备的地址以及通信方向
通信过程中
主设备发送数据,从设备发送应答
或,从设备发送数据,主设备发送应答
通信结束
主设备发送停止条件
主设备
从设备
起
始 目标从设备地址
方
向 数据
应
答
数据
应
答
数据
应
答数据
应
答
数据
应
答
数据
应
答
停
止
7
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
8
STM32F2的I2C特性总览
符合I2C版本1.0规范
支持7位和11位地址模式以及广播地址模式
支持标准速度通信和快速通信
支持多主
默认都是从设备。发送了起始位后自动切换到主模式;
发送了停止位或者仲裁丢失,则自动切换回从模式
作为从设备支持双地址
可配置的时钟延展特性
可配置的PEC产生和验证
兼容SMBus和PMBus
9
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
10
主设备通信:时钟配置和发送起始位
主设备负责时钟信号的发送
配置APB1时钟 :FREQ@I2C_CR2
标准速度下,最小外设输入时钟 = 2MHz
快速模式下,最小外设输入时钟 = 4MHz
配置时钟控制寄存器:I2C_CCR
配置上升沿时间寄存器:I2C_TRISE
库函数I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
I2C_InitStruct->I2C_ClockSpeed= (e.g 100000、400000、200000)
I2C_InitStruct->I2C_DutyCycle= (16:9、2:1)
发送起始位
软件置位Start@I2C_CR1
BUSY@I2C_SR2置位
起始位发送完成后
SB@I2C_SR1置位,并产生中断如果ITEVFEN置位
MSL@I2C_SR2置位
Start@I2C_CR1清零
11
起始位发送的相关寄存器
Start@I2C_CR1
可由软件置位、清零;
起始位发送出去后或PE=0时被硬件清零
主模式:置位表示当前数据传输完成后发送重复起始位
从模式:置位表示当总线空闲时发送起始位
SB@I2C_SR1
只在主模式有效的只读域
起始位发送后置位
软件读SR1和写DR后清零;PE=0时也可由硬件清零
BUSY@I2C_SR2
只读域
检测到SDA或SCL线低电平时,硬件置位
检测到停止位后由硬件清零
MSL@I2C_SR2
只读域
进入主模式后置位(SB=1)
检测到停止位后,或仲裁失败后,或当PE=0时,由硬件清零
12
主设备通信:发送目标从地址
发送目标从设备地址
10位地址模式
通过写I2C_DR,发送地址头(0b1111,0xxy)
xx是10位地址的高2位;y表示通信方向,读还是写
ADD10@I2C_SR1置位,并产生中断如果ITEVFEN置位
等到ADD10置位后,写I2C_DR发送地址字节(8位地址)
ADDR@I2C_SR1置位,并产生中断如果ITEVFEN置位
7位地址模式
通过写I2C_DR,发送地址字节(0bxxxx,xxxy)
xxxxxxx是7位地址;y表示通信方向
ADDR@I2C_SR1置位,并产生中断如果ITEVFEN置位
13
目标地址发送示意图
7位地址模式
10位地址模式
7位地址 0(发送)起始
起始 7位地址 1(接收)
11110,地址高2位 0(发送)起始 低8位地址字节
起始 11110,地址高2位 0(发送) 低8位地址字节 重复起始 11110,地址高2位 1(接收)
如果收到应答,置位ADDR@SR1
ACK/NAK
ACK/NAK
ACK ACK
A A A
如果收到应答,置位ADD10@SR1
如果收到应答,置位ADDR @SR1
14
发送地址相关寄存器
ADD10@I2C_SR1
只有主模式下有效的只读域
10位地址模式下地址首字节发送完毕后由硬件置位
软件读SR1再写DR清零;PE=0时也可由硬件清零
收到NACK后不置位
ADDR@I2C_SR1
主模式下地址发送完成后置位该位
收到NACK后不置位
从模式下地址匹配后由硬件置位
软件读SR1和SR2后清零;也可由硬件在PE=0时清零
TRA@I2C_SR2
地址发送完毕后根据方向位置位
TRA=0:接收数据
TRA=1:发送数据
检测到停止位、重复起始位,或仲裁失败、PE=0时由硬件清零
15
主设备通信:发送数据
开始发送
清除ADDR标志后,往I2C_DR中写入第一个数据
发送过程中
在当前数据发送完成之前,写入下一个待发送的数据
结束通信
BTF置位时,软件置位STOP来发送停止位
注意:
红色箭头标志的事件
:如果软件未完成相
应操作,SCL会被拉
低延展
绿色箭头标志的事件
:如果软件未在当前
数据传输完成之前,
完成相应操作,SCL
会被拉低延展
16
主设备通信:接收数据
开始接收
清除ADDR标志后,从设备的数据才出现在总线上
接收过程中
RxNE置位后,在下一个数据传输结束之前,读取数据寄存器
结束通信
主设备在适当的时刻置位NAK和STOP位
注意:
(1) 主设备只接收一个数据
时,此处是个NAK
红色箭头标志的事件:如
果软件未完成相应操作,
SCL会被拉低延展
绿色箭头标志的事件:如
果软件未在当前数据传输
完成之前,完成相应操作
,SCL会被拉低延展
蓝色箭头标志的事件:必
须在当前数据传输完成之
前完成对应软件操作
17
主设备接收一个和两个数据的特殊处理流程
EV5
SB置位:软件读取SR1,往
I2C_DR写入目标从设备的
地址字节
ADDR置位:软件对ACK位写零,置位POS,再
通过读取SR1和SR2来清除该标志;在ADDR
标志被清除之前,SCL一直被拉低延展
BTF置位(Data1在数据寄存器中,Data2在移
位寄存器中):置位STOP;读取Data1和Data2
。在读取Data1之前,SCL一直被拉低延展
EV5
SB置位:软件读取SR1,往I2C_DR写入目标从设备的地址字节
EV6
ADDR置位:软件对ACK位写零,再通过读取SR1和SR2来清除该标志
EV7
RxNE置位:读取数据寄存器,置位STOP位
18
主设备接收三个或更多数据
EV5
SB置位:软件读取SR1,往I2C_DR写入目标从设备的地址字节
EV6
ADDR置位:软件对ACK位写零,再通过读取SR1和SR2来清除该标志
EV7
RxNE置位:读取数据寄存器,置位STOP位
Data3 Data4
BTF置位(Data3在数据寄存器中,Data4在移
位寄存器中):软件对ACK位写零,读取Data3
。在读取Data3之前,SCL一直被拉低延展
BTF置位(Data4在数据寄存器中,Data5在移位
寄存器中):置位STOP位,读取Data4和Data5
。在读取Data4之前,SCL一直被拉低延展
19
从设备通信:地址匹配检测
从设备接收来自主设备的时钟信号
也需配置PCLK1 :FREQ@I2C_CR2
标准速度下,最小外设输入时钟 = 2MHz
快速模式下,最小外设输入时钟 = 4MHz
检测到总线上的起始位后接收地址字节,然后
和OAR1寄存器比较
如果使能双地址模式,还要和OAR2寄存器比较
ENDUAL@I2C_OAR2 = 1
如果使能广播模式,检验收到的是否为广播地址
广播地址由两个字节组成,第一个字节是0x00
ENGC@I2C_CR1 = 1
地址字节接收并匹配后,根据通信方向硬件设置TRA
20
7位和10位地址匹配检测
10位地址模式 7位地址模式
地址头序列
11110XX0
如果ACK位置位,硬件回复应答脉
冲,并继续等待下一个地址字节
匹配
继续等待总线上的下一个起始位 不匹配
第二个地址字节
XXXXXXXX
若ACK置位,硬件回复应答脉冲;
硬件置位ADDR并产生中断,如果
ITEVFEN置位;
若双地址模式,软件读取DUALF确
认收到的地址和自身哪个地址匹配
匹配 同左 地址字节
XXXXXXXY
继续等待总线上的下一个起始位 不匹配 同左
蓝色表示地址信息;
红色表示方向位:
10位地址模式下,地址头序列的LSB方向位固定是“主发从收”
7位地址模式下,地址字节LSB方向位根据通信方向确定
21
地址匹配检测中的寄存器
ADDMODE@I2C_OAR1
置位表示10位地址模式;清零表示7位地址模式
只在从模式有效
ADD[9:0]@I2C_OAR1
10位地址模式下从设备的10位地址
ADD[7:1]@I2C_OAR1
7位地址模式下从设备的7位地址
ADD2[7:1]@I2C_OAR2
双地址模式下,从设备的第二个地址
ENDUAL@I2C_OAR2
置位表示使能双地址模式
ENGC@I2C_CR2
置位则使能广播呼叫模式
DUALF@I2C_SR2
只在从模式有效
表示收到的地址和双地址中的哪个匹配
检测到停止位或重复起始位后,或者当PE=0时,由硬件清零
22
从设备通信:发送数据
红色箭头标志的事件
在软件执行完相应操作之前,时钟信号被拉低延展
绿色箭头标志的事件
当前数据传输完成之前还未执行完相应软件操作,时钟被拉低延展
即BTF置位就会延展时钟
23
从设备通信:接收数据
红色箭头标志的事件
在软件执行完相应操作之前,时钟信号被拉低延展
绿色箭头标志的事件
当前数据传输完成之前还未执行完相应软件操作,时钟被拉低延展
即BTF置位就会延展时钟
通信结束:检测到停止位,置位STOPF标志
24
时钟延展
主设备:一直具备该特性
BTF或ADDR置位未清零前,时钟被硬件拉低延展
从设备:该特性可被软件关闭
NOSTRETCH@I2C_CR1= 0
BTF或ADDR未清零前,时钟被硬件拉低延展
同主设备
NOSTRETCH@I2C_CR1 = 1
由软件管理读写冲突
RxNE置位未清零,又收到新数据:Overrun错误
后一个数据会丢失
TxE置位,当前数据发送完成之前还未写DR:Underrun错误
重复发送前一个数据
25
PEC包错误检查
目的:提供I2C通信可靠性
使用CRC8多项式对每个字节的8位进行计算
C(x) = X8 + X2 + X + 1
对每个数据字节以及包含读写位的地址字节都计算
使能控制
ENPEC@I2C_CR1
PEC的使用
发送:最后一个数据对应的TxE置位,把最后一个发送数据写入
DR,然后置位PEC
在最后一个数据发送完成后,硬件自动发送PEC计算值
接收:最后一个数据对应的RxNE置位,读取DR中最后一个接收
数据,然后置位PEC
收到的数据和自身计算出的PEC值不相符合,回复NAK信号。
主设备接收时:无论PEC符合与否,都回复NAK信号;软件必须在清
零ACK位之前,置位PEC位
从设备接收时:置位PEC不能晚于PEC字节的应答脉冲出现,否则即
使CRC错误也不会置位PECERR。
PECERR标志和相应中断 DMA模式下PEC的使
用在DMA章节讲
26
PEC操作相关寄存器
ENPEC @ I2C_CR1
软件控制PEC计算使能控制位
PEC @ I2C_CR1
软件置位表示发送PEC计算值
PEC发送完成后由硬件清零
检测到起始位、停止位后由硬件清零
PE=0时由硬件清零
仲裁失败破坏PEC的计算
PECERR @ I2C_SR1
硬件置位表示收到的PEC出现错误
接收方返回NACK信号,无论ACK位是1还是0
否则表示没有PEC错误
接收方在收到PEC后返回ACK信号,如果ACK位为1
软件写0清除该位;也可在PE=0时由硬件清零
27
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
28
DMA特性
I2C的DMA请求
发送时数据寄存器为空
接收时数据寄存器为满
收/发共同的DMA使能控制:DMAEN@I2C_CR2
DMA请求必须在当前数据传输完成之前被响应
数据传输完毕,DMA控制器给I2C发送EOT/EOT_1信号;并产生中断,如果
使能了的话
使用DMA发送
不要置位ITBUFEN@I2C_CR2
主设备:在EOT对应的中断ISR中,等待BTF置位再软件置位STOP位来发出
停止位
如果使能了PEC:发送完最后一个数据后,自动发出PEC
使用DMA接收
不要置位ITBUFEN@I2C_CR2
主设备:接收完N-1个数据,硬件产生EOT_1信号。如果LAST @ I2C_CR2
已经置位,则在EOT_1信号之后的下一个字节传输完成后,硬件自动发送
NAK信号。在DMA传输完成中断ISR中,再软件置位STOP为来发出停止位
如果使能了PEC:I2C收到EOC信号后自动认为下一个字节是PEC并核查它
的值。PEC接收完毕后会在产生一个DMA请求
29
DMA操作相关寄存器
DMAEN@I2C_CR2
DMA使能控制位
置位时表示:当TxE或RxNE置位似,产生DMA请求
ITBUFEN@I2C_CR2
发送/接收缓冲中断使能控制位
置位时表示:当TxE或RxNE置位时,产生事件中断
和错误中断不同的中断向量
无论DMA使能与否
LAST@I2C_CR2
用于主接收模式
在收到最后一个数据后产生NAK信号
LAST=1:下一个DMA EOT信号是最后一次传输
LAST=0:下一个DMA EOT信号不是最后一次传输
30
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
31
错误标志
主设备 从设备
总线错误 BERR
在地址和数据发送过程中,检测到停止位或起始位:置位BERR并产生中断,如果ITERREN置
位
当前传输的数据不受影响。由软件决定是否
丢弃这次传输
当前正在传输的数据被丢失,硬件释放总线。
检测到起始位:等待后续地址或停止位;
检测到停止位:硬件释放总线
应答失败 AF
发送方检测到非应答(第九个时钟脉冲时数据线为高电平):置位AF并产生中断,如果ITERREN
置位
软件必须产生停止位或重复起始位,来复位
通信过程
硬件释放总线
仲裁失败ARLO
检测到仲裁失败:置位ARLO并产生中断,如果ITERREN置位;
释放总线,回到从设备模式(MSL位被清零),但不应答自己的从设备地址;除非在下一个起始位
之后
上溢/
下溢
错误
OVR*
Overrun
接收数据时
RxNE已经置位的情况下,下一个数据又接收完毕:置位OVR
新数据丢失;
Underrun
发送数据时
TxE已经置位的情况下,下一个字节对应的时钟到来之前还未更新数据寄存器:置位OVR
DR中的数据被重复发送
备注:
OVR只有在从设备这一端,并且关闭了时钟延展特性时才会发生。主设备永远不会发生,因为它固有的时钟延
展特性。
从设备在时钟延展关闭的情况下:ADDR清零之后必须在SCL的上升沿来临之前把要发送的第一个数据写进DR
(使能时钟延展特性时,在ADDR清零和写DR的软件序列完成之前,SCL会把硬件拉低延展)
32
中断管理
中断事件 中断标志 使能控制位 矢量
通
信
开
始/
结
束
主模式:起始位发送完成 SB
ITEVFEN
I2Cx_EV
主模式:地址发送完成且被应答
从模式:收到的地址字节匹配
ADDR
主模式:10位地址的头序列发送完毕 ADD10
从模式:检测到停止位 STOPF
数据传输完成(DR和移位寄存器中都空) BTF
通
信
过
程中
接收缓冲非空 RxNE ITEVFEN以及
ITBUFEN发送缓冲为空 TxE
通
信
错
误
总线错误 BERR
ITERREN I2Cx_ER
主模式:仲裁失败 ARLO
应答失败 AF
上溢/下溢错误 OVR
PEC错误 PECERR
超时/Tlow错误 TIMEOUT
SMBus Alert错误 SMBALERT
33
培训内容
I2C总线协议回顾
STM32F2的I2C特性总览
通信流程和相应标志
主设备通信
从设备通信
DMA特性
错误标志和中断管理
兼容SMBus和PMBus
34
SMBus
SMBus介绍
两线接口,基于I2C操作原则
用于为系统和电源管理的相关应用提供控制总线
总线中的三种设备
Slave:接受命令、响应命令
Master:发送命令,产生时钟,结束通信
Host:特殊的Master,必须支持主机通报协议
和I2C协议的不同
SMBus协议 I2C协议
时钟频率
最快 100KHz 400KHz
最慢 10KHz 没有下限
超时限制 35ms 无超时限制
逻辑电平 电平固定值 取决于VDD
设备地址类型 不同类型(保留地址、动态地址) 7位、10位、广播地址
总线协议 9种不同协议(快速命令、进程调用) 没有总线协议
35
SMBUs模式特性简介
兼容SMBus2.0版本
时钟同步机制允许不同速度的设备共存于总线
时钟拉低延展
主设备:最长10ms的累积延展时间
从设备:最长25ms的累积延展时间
在每个bit上延展
带应答控制的硬件PEC产生和校验
支持地址解析协议(ARP)
给每个从设备动态分配唯一地址,以解决地址冲突
支持主机通报协议