I2C接口(续一)
I2C接口共涉及到18个寄存器,下面就来对它们进行具体分析。
先来看配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40050000(I2C0),0x40054000(I2C1),0x40070000(I2C2),0x40074000(I2C3)。

CFG寄存器包含适用于主机、从机及监视器功能的模式设置。
接下来看状态寄存器STAT,下表是它的全部位结构,其地址分别为0x40050004(I2C0)、0x40054004(I2C1)、0x40070004(I2C2)、0x40074004(I2C3)。

上述STAT寄存器提供关于I2C模块全部功能的状态标志和状态信息,该寄存器中的某些信息为只读信息,某些标志位可通过写入1清除。该寄存器各个位的访问权限各不相同,标记RO为只读,W1为写入1清除。下面分别给出了STAT寄存器中MSTSTATE和SLVSTATE位所描述的主机和从机状态的详细情况。


接下来看中断使能设置及读取寄存器INTENSET,下表是它的全部位结构,其地址分别为0x40050008 (I2C0),0x40054008 (I2C1),0x40070008 (I2C2)和0x40074008 (I2C3))。

INTENSET寄存器管控由哪个I2C状态标志生成中断。在此寄存器的位位置中写入1会使能STAT寄存器的相应位置中的中断(如果此处支持中断)。读取INTENSET,显示哪些中断当前已使能。
下面是中断使能清除寄存器INTENCLR,该寄存器为只写属性,下表是它的全部位结构,其地址分别为0x4005000C (I2C0),0x4005400C (I2C1),0x4007000C (I2C2)和0x4007400C (I2C3))。

在INTENCLR的位位置中写入1会清除INTENSET寄存器中的相应位置,同时禁用该中断。INTENCLR是一个只写寄存器。会保留与INTENSET中的限定位不相应的位,且这些位中只能写入0。
接下来是超时寄存器TIMEOUT,下表是它的全部位结构,其地址分别为0x40050010 (I2C0),0x40054010(I2C1),0x40070010 (I2C2)和0x40074010 (I2C3))。

TIMEOUT寄存器允许给I2C总线时间设定上限值,超过这些时间限制时,则通过状态标志和/或中断发出通知。共生成两种超时,软件可选择使用任意一种。
1.在总线不处于闲置状态时,由EVENTTIMEOUT检查总线时间之间的时间间隔: 开 始、SCL上升、SCL下降以及停止。如果任意两个事件之间的时间间隔长于TIMEOUT寄存器配置的时间间隔,则STAT寄存器中的EVENTTIMEOUT状态标志置位。如果EVENTTIMEOUT状态标志由INTENSE寄存器中的EVENTTIMEOUTEN位使能,用于引发中断,则可引发中断。
2.SCLTIMEOUT只会检测如下这种时间:SCL信号保持低位,同时总线处于非闲置状态。如果SCL保持低位的时间长于TIMEOUT寄存器配置的时间,则STAT寄存器中的SCLTIMEOUT状态标志置位。如果SCLTIMEOUT状态标志由INTENSE寄存器中的SCLTIMEOUTEN位使能,则可引发中断。SCLTIMEOUT可与SMBus配合使用。
下面是时钟分频寄存器CLKDIV,下表是它的全部位结构,其地址分别为0x40050014 (I2C0),0x40054014(I2C1),0x40070014 (I2C2)和0x40074014 (I2C3))。

I2C功能的时钟结构见下面的框图所示。

在上图中,系统AHB时钟经过I2C时钟使能控制选择后,注入到了时钟分频寄存器CLKDIV中,分频后输出的时钟用来进行数据采样及超时控制,采样时钟在经过逻辑电平选择后直接作为SCL输出。
--待续--

浙公网安备 33010602011771号