i2c规格书spec介绍

1、简介

I2C(inter-integrated circuit)总线接口连接微控制器和串行I2C总线。它提供多主机功能,控制所有I2C总线特定的顺序、协议、仲裁和时序。支持标准(Sm)、快速(Fm)。根据特定设备的需要,可以使用 DMA 以减轻 CPU 的负担。

1.1、主要特征

●并行总线/I2C 总线协议转换器
● 多主机功能:同一接口既可做主设备也可做从设备
● I2C 主设备功能
− 产生时钟
− 产生起始和停止信号
● I2C 从设备功能
− 可编程的 I2C 地址检测
− 可响应 2 个从地址的双地址能力
− 停止位检测
● 产生和检测 7 位/10 位地址和广播呼叫
● 支持不同的通讯速度
− 标准速度(高至 100 kHz)
− 快速(高至 400 kHz)
● 状态标志:
− 发送器/接收器模式标志
− 字节发送结束标志
− I2C 总线忙标志
● 错误标志
− 主模式时的仲裁丢失
− 地址/数据传输后的应答(ACK)错误
− 检测到起始和停止错位
− 过载和欠载(需先禁止拉长时钟功能)
● 2 个中断向量
− 1 个事件中断,用于地址/数据通讯成功
− 1 个错误中断
● 可选的拉长时钟功能
● 具单字节缓冲器的 DMA
● 可配置的 PEC(信息包错误检测)的产生或校验:
− 发送模式中 PEC 值可以作为最后一个字节传输
− 用于最后一个接收字节的 PEC 错误校验
● 支持 SMBus
− 25 ms 时钟低超时延时
− 10 ms 主设备累积时钟低扩展时间
− 25 ms 从设备累积时钟低扩展时间
− 带 ACK 控制的硬件 PEC 产生/校验
− 支持地址分辨协议(ARP)

2、I2C功能描述

(按内部功能模块,进行详细描述。包括但不仅限于总线时序,内部模块及其连接关系,数据通路,中断,DMA,关键状态机,时钟复位方案等)

2.1、简介

Figure4-1 I2C bus protocol在这里插入图片描述

I2C支持以下四种模式:
 ●Slave transmitter
 ●Slave receiver
 ●Master transmitter
 ●Master receiver
默认工作在Slave模式。接口在生成起始条件后,自动地从slave切换到master;在允许多主机功能的情况下,当仲裁丢失或产生停止信号时,则从master切换到slave。
作为master时,I2C接口启动数据传输,并产生时钟信号。串行数据的传输总是以起始条件开始,并以停止条件结束。起始条件和停止条件都是在master模式下由软件控制产生。
作为slave,I2C接口能识别自己的地址(7位或10位)和general call地址。软件能够控制开启或禁止对general call地址的识别。
数据和地址按8位(字节)进行传输,高位在前。跟在Start条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在master模式发送。
在一个字节传输的8个时钟后的第9个时钟期间,接收方必须回送一个应答位(ACK)给发送方。

2.2、时钟

2.2.1、波特率

I2C 模块的输入时钟是APB clock。模块内部生成SCL时钟再输出到总线上给slave。SCL产生机制如下:有一个计数器根据CCR寄存器的值来计数高低电平,由CCR 寄存器来决定高低电平的长度。此外,CCR寄存器还控制标准模式和快速模式的选择,以及SCL高低电平的比例。下表是为产生不同频率的SCL,对应的PCLK频率与CCR和TRISE寄存器的值。
Table 4-4 不同模式下pclk频率与ccr寄存器和trise寄存器值的计算公式(SM 模式下SCL至多不超过100kHz,FM 模式下SCL至多不超过400kHz)
在这里插入图片描述

2.2.2、数据的建立时间、保持时间

在这里插入图片描述
在这里插入图片描述

2.3、包错误校验(PEC)

