本帖最后由 ddllxxrr 于 2015-5-7 19:20 编辑
接收地址包(SCLSM=1)
当SCLSM是1,I2C从机只能延伸SCL线在一个应答之后依据下图:
当I2C从机配置正确,它将等待一个开始条件被检测。当一个开始条件被检测,紧跟着地址包将被接收并且被
地址匹配逻辑检测。如果接收的地址不匹配,包将丢弃并且I2C从机等待一个新的开始状态。如果地址匹配,
应答确认(CTRLB.ACKACT)自动发出并且地址匹配比特在中断标志寄存器(INTFLAG.AMATCH)被设置。SCL将被延
伸直到I2C从机清除INTFLAG.AMATCH。因为I2C从机延迟时钟通过强迫SCL为低,软件给出没有限制的时间来响
应地址。
传输的方向被检测通过读状态寄存器的读/写比特(STATUS.DIR),并且比特将被更新只有当一个可用的地址包
被接收。
如果状态寄存器中传输冲突比特(STATUS.COLL)被设置,它指示出发给从机最后包的地址有一个包冲突。一个
冲突导致SDA和SCL线没有对软件发出任何声明,就被释放。接下来的AMATCH中断,是由于以前的包冲突第一
个指款。冲突遵守SMBus 地址解析协议。
当地址包被从I2C主机接收后,一个1将被写到INTFLAG.AMATCH来清除它。
接收传输数据包(SCLSM=0)
在I2C从机接收地址包之后,它将根据方向不是等待数据包被接收就是通过发一个数据包到DATA.DATA。当一
个数据包被接收或者发出,INTFLAG.DRDY将要被设置。然后,如果I2C从机接收数据,它将发送一个应答信号
根据CTRLB.ACKACK
情况1:数据接收
INTFLAG.DRDY被设置,并且SCL延迟低电平这期间SW交互
情况2:数据发送
当一个比特传输结束,INTFLAG.DRDY中断标志被设置。如果NACK被接收,I2C从机必须期待一个停止或一个重
复开始被接收。I2C从机必须释放数据线来允许I2C主机产生一个停止或重复开始。
在停止检测,在中断标志寄存器(INTFLAG.PREC)停止接收比特将被设置并且I2C从机将返回一个空闲状态。
|