继续来看I2C中断使能设置及读取寄存器INTENSET,下表是它的全部位结构,其地址分别为0x40050008 (I2C0),0x40054008 (I2C1),0x40070008 (I2C2)和0x40074008 (I2C3))。
(1)第0位(MSTPENDINGEN)为主机挂起中断使能位。写0时主机挂起中断禁止,写1时主机挂起中断使能,默认为禁止。
(2)第1到3位保留位,读出的值未定义,写入时只能写0。
(3)第4位(MSTARBLOSSEN)为主机仲裁丢失中断使能位。写0时主机仲裁丢失中断禁止,写1时主机主机仲裁丢失中断使能,默认为禁止。
(4)第5位为保留位,读出的值未定义,写入时只能写0。
(5)第6位(MSTSTSTPERREN)为主机开始/停止错误中断使能位。写0时主机开始/停止错误中断禁止,写1时主机开始/停止错误中断使能,默认为禁止。
(6)第7位为保留位,读出的值未定义,写入时只能写0。
(7)第8位(SLVPENDINGEN)为从机挂起中断使能位。写0时从机挂起中断禁止,写1时从机挂起中断使能,默认为禁止。
(8)第9到10位为保留位,读出的值未定义,写入时只能写0。
(9)第11位(SLVNOTSTREN)为从机未执行拉伸中断使能位。写0时从机未执行拉伸中断禁止,写1时从机未执行拉伸中断使能,默认为禁止。
(10)第12到14位为保留位,读出的值未定义,写入时只能写0。
(11)第15位(SLVDESELEN)为从机取消选择中断使能位。写0时从机取消选择中断禁止,写1时从机从机取消选择中断使能,默认为禁止。
(12)第16位(MONRDYEN)为监视器数据就绪中断使能位。写0时监视器数据就绪中断禁止,写1时监视器数据就绪中断使能,默认为禁止。
(13)第17位(MONOVEN)为监视器超限中断使能位。写0时监视器超限中断禁止,写1时监视器超限中断使能,默认为禁止。
(14)第18位为保留位,读出的值未定义,写入时只能写0。
(15)第19位(MONIDLEEN)为监控器空闲中断使能位。写0时监控器空闲中断禁止,写1时监控器空闲中断使能,默认为禁止。
(16)第20到23位为保留位,读出的值未定义,写入时只能写0。
(17)第24位(EVENTTIMEOUTEN)为事件超时中断使能位。写0时事件超时中断禁止,写1时事件超时中断使能,默认为禁止。
(18)第25位(SCLTIMEOUTEN)为SCL超时中断使能位。写0时SCL超时中断禁止,写1时SCL超时中断使能,默认为禁止。
(19)第26到31位为保留位,读出的值未定义,写入时只能写0。
接下来看I2C中断使能清除寄存器INTENCLR,该寄存器为只写属性,下表是它的全部位结构,其地址分别为0x4005000C (I2C0),0x4005400C (I2C1),0x4007000C (I2C2)和0x4007400C (I2C3))。
(1)第0位(MSTPENDINGCLR)为主机挂起中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(2)第1到3位保留位,读出的值未定义,写入时只能写0。
(3)第4位(MSTARBLOSSCLR)为主机仲裁丢失中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(4)第5位为保留位,读出的值未定义,写入时只能写0。
(5)第6位(MSTSTSTPERRCLR)为主机开始/停止错误中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(6)第7位为保留位,读出的值未定义,写入时只能写0。
(7)第8位(SLVPENDINGCLR)为从机挂起中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(8)第9到10位为保留位,读出的值未定义,写入时只能写0。
(9)第11位(SLVNOTSTRCLR)为从机未执行拉伸中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(10)第12到14位为保留位,读出的值未定义,写入时只能写0。
(11)第15位(SLVDESELCLR)为从机取消选择中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(12)第16位(MONRDYCLR)为监视器数据就绪中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(13)第17位(MONOVCLR)为监视器超限中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(14)第18位为保留位,读出的值未定义,写入时只能写0。
(15)第19位(MONIDLECLR)为监控器空闲中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(16)第20到23位为保留位,读出的值未定义,写入时只能写0。
(17)第24位(EVENTTIMEOUTCLR)为事件超时中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(18)第25位(SCLTIMEOUTCLR)为SCL超时中断清除位,写1时将会清除INTENSET寄存器中对应的位。
(19)第26到31位为保留位,读出的值未定义,写入时只能写0。
接下来是I2C的超时寄存器TIMEOUT,下表是它的全部位结构,其地址分别为0x40050010 (I2C0),0x40054010(I2C1),0x40070010 (I2C2)和0x40074010 (I2C3))。
(1)第0到3位为超时时间值。这4位的值固定为0xF,表明I2C功能时钟的最小超时为16,也即I2C功能时钟的超时分辨率为16。
(2)第4到15位为超时时间值。值I2C功能时钟的指定超时间隔增量为16,由CLKDIV寄存器定义。若要在I2C工作时改变该数值,则需禁用所有超时、向TIMEOUT写入新数值,并重新使能超时。当值为0x000时,I2C功能时钟经16次计数后会产生一次超时;值为0x001时,I2C功能时钟经32次计数后会产生一次超时;以此类推,值为0xFFF时,I2C功能时钟经65536次计数后会产生一次超时。
(3)第16到31位为保留位,读出的值未定义,写入时只能写0。
下面是I2C时钟分频寄存器CLKDIV,下表是它的全部位结构,其地址分别为0x40050014 (I2C0),0x40054014(I2C1),0x40070014 (I2C2)和0x40074014 (I2C3))。
(1)第0到15位为分频值。I2C功能需要一个内部时钟才能工作,这里的16位值决定了I2C如何使用PCLK时钟。值为0x0000时,I2C直接使用PCLK时钟;值为0x0001时,I2C在使用前先对PCLK时钟进行2分频处理;值为0x0002时,I2C在使用前先对PCLK时钟进行3分频处理;以此类推,值为0xFFFF时,I2C在使用前先对PCLK时钟进行65536分频处理。
(2)第16到31位为保留位,读出的值未定义,写入时只能写0。
I2C功能的时钟结构见下面的框图所示。
在上图中,系统AHB时钟经过I2C时钟使能控制选择后,注入到了时钟分频寄存器CLKDIV中,分频后输出的时钟用来进行数据采样及超时控制,采样时钟在经过逻辑电平选择后直接作为SCL输出。
-待续-
标签:超时,未定义,中断,续二,接口,寄存器,I2C,位为 From: https://www.cnblogs.com/fxzq/p/17316089.html