包错误校验(PEC)计算器是用于提高通信的可靠性,这个计算器使用一个可编程的多项式对每一位串行数据进行计算。
● PEC 计算由 I2C_CR1 寄存器的 ENPEC 位激活。PEC 使用 CRC-8 算法对所有信息字节进行计算,包括地址和读/写位在内。
− 在发送时:在最后一个 TxE 事件时设置 I2C_CR1 寄存器中的 PEC 传输位,PEC 将在当前字节后被发送。
− 在接收时:在最后一个 RxNE 事件时设置 I2C_CR1 寄存器中的 PEC 位,如 果 下 个 接收 到 的 字 节不 等 于 内 部计 算 的 PEC , 接收器发送一个NACK。如果是主接收器,不管校对的结果如何, PEC 后都将发送NACK。
● 在 I2C_SR1 寄存器中可获得 PECERR 错误标记/中断。
● 如果 DMA 和 PEC 计算器都被激活:
− 在发送时:当 I2C 接口从 DMA 控制器处接收到 EOT 信号时,它在最后一个字节后自动发送 PEC。
− 在接收时:当 I2C 接口从 DMA 处接收到一个 EOT_1 信号时,它将自动把下一个字节作为 PEC,并且将检查它。在接收到 PEC 后产生一个DMA 请求。
● 为了允许中间 PEC 传输,在 I2C_CR2 寄存器中有一个控制位(LAST 位)用于判别是否真是最后一个 DMA 传输。如果确实是最后一个主接收器的DMA 请求,在接收到最后一个字节后自动发送 NACK。
● 仲裁丢失时 PEC 计算失效。

2.4、发送与接收

2.4.1、从模式

默认情况下,I2C接口总是工作在slave模式。从slave模式切换到master模式,需要产生一个起始条件。为了产生正确的时序,必须在I2C_CR2寄存器中设定该模块的输入时钟。输入时钟的频率必须至少是:
标准模式下为:2MHz
快速模式下为:4MHz
一旦检测到起始条件,在SDA线上接收到的地址,被送到shift寄存器,并与芯片的地址OAR1或者general call地址(如果ENGC=1)相比较。
Address not matched(头段或地址不匹配):
I2C接口将其忽略并等待另一个起始条件。
Address matched(地址匹配):
I2C接口产生以下时序:
● 如果ACK被软件置’1’,则产生一个应答脉冲
● 硬件置位ADDR位,如果设置了ITEVTEN位,则产生中断
在从模式下TRA位指示当前是处于接收器模式还是发送器模式

2.4.1.1、从机发送模式

在接收到地址并清除ADDR位后,(如果地址字节的最低位是1)Slave将数据(字节)从DR寄存器,经由内部shift寄存器发送到SDA上。
Slave拉低SCL,直到ADDR位被清除,并且待发送数据已写入DR寄存器(参考EV1、EV3)。
当收到应答脉冲时:TxE位被硬件置位,如果设置了ITEVTEN和ITBUFEN位,则产生一个中断。
如果TxE位被置位,但在下一个数据发送结束之前,没有新数据写入到I2C_DR寄存器,则BTF位被置位。Slave拉低SCL,直到BTF位被软件清零(读_SR1之后,再写入I2C_DR寄存器)。

在这里插入图片描述
说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
Figure 4-2 transfer sequence diagram for slave transmitter
Legend: S= Start, Sr= Repeated Start, P= Stop, A= Acknowledge, NA= Non-acknowledge, EVx= Event(with interrupt if ITEVFEN= 1)
EV1: ADDR=1, 通过先读SR1寄存器,再读SR2寄存器清零ADDR位
EV3-1:TxE=1, shift寄存器empty, 数据寄存器empty, 向DR寄存器写Data1
EV3:TxE=1, shift寄存器不empty, 数据寄存器empty,向DR寄存器写(Data2)清零TxE
EV3-2: AF=1; 软件向AF位写0清零该位

2.4.1.2、从机接收模式

