概述
I2C是一种双线双向串行总线,它提供了一种简单、高效的数据交换方法,最大限度地减少了设备之间的互连。这种总线适用于需要在许多设备之间短距离偶尔进行通信的应用。灵活的I2C标准允许将额外的设备连接到总线以进行扩展和系统开发。请参见下图中的连接图。
设备与I2C总线的连接
I2C接口速度取决于I2C总线负载和时序特性。
有关引脚要求的详细信息,请参阅I2C总线规范。I2C系统是一种真正的多主总线,包括仲裁和冲突检测,如果多个设备试图同时控制总线,则可以防止数据损坏。此功能支持具有多处理器控制的复杂应用程序,并可用于通过与装配线计算机的外部连接快速测试和校准最终产品。
下图显示了I2C的框图。
I2C框图
特征
I2C具有以下关键功能:
•与I2C总线标准兼容
•多主机操作
•64种不同串行时钟频率之一的软件可编程性
•软件可选确认位
•中断驱动,逐字节数据传输
•仲裁丢失中断,自动模式从主机切换到从机
•呼叫地址识别中断
•启动和停止信号生成/检测
•重复启动信号生成
•确认位生成/探测
•总线繁忙检测
模式和操作
I2C主要在两种功能模式下运行:标准模式和快速模式。
•在标准模式下,I2C支持高达100 kbits/s的数据传输速率。
•在快速模式下,可以实现高达400 kbits/s的数据传输速率。对于每个块操作,快速或标准模式不需要特殊配置。区分标准模式和快速模式的是数据传输速率。
外部信号
本节讨论连接芯片外的I2C信号。
为了符合I2C,所有连接到I2Cn_SCL和I2Cn_SDA信号的设备都必须具有开路漏极或开路集电极输出。逻辑与功能通过外部上拉电阻器在两条线路上实现。
在相应的PAD被选择为I2C功能之后,I2Cn_SCL和I2Cn_SDA的输入也需要通过在IOMUX中设置SION位来手动启用。
下表描述了连接芯片外的所有I2C信号
时钟
I2C有两个输入时钟。
下表介绍了I2C的时钟源。有关时钟设置、配置和选通信息,请参阅时钟控制器模块(CCM)。
•外围时钟:该时钟用于外围总线寄存器的读/写。
•模块时钟:这是I2C的功能时钟。串行位时钟频率是从模块时钟中得出的。模块时钟和外围时钟彼此同步。对于快速模式,模块时钟的最低频率应为12.8 MHz,以实现400 kbps的操作
功能描述
本节提供了块的完整功能描述。
I2C系统配置
复位后,I2C默认为从接收操作。因此,当不作为主设备操作或响应从设备发送地址时,I2C默认为从设备接收状态。
有关例外情况,请参见初始化顺序。
注:I2C设计为与PhilipsTM I2C总线协议兼容。有关系统配置、协议和限制的信息,请参阅飞利浦半导体公司的I2C总线规范2.1版。I2C仅支持标准和快速模式。
仲裁程序
如果多个设备同时请求总线,则通过同步过程来确定总线时钟,其中低周期等于设备中最长的时钟低周期,而高周期等于最短的时钟。数据仲裁过程确定竞争设备的相对优先级。
如果一个设备发送逻辑高,而另一个设备则发送逻辑低,则该设备失去仲裁;它立即切换到从接收模式并停止驱动I2Cn_ SDA。在这种情况下,从主模式到从模式的转换不会产生停止条件。同时,硬件在I2C状态寄存器中设置仲裁丢失位(I2C_I2SR[IIAL]表示仲裁丢失)
时钟同步
由于使用了线与逻辑,SCL上的高到低转换会影响连接到总线的设备。当主驱动器SCL处于低位时,设备开始计算其低位时段。当设备时钟变低时,它将SCL保持在低电平,直到达到时钟高电平状态。然而,如果另一个设备时钟仍处于其低周期,则该设备时钟的从低到高的变化可能不会改变SCL的状态。因此,具有最长低周期的设备将同步时钟SCL保持为低。
低周期较短的设备在此期间进入高等待状态(见图31-3)。当所涉及的所有设备都已计数掉它们的低周期时,同步时钟SCL被释放并被拉高。然后,设备时钟和SCL状态之间没有差异,因此所有设备都开始计数它们的高周期。第一个完成其高电平周期的设备再次将SCL拉低。
信号交换
时钟同步机制可以用作数据传输中的握手。在完成一个字节的传输(9位)之后,从设备可以将SCL保持为低电平。在这种情况下,时钟机制停止总线时钟,并迫使主时钟进入等待状态,直到从时钟释放SCL。
时钟伸展
从设备可以使用时钟同步机制来降低传输比特率。
在主设备将SCL驱动为低电平后,从设备可以将SCL低电平驱动所需的时段,然后将其释放。如果从设备SCL低时段长于主设备SCL高时段,则所产生的SCL总线信号低时段将被拉伸。
外围总线访问
如果在外围从总线接口上接收到一个地址,但该地址未被实现,则会产生访问错误。
复位
I2C可以通过以下方式复位:•全局复位:整个I2C的硬异步复位•软件复位:通过解除I2C_I2CR[IEN]位的断言来启动整个I2C(I2C_IADR和I2C_IFDR寄存器除外)的内部复位
中断
块中只有一个中断,通过设置I2C_I2CR[IIEN]位使能。
在以下任何一种情况下都会产生中断:•完成一个字节的传输(中断设置在第九个时钟的下降沿)。
•在从接收模式下,接收到与其自身特定地址相匹配的地址。
•仲裁失败。
字节顺序
该块仅支持Little Endian模式
初始化
注:确保IOMUXC的输入选择引脚已针对I2C正确配置。
初始化序列
在接口可以传输串行数据之前,必须初始化寄存器,如下所示。
1.设置数据采样率(I2C_IFDR[IC])以从系统总线时钟获得SCL频率。
2.更新(I2C_IADR)中的地址以定义其从属地址(地址范围可以从0到0x7f)。
3.设置I2C使能位(I2C_I2CR[IEN])以使能I2C总线接口系统。
4.修改I2C_I2CR中的位,以选择主/从模式、传输/接收模式和中断启用或不启用。
启动的生成
初始化程序完成后,可以通过选择主传输模式来传输串行数据。在多主总线系统上,必须测试繁忙总线(I2C_I2SR[IBB]),以确定串行总线是否空闲。如果总线空闲(IBB=0),则可以发送起始信号和第一个字节(从地址)。写入数据寄存器的数据包括所需从设备的地址,LSB指示传输方向。
停止和下一个启动条件之间的空闲时间内置于生成启动周期的硬件中。根据系统时钟和SCL周期的相对频率,在将调用地址写入数据寄存器(I2C_I2DR)之后,可能需要等待直到I2C不忙,然后再将数据加载到数据寄存器(12C_I2DR)。
传输后软件响应
发送或接收一个字节设置数据传输位(I2C_I2SR[ICF]),这表示一个字节的通信已完成。一旦完成,中断状态(I2C_I2SR[IIF])也被设置。如果设置了中断使能(I2C_I2CR[IIEN]),则会产生外部中断。软件必须首先清除中断例程中的中断状态(I2C_I2SR[IIF])。
参见图31-5中的流程图。
数据传输位(I2C_I2SR[IFC])通过在接收模式下从I2C_I2DR读取或在发送模式下写入该寄存器来清除。
如果中断使能被取消断言,软件可以通过监测中断状态(I2C_I2SR[IIF])来为主程序中的I2C I/O提供服务。在这种情况下,应该在数据传输位(I2C_I2SR[ICF])中轮询中断状态,因为当仲裁丢失时,操作是不同的。
当地址周期结束时发生中断时,主机始终处于传输模式;也就是说,地址被发送。如果需要主接收模式,则应切换I2C_I2CR[MTX],并且必须执行I2C_I2DR寄存器的伪读取以触发接收数据。
在从模式地址周期(I2C_I2SR[IAAS]=1)期间,读取从读/写位I2C_I2SR[SRW]以确定下一次传输的方向。发送/接收位(I2C_I2CR[MTX])也应进行相应编程。对于从模式数据周期(IAAS=0),SRW无效。应读取MTX以确定当前传输方向。
停止的生成
当主机发出停止信号时,数据传输结束,这可能发生在发送所有数据之后。
主接收器要终止数据传输,必须通过不确认最后一个数据字节来通知从属发送器。这是通过在读取倒数第二个字节之前设置发送确认位(I2C_I2CR[TXAK])来完成的。在读取最后一个字节之前,必须生成一个停止信号
重复启动的生成
在数据传输之后,如果主设备仍然需要总线,它可以发出另一个开始的信号,然后是另一个从设备地址,而不发出停止的信号。
从模式
在从属中断服务例程(见图31-5)中,应测试寻址为从属位(IAAS)的块,以检查是否刚刚接收到对其自身地址的调用。如果设置了IAAS,软件应根据I2C_I2SR[SRW]设置发送/接收模式选择位(I2C_I2CR[MTX])。写入I2C_I2CR会自动清除IAAS。IAAS按设置读取的唯一时间是从发生地址匹配的地址周期结束时的中断开始;后续数据传输产生的中断将清除IAAS。现在可以通过将信息写入I2C_I2DR进行从机传输或在从机接收模式下从I2C_I2DR中读取来启动数据传输。在从接收模式下对I2C_I2DR的伪读取会释放SCL,从而允许主机发送数据。
在从发射机例程中,在发送下一个字节的数据之前,必须测试接收确认位(I2C_I2SR[RXAK])。设置RXAK意味着来自主接收机的数据信号的结束,在此之后
仲裁失败
如果多个设备试图同时接入总线,其中一个设备将成为主设备。硬件会立即将失去仲裁的设备切换到从属接收模式。向12Cn_SDA输出的数据停止,但12Cn_SCL仍然生成,直到仲裁丢失的字节结束。如果仲裁丢失(I2C_I2SR[IIAL]=1),并且选择从模式(I2C_ I2CR[MSTA]=0),则在该传输的第九个时钟的下降沿发生中断。
如果不是主设备的设备试图传输或启动,硬件会禁止传输,清除MSTA而不发出停止信号,向Arm平台生成中断,并设置I2C_I2SR[IIAL]以指示尝试接入总线失败。在考虑这些情况时,从服务例程应首先测试I2C_I2SR[IIAL],如果已设置,则软件应将其清除。
对于多主控模式,当I2C在总线繁忙时启用并断言启动时,I2C_I2SR[IIAL]位
I2C编程状态图
典型I2C中断例程流程图
注:仅对于重复启动,停止生成阶段不会在主模式下发生。一个循环在下一次开始时不停地重复。
对于主接收模式,I2C在地址模式期间和从地址传输之后被编程为主传输;应当清除MTX位并且应当执行对I2C_ I2DR寄存器的伪读取,使得I2C能够读取下一个接收数据。
典型I2C轮询例程的流程图
注:超时值取决于I2C运行的总线频率。在最大I2C总线频率为400 kHz时轮询IIF位的最小超时为Tmin=25μs(=2.5 x 10μs)。该值可以针对任何总线频率进行计算。公式为Tmin=10/FSCL,其中FSCL是I2C时钟(SCL)的频率。
典型I2C主传输模式的详细流程图,第1部分
典型I2C主传输模式的详细流程图,第2部分
显示了带有中断子程序的主传输模式操作。如果产生中断并且MSTA位为0,则总线仲裁将丢失,并设置IAL。软件可以清除IAL位并重新编程I2C。如果MSTA位为1,则它是传输生成的中断。在这种情况下,软件可以检查RXAK位以获得从机的数据接收确认,并相应地决定执行以下操作之一:•生成STOP•通过写入I2C_I2CR寄存器生成REPEATED START•通过写入到I2C_I2DR寄存器执行下一次数据传输注意IBB位由总线上的START条件断言,并且它被总线上的停止条件解除断言。因此,如果仲裁在传输过程中由于意外的“停止”条件而丢失,则IBB将被清除。如果仲裁因数据不匹配而丢失,则不会清除。软件应始终清除IEN位,然后在仲裁丢失时进行设置。
软件限制
软件应确保在设置I2C_I2CR[RSTA]位之后和写入I2C_I2DR寄存器之前至少有两个模块时钟周期的延迟。模块时钟的最大可能时钟周期为78ns。
I2C内存映射/寄存器定义
I2C包含五个16位寄存器。
注:偏移量为0x0002、0x0006、0x000A和0x000E的寄存器保留以备将来添加。
I2C地址寄存器(I2Cx_IADR)
BIT[7:1]从属地址。包含I2C要使用的特定从属地址。从模式是总线上地址匹配的默认I2C模式。
注:I2C_IADR保存I2C作为从机寻址时响应的地址。从地址不是在地址传输期间在总线上发送的地址。寄存器不是通过软件重置来重置的。
I2C分频器寄存器(I2Cx_IFDR)
I2C_IFDR提供了一个可编程预分频器来配置用于比特率选择的时钟。寄存器不会被软件重置。
I2C时钟来源于从IPG_CLK_ROOT路由的PERCLK_ROOT。通过使用以下公式可以容易地获得I2C时钟频率:
I2C时钟频率=(PERCLK_ROOT频率)/(与IFDR对应的分频因子)
默认情况下,IPG_CLK_ROOT和PERCLK_ROUT频率设置为49.5 MHz,其中根时钟来源于PLL2的PFD2。可以通过以下方式获得频率:
PLL2=528兆赫
PLL2_PFD2=528兆赫*18/24=396兆赫
IPG_CLK_ROOT=(PLL2_PFD2/ahb_podf)/IPG_podf=(396兆赫/4)/2=49.5兆赫
PER_CLK_ROOT=IPG_CLK-ROOT/perclk_podf=49.5兆赫/1=49.5兆赫
注:以上计算假设使用默认CCM寄存器设置、路由和除法因子。如果使用不同的路由、PFD值和/或分频因子,用户必须相应地调整参数以计算正确的时钟频率。
下表描述了寄存器字段“IC”的除法器和寄存器值。
I2C时钟速率。预缩放时钟以进行比特率选择。由于I2Cn_SCL和I2Cn_SDA的上升和下降时间可能较慢,总线信号以预分频器频率采样。串行位时钟频率可能低于IPG_CLK_ROOT除以I2C数据I/O寄存器中所示的分频器。
注:IC值在数据传输过程中不应更改,但可以在I2C中的重复启动或启动编程序列之前更改。I2C协议支持高达400 kbps的比特率。需要根据该约束条件对IC位进行编程。
I2C控制寄存器(I2Cx_I2CR)
I2C_I2CR用于启用I2C和I2C中断。它还包含控制作为从设备或主设备的操作的位。
BIT7
I2C启用。还控制整个I2C的软件复位。重置位将生成对块的内部重置。如果在字节传输过程中启用了块,则从模式将忽略当前总线传输,并在检测到下一个启动条件时开始运行。主模式不知道总线繁忙,因此启动启动周期可能会破坏当前总线周期,最终导致当前主模式或I2C失去仲裁。随后,公交车运行恢复正常。
0 块被禁用,但寄存器仍然可以访问。
1 I2C已启用。在任何其他I2C_I2CR位产生效果之前,必须设置此位。
BIT6
I2C中断启用。
注:如果在启动条件下写入数据,即在设置I2C_I2CR[MSTA]和I2C_I2CR[MTX]位之后,则ICF位在启动后SCLK的下降沿被清除。如果在SCLK的开始条件和下降沿之后写入数据,则一旦写入数据,ICF位就被清除。
0 I2C中断被禁用,但当中断条件发生时,状态标志I2C_I2SR[IIF]继续被设置。
1 I2C中断被启用。如果还设置了I2C_I2SR[IIF],则会发生I2C中断
BIT5
主/从模式选择位。如果主机失去仲裁,MSTA将被清除,而不会生成停止信号。
注意:模块时钟应开启,以便写入MSTA位。
注:MSTA位由软件清除,以生成停止条件;当I2C失去总线仲裁时,它也可以由硬件清除。
0从模式。将MSTA从1更改为0将生成“停止”并选择“从”模式。
1主模式。将MSTA从0更改为1在总线上发出启动信号并选择主模式
BIT4
发送/接收模式选择位。选择主传输和从传输的方向。
0接收。
当对从机进行寻址时,软件应根据I2C状态寄存器(I2C_I2SR[SRW])中的从机读/写位设置MTX。
1传输。
在主模式下,应根据所需传输类型设置MTX。因此,对于地址周期,MTX始终为1。
BIT3
传输确认启用。指定在主接收器和从接收器的确认周期期间驱动到I2Cn_SDA的值。
注:写入TXAK仅适用于I2C总线为接收器的情况。
0在接收到一个字节的数据后,在第九个时钟位向总线发送确认信号。
1没有发送确认信号响应(即,确认比特=1)。
BIT2
重复启动。始终读取为0。尝试在没有总线主控权的情况下重复启动会导致仲裁失败。
0无重复启动
1生成重复启动条件
I2C状态寄存器(I2Cx_I2SR)
I2C_I2SR包含指示事务方向和状态的位。
BIT7
数据传输位。当传输一个字节的数据时,ICF被清除。
0传输正在进行中。
1传输完成。该位由最后一个字节传输的第九个时钟的下降沿设置。
BIT6
I2C寻址为从位。如果设置了中断启用(I2C_I2CR[IIEN]),则Arm平台会中断。Arm平台必须检查从读/写位(SRW),并相应地设置其传输/接收模式。写入I2C_I2CR将清除此位。
0未寻址
1寻址为从机。当它自己的地址(I2C_IADR)与调用地址匹配时设置。
BIT5
I2C总线忙位。指示总线的状态。
注:启用I2C时(I2C_I2CR[IEN]=1),它会连续轮询总线数据(SDA)和时钟(SCL)信号,以确定启动或停止条件。
0总线处于空闲状态。如果检测到停止信号,则IBB被清除。
1路公交车很忙。当检测到启动时,设置IBB。
BIT4
仲裁失败。在以下情况下由硬件设置(IAL必须由软件通过在中断服务例程开始时向其写入“0”来清除):•在地址或数据传输周期期间,当主设备驱动高时,I2Cn_SDA输入采样为低。
•在数据接收周期的确认位期间,当主设备驱动为高时,I2Cn_SDA输入采样为低。
对于以上两种情况,在ACK周期期间,该位被设置在第九I2Cn_SCL时钟的下降沿。
•当总线繁忙时,尝试启动循环。
•在从属模式下请求重复启动循环。
•当主机没有请求时,检测到停止条件。
注意:软件无法设置位。
0没有仲裁失败。
1仲裁失败。
BIT2
从读/写。当I2C被寻址为从机时,IAAS被设置,从机读/写位(SRW)指示从主机发送的调用地址的R/W命令位的值。只有当发生了完整的传输,没有启动其他传输,并且I2C是从设备并且具有地址匹配时,SRW才有效。
0从机接收,主机写入从机
1从机发送,主机从机读取
BIT1
I2C中断。必须由软件通过在中断例程中向其写入“0”来清除。
注意:软件无法设置位。
0无I2C中断挂起。
1中断挂起
这会导致处理器中断请求(如果中断使能被断言[IIEN=1])。当以下情况之一发生时,设置中断:•一个字节传输完成(中断设置在第九个时钟的下降沿)。
•在从接收模式下,接收到与其自身特定地址相匹配的地址。
•仲裁失败
BIT0
收到确认。这是在总线周期期间从用于确认位的I2Cn_SDA输入接收的值。
0在总线上完成8位数据传输后,收到“确认”信号。
1在第九个时钟检测到“无确认”信号。
I2C数据I/O寄存器(I2Cx_I2DR)
在主接收模式下,读取数据寄存器可以进行读取并启动下一个要接收的字节。在从属模式下,寻址后也可以使用相同的功能。
DATA
数据字节。保存接收到的最后一个数据字节或要传输的下一个数据比特。软件写入下一个要传输的数据字节或读取接收到的数据字节。
注:I2C_I2DR中的核心写入值无法由核心读取。只能读取I2C总线侧写入的数据。
如果文章对您有帮助,点赞👍支持,感谢🤝