在接收到地址并清除ADDR后,(如果地址字节的最低位是0)slave将通过内部移位寄存器把从SDA线接收到的字节存进DR寄存器。I2C接口在接收到每个字节后都执行下列操作:
● 如果设置了ACK位,则产生一个应答脉冲
● 硬件设置RxNE=1。如果设置了ITEVTEN和ITBUFEN位,则产生一个中断。
如果RxNE被置位,并且在接收新的数据结束之前,DR寄存器未被读出,则BTF位被置位,在清除BTF(读出I2C_SR1之后再读I2C_DR寄存器)之前,slave一直拉低SCL。(见下图)。

在这里插入图片描述
说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
Figure 4-3 Transfer sequence diagram for slave receiver
Legend: S= Start, Sr= Repeated Start, P= Stop, A= Acknowledged, EVx= Event(with interrupt if ITEVFEN=1)
EV1:ADDR=1,通过先读SR1,后读SR2,实现ADDR的清零
EV2:RxNE=1, 读DR寄存器清零该位
EV4:STOPF=1, 通过先读SR1寄存器,后写CR1寄存器实现对该位的清零。
Note:

  1. EV1 event拉低SCL,直到相应软件sequence的结束。
  2. EV2软件sequence必须在当前byte传输完成前即完成。
  3. 当用户检查SR1寄存器内容后,应该对每个发现置位的标志位,进行完整的清除sequence。比如ADDR和STOPF标志位,需要用以下sequence:
    如果ADDR=1,先读SR,再读SR2;如果STOPF=1,先读SR1,再写CR1。
    这样做的目的是确保如果ADDR和STOPF两位都被发现置位,都能被清除掉。
    Closing slave communication
    在传输完最后一个数据字节后,master产生一个停止条件,slave检测到该条件时:
    ● 硬件置位STOPF,如果设置了ITEVTEN位,则产生一个中断。
    通过先读SR1,后写CR1,实现对STOPF位的清零。(参见上图的EV4)

2.4.2、主模式

在Master模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始,并以停止条件结束。
当通过START位在总线上产生了起始条件,设备就进入了master模式。
以下是master模式所要求的操作顺序:
 在I2C_CR2寄存器中设定该模块的输入时钟以产生正确的时序
 ●配置时钟控制寄存器
 ●配置上升时间寄存器
 ●编程I2C_CR1寄存器启动外设
 ●置I2C_CR1寄存器中的START位为1,产生起始条件
I2C模块的输入时钟频率必须至少是:
 ●标准模式下为:2MHz
 ●快速模式下为:4MHz

SCL master clock generation
CCR寄存器以上升沿或者下降沿,产生SCL的高电平和低电平。由于slave可能拉长SCL信号,在SCL上升沿产生后,master在TRISE寄存器编程的时间到达时,检查来自总线的SCL信号。
— 如果SCL是低电平,意味着slave正在拉长SCL总线,高电平计数器停止计数,直到SCL被检测到高电平。这是为了确保SCL参数的最小高电平时间。
— 如果SCL是高电平,高电平计数器保持计数。
实际上,即使slave不拉长SCK,从SCL上升沿产生,到SCL上升沿被发现,这样的反馈环路也是要花费些时间的。这个回路的时间与SCL的上升时间(SCL的VIH数据检测)有关系,再加上SCL输入路径的模拟噪声滤波,以及芯片内部由于用APB时钟进行的SCL同步。反馈回路的最大时间编程在TRISE寄存器中,所以无论SCL上升时间如何,SCL的频率保持稳定。
Start condition
当BUSY=0时,设置START=1,I2C接口将产生一个Start条件,并切换至master模式(MSL被置位)。
注:在master模式下设置START位,将在当前字节传输完后,由硬件产生一个ReStart条件。
一旦发出Start条件:
● SB位被硬件置位,如果设置了ITEVTEN位,则会产生一个中断。
master读SR1寄存器,再把slave地址写入DR寄存器。(Transfer sequence EV5)
Slave address transmission
s从地址通过内部移位寄存器被送到 SDA 线上。
● 在 10 位地址模式时,发送一个头段序列产生以下事件:
− ADD10 位被硬件置位,如果设置了 ITEVFEN 位,则产生一个中断。
− 然后主设备等待一次读SR1 寄存器,跟着将第二个地址字节写入DR寄存器(见 图 138 和 图 139 传送时序)。
− ADDR 位被硬件置位,如果设置了 ITEVFEN 位,则产生一个中断。
− 随后主设备等待一次读SR1 寄存器,跟着读SR2 寄存器(见 图 138 和 图139 传送时序)。
● 在 7 位地址模式时,将送出一个地址字节。
一旦该地址字节被送出,
− ADDR 位被硬件置位,如果设置了 ITEVFEN 位,则产生一个中断。
随后主设备等待一次读SR1 寄存器,跟着读SR2 寄存器(见 图 138 和 图 139 传送时序)。
根据送出从地址的 LSB 位,主设备决定进入是发送器模式还是接收器模式。
● 在 7 位地址模式时,
− 要进入发送器模式,主设备发送从地址时让 LSB 等于 0。
− 要进入接收器模式,主设备发送从地址时让 LSB 等于 1。
● 在 10 位地址模式时
− 要进入发送器模式,主设备先送头字节(11110xx0),然后送 LSB 位等于 0的从地址。(头段字节中的 xx 是 10 位地址中的最高 2 位。)
− 要进入接收器模式,主设备先送头字节(11110xx0),然后送 LSB 位等于 0的从地址。然后再重新发送一个开始条件,后面跟着头字节(11110xx1)。
(头字节中的 xx 是 10 位地址中的最高 2 位)。TRA位指示主设备是在接收器模式还是发送器模式

2.4.2.1、主机发送模式

在发送了地址和清除了ADDR位后, 主设备master通过内部移位寄存器将字节从DR寄存器发送到SDA线上。Master等待,直到第一个数据字节被写入DR寄存器(参见EV8_1)。
当收到ACK脉冲时,TxE位被硬件置位,如果设置了INEVFEN和ITBUFEN位,则产生一个中断。
如果TxE被置位,且在上一次数据发送结束之前,没有写新的数据字节到DR寄存器,则BTF被硬件置位。在清除BTF(读I2C_SR1之后,再写I2C_DR寄存器)之前,I2C接口将保持SCL为低电平。
Closing the communication
在DR寄存器中写入最后一个字节后,通过设置STOP位产生一个停止条件(见图的EV8_2),然后I2C接口将自动回到从模式(MSL位清除)。
注:当TxE或BTF位置位时,停止条件应安排在出现EV8_2事件时。
在这里插入图片描述
说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
EV5: SB=1,读SR1然后将地址写入DR寄存器将清除该事件
EV6: ADDR=1,读SR1然后读SR2清除该事件
EV8_1: TXE=1,移位寄存器空
EV8: TXE=1,写DR寄存器清除该事件
EV8_2: TXE=1,BTF=1,产生停止条件时由硬件清除
EV9: ADDR10=1,读SR1然后写DR寄存器清除该事件
Figure 4-4 Transfer sequence diagram for master transmitter
Note:
1- EV5, EV6, EV8_1和EV8_2事件,拉长SCL的低电平,直到相应的软件sequence执行结束
2- EV8软件sequence必须在当前字节发送完成前执行完毕。在EV8的软件sequence不能在当前传输的字节结束前被完成,推荐使用BTF代替TxE,这产生的不利是减慢了通讯。

2.4.2.2、主机接收模式

在发送地址和清除ADDR之后,I2C接口进入主接收器模式。在此模式下,I2C接口从SDA线接收数据字节,并通过内部移位寄存器送至DR寄存器。在每个字节后,I2C接口依次执行以下操作:
● 如果ACK位被置位,发出一个应答脉冲。
● 硬件设置RxNE=1,如果设置了INEVFEN和ITBUFEN位,则会产生一个中断。
如果RxNE位被置位,并且在接收新数据结束前, DR寄存器中的数据没有被读走,硬件将设置BTF=1,在清除BTF之前I2C接口将保持SCL为低电平;读出I2C_SR1之后再读出I2C_DR寄存器将清除BTF位。
Closing the communication
Method 1:该方法的应用场景是:当I2C被设成应用程序中最高优先级的中断
Master在从Slave接收到最后一个字节后,发送一个NACK。接收到NACK后,Slave释放对SCL和SDA线的控制。Master就可以发送一个Stop/Restart条件。

  1. 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
  2. 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
  3. 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的产生位。在产生了停止条件后,I2C接口自动回到从模式(MSL位被清除)。
    在这里插入图片描述
    Figure 4-5 Method 1: transfer sequence diagram for master receiver
    说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
    EV5:SB=1,读SR1,再写DR寄存器,该位被清零
    EV6:ADDR=1,读SR1,再读SR2,该位被清零
    EV6_1:无相关的标志事件,仅用作1个字节的接收。
    EV7:RxNE=1,读DR寄存器,该位被清零
    EV7_1:RxNE=1, 读DR寄存器,写ACK=0并置位STOP
    EV9: ADDR10=1,读SR1然后写DR寄存器清除该事件
    NOTE:
    1) 如果是单个字节接收,则上述标注为(1)的地方会是NA
    2) EV5, EV6事件,拉长SCL的低电平,直到相应的软件sequence执行结束
    3) EV7软件sequence必须在当前字节发送完成前执行完毕。在EV7,软件sequence不能在当前传输的字节传输完成前,被管理。推荐使用BTF代替RXNE,这产生的不利是减慢了通讯。
    4) EV6_1或者EV7_1的软件sequence必须在当前字节传输的ACK之前完成。

Method 2: 这个方法的应用场景是:I2C的中断在应用中不是最高优先级,或者使用查询方式
用这个方法,DataN_2没有被读,因此在DataN-1之后,通讯被拉长(RxNE和BTF都被置位)。然后,在读DR寄存器的DataN_2前,清ACK位,以确保在DataN ACK之前被清掉。在此之后,在读DataN-2之后,置位STOP/START位,并读DataN-1。在RxNE置位后,读DataN

在这里插入图片描述
Figure 4-6 Method2: transfer sequence diagram for mater receiver when N>2
说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
EV5:SB=1, 先读SR1寄存器,再写DR寄存器,清零该位
EV6:ADDR,先读SR1,再读SR2,清零该位
EV7:RxNE=1, 读DR寄存器清零该位
EV7_2:BTF=1, DataN-2存在DR寄存器中,DataN-1存在shift寄存器中,写ACK=0,读DR寄存器中的DataN-2。置位STOP,读DataN-1
EV9: ADDR10=1,读SR1然后写DR寄存器清除该事件
Note:
1) EV5, EV6事件,拉长SCL的低电平,直到相应的软件sequence执行结束
2) EV7软件sequence必须在当前字节发送完成前执行完毕。在EV7,软件sequence不能在当前传输的字节传输完成前,被管理。推荐使用BTF代替RXNE,这产生的不利是减慢了通讯。
●当3个字节要被读走:
— RxNE=1 => Nothing(DataN-2 not read)。
— DataN-1 received
— BTF=1, shift和data寄存器都是full:DR寄存器存放了DataN-2,shift寄存器存放了DataN-1 => SCL拉低:总线上没有其他要被接收的数据
— 清零ACK位
— 读DR寄存器中的DataN-2 => 这将启动shift寄存器对DataN的接收
— DataN接收完成(with a NACK)
— 写START或者STOP位
— 读DataN-1
— RxNE=1
— 读DataN
以上流程是针对N > 2的描述。1个字节和2个字节的接收,要用不同的处理方式,参见以下描述:
● 2个字节接收的情况
— 置位POS和ACK位
— 等待ADDR置位
— 清零ADDR位
— 清零ACK位
— 等待BTF被置位
— 写STOP位
— 读DR两次
在这里插入图片描述
Figure 4-7 Method 2: transfer sequence diagram for master receiver when N=2
说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)
EV5:SB=1, 先读SR1寄存器,再写DR寄存器,清零该位
EV6:ADDR=1,先读SR1寄存器,后读SR2寄存器,清零ADDR位
EV6_1:无相关的标志位事件。在EV6后,也就是地址被清零后,ACK应该被清零
EV7_3:BTF=1,写STOP=1,之后读两次DR(Data1和Data2)
EV9: ADDR10=1,读SR1然后写DR寄存器清除该事件

Note:

  1. EV5, EV6事件,拉长SCL的低电平,直到相应的软件sequence执行结束
  2. EV6_1的软件sequence必须在当前字节传输的ACK之前完成
    ● 单个字节接收的情况
    — 在ADDR事件里,清零ACK位
    — 清零ADDR
    — 写STOP或者START位
    — 在RxNE标志置位后,读数据
    在这里插入图片描述
    说明:S=start, Sr=restart, P=stop, A=ack,NA=nack,EVx=event(当ITEVTEN=1时产生中断)

Figure 4-8 Method 2: transfer sequence diagram for master receiver when N=1
Legend: S= Start, Sr= Repeated Start, P= Stop, A= Acknowledge, EVx= Event(with interrupt if ITEVFEN= 1)
EV5:SB=1, 先读SR1寄存器,再写DR寄存器,清零该位
EV6_3:ADDR=1,写ACK=0。先读SR1寄存器,后读SR2寄存器,清零ADDR位。在ADDR被清零后,写STOP=1
EV7:RxNE=1, 读DR寄存器清零该位
EV9: ADDR10=1,读SR1然后写DR寄存器清除该事件

Note:
EV5, EV6, EV8_1和EV8_2事件,拉长SCL的低电平,直到相应的软件sequence执行结束。

2.5、标志位

2.5.1、状态标志

2.5.1.1、错误标志

Bus error
在一个地址或数据字节传输期间,当I2C接口检测到一个外部的停止或起始条件则产生总线错误。此时:
● BERR位被置位为’1’;如果设置了ITERREN位,则产生一个中断;
● 在slave模式:数据被丢弃,硬件释放总线:
─ 如果是错误的Start条件,slave认为是一个Restart,并等待地址或停止条件
─ 如果是错误的Stop条件,slave按正常的停止条件操作,同时硬件释放总线
● 在master模式:硬件不释放总线,同时不影响当前的传输状态。此时由软件决定是否要中止当前的传输。
在这里插入图片描述

图 从模式下在发送数据 来一个错误的start产生bus error
Acknowledge failure (AF)
该标志位有以下两种产生情况:
1.master receiver和slave transmitter模式下的数据传输完成
2.地址不匹配

当接口检测到一个无应答位时,产生应答错误。此时:
● AF位被置位,如果设置了ITERREN位,则产生一个中断
● 当发送器接收到一个NACK时,必须复位通讯:
─ 如果是处于slave模式,硬件释放总线。
─ 如果是处于master模式,软件必须生成一个停止条件或者repeated start。

Arbitration lost (ARLO)
产生条件:两个I2C主机竞争一个slave时,同时产生start,则谁sda先变化丢失控制权,产生arlo错误。
当I2C接口检测到仲裁丢失时产生仲裁丢失错误,此时:
● ARLO位被硬件置位,如果设置了ITERREN位,则产生一个中断
● I2C接口自动回到从模式(MSL位被清除)。当I2C接口丢失了仲裁,则它无法在同一个传输中响应它的从地址,但它可以在赢得总线的master发送repeated start条件之后响应
● 硬件释放总线
Overrun/underrun error (OVR)
在slave模式下,如果禁止时钟延长(nostretch = 1),I2C接口正在接收数据时,当它已经接收到一个字节(RxNE=1),但在DR寄存器中前一个字节数据还没有被读出,则发生overrun错误。
此时:
● 最后接收的数据被丢弃
● 在overrun错误时,软件应清除RxNE位,发送器应该重新发送最后一次发送的字节
在slave模式下,如果禁止时钟延长,I2C接口正在发送数据时,在下一个字节的时钟到达之前,新的数据还未写入DR寄存器(TxE=1),则发生欠载错误。此时:
● 在DR寄存器中的前一个字节将被重复发出
● 用户应该确定在发生underrun错时,接收端应丢弃重复接收到的数据。发送端应按I2C总线标准在规定的时间更新DR寄存器
在发送第一个字节时,必须在清除ADDR之后且在第一个SCL上升沿之前写入DR寄存器;如果不能做到这点,则接收方应该丢弃第一个数据。

2.6、DMA功能

DMA请求(当被使能时)仅用于数据传输。发送时数据寄存器变空,或接收时数据寄存器变满,则产生DMA请求。DMA必须在当前字节传输结束之前被初始化和使能。DMAEN位(I2C_CR2寄存器中)必须在ADDR事件发生前使能。
在master或者slave模式,当时钟延展功能使能,DMAEN位可以在清零ADDR之前的ADDR事件期间置位。DMA请求必须在当前字节传输完成之前响应。当DMA传输数据长度达到DMA设定的值时,DMA controller向I2C发送EOT(End of transfer),并产生transfer complete中断(如果中断使能位有效):
● Master transmitter:在EOT中断服务程序中,需禁止DMA请求,然后在等到BTF事件后,置位stop条件。
● Master receiver:当要接收的数据数目大于或等于2时,DMA controller发送一个硬件信号EOT_1,它对应DMA传输(字节数-1)。如果在I2C_CR2寄存器中设置了LAST位,硬件在发送完EOT_1后的下一个字节,将自动发送NACK。在中断允许的情况下,用户可以在DMA传输完成的中断服务程序中产生一个停止条件。
Transmission using DMA
通过置位I2C_CR2寄存器中的DMAEN位,可以使能DMA模式。只要TxE位被置位,数据将由DMA从预置的存储区,装载进I2C_DR寄存器。为I2C分配一个DMA通道,须执行以下步骤(x是通道号):

  1. 在DMA_CPARx寄存器中设置I2C_DR寄存器地址。数据将在每个TxE事件后,从存储器传送至这个地址。
  2. 在DMA_CMARx寄存器中设置存储器地址。数据在每个TxE事件后从这个存储区传送至I2C_DR。
  3. 在DMA_CNDTRx寄存器中设置所需的传输字节数。在每个TxE事件后,此值将被递减。
  4. 利用DMA_CCRx寄存器中的PL[0:1]位配置通道优先级。
  5. 设置DMA_CCRx寄存器中的DIR位,并根据应用要求可以配置在整个传输完成一半或全部完成时发出中断请求。
  6. 通过设置DMA_CCTx寄存器上的EN位激活通道。
    当DMA控制器中设置的数据传输数目已经完成时,DMA控制器给I2C接口发送一个传输结束的EOT/EOT_1信号。在中断允许的情况下,将产生一个DMA中断。
    注:如果使用DMA进行发送时,不要设置I2C_CR2寄存器的ITBUFEN位。
    Reception suing DMA
    通过设置I2C_CR2寄存器中的DMAEN位可以激活DMA接收模式。每次接收到数据字节时,将由DMA把I2C_DR寄存器的数据传送到设置的存储区(参考DMA说明)。设置DMA通道进行I2C接收,须执行以下步骤(x是通道号):
  7. 在DMA_CPARx寄存器中设置I2C_DR寄存器的地址。数据将在每次RxNE事件后从此地址传送到存储区。
  8. 在DMA_CMARx寄存器中设置存储区地址。数据将在每次RxNE事件后从I2C_DR寄存器传送到此存储区。
  9. 在DMA_CNDTRx寄存器中设置所需的传输字节数。在每个RxNE事件后,此值将被递减。
  10. 用DMA_CCRx寄存器中的PL[0:1]配置通道优先级。
  11. 清除DMA_CCRx寄存器中的DIR位,根据应用要求可以设置在数据传输完成一半或全部完成时发出中断请求。
  12. 设置DMA_CCRx寄存器中的EN位激活该通道。
    当DMA控制器中设置的数据传输数目已经完成时,DMA控制器给I2C接口发送一个传输结束的EOT/EOT_1信号。在中断允许的情况下,将产生一个DMA中断。
    注:如果使用DMA进行接收时,不要设置I2C_CR2寄存器的ITBUFEN位。

2.7、中断

I2C中断请求
在这里插入图片描述

2.8、系统管理总线SMbus

SMBus和I2C之间相似点:
● 2 条线的总线协议(1 个时钟,1 个数据) + 可选的 SMBus 提醒线
● 主-从通信,主设备提供时钟
● 多主机功能
● SMBus数据格式类似于I2C的 7 位地址格式

2.8.1、地址解析协议(ARP)

SMBus 从地址冲突可以通过给每个从设备动态分配一个新的唯一地址来解决。
ARP 有以下的属性:
● 地址分配利用标准 SMBus 物理层仲裁机制
● 当设备维持供电期间,分配的地址仍保持不变,允许设备在断电时保留其地
址。
● 在地址分配后,没有额外的 SMBus 的打包开销(也就是说访问分配地址的设
备与访问固定地址的设备所用时间是一样的)。
● 任何一个 SMBus 主设备可以遍历总线。

2.8.2、SMBus提醒模式(ALERT)

SMBus 提醒是一个带中断线的可选信号,用于那些希望扩展他们的控制能力而牺牲一个引脚的设备。SMBALERT 和 SCL 和 SDA 信号一样,是一种线与信号。SMBALERT 通常和 SMBus 广播呼叫地址一起使用。与 SMBus 有关的消息为 2字节。
单一的从设备可以通过 SMBALERT 发信号给主机表示它希望进行通信,这可通过设置 I2C_CR1 寄存器上的 ALERT 位实现。主机处理该中断并通过提醒响应地址 ARA(Alert Response Address,地址值为 0001100x)访问所有 SMBALERT 设备。只有那些将 SMBALERT 拉低的设备能应答 ARA。此状态是由 I2C_SR1 寄存器中的 SMBALERT 状态标记来标识的。主机执行一个修改过的接收字节操作。由从发送设备提供的 7 位设备地址被放在字节的 7 个最高位上,第八个位可以是 0 或 1。
如果多个设备把 SMBALERT 拉低,最高优先级设备(最小的地址)将在地址传输期间通过标准仲裁赢得通信权。在确认从地址后,此设备不得再拉低它的SMBALERT,如果当信息传输完成后,主机仍看到 SMBALERT 低,就知道需要再次读 ARA。没有执行SMBALERT信号的主机可以定期访问ARA。

2.8.3、总线协议4.8.4 超时错误(TIMEOUT)

在定时规范上 I2C 和 SMBus 之间有很多差别。SMBus定义一个时钟低超时,35ms的超时。SMBus规定TLOW:SEXT为从设备的累积时钟低扩展时间。SMBus规定TLOW:MEXT为主设备的累积时钟低扩展时间。I2C_SR1 中的状态标志 Timeout 或 Tlow 错误表明了这个特征的状态。

3、寄存器描述

寄存器可以half-word或者word访问。

3.1、I2C Control register 1 (I2C_CR1)

Address offset:0x00
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、I2C Control register 2 (I2C_CR2)

Address offset:0x04
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3、I2C Own address register1 (I2C_OAR1)

Address offset:0x08
Reset value:0x4000
在这里插入图片描述
在这里插入图片描述

3.4、I2C own address register2(I2C_OAR2)

Address offset:0x0C
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述

3.5、I2C Data register(I2C_DR)

Address offset:0x10
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6、I2C Staus register (I2C_SR1)

Address offset:0x14
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.7、I2C Status register2 (I2C_SR2)

Address offset:0x18
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.8、I2C Clock control register(I2C_CCR)

Address offset:0x1c
Reset value:0x0000
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.9、I2C TRISE register (I2C_TRISE)

Address offset:0x20
Reset value:0x0002
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白蒋博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值