当总线发送和接收到特定的信号时候,就会在状态寄存器生成相应的状态,判断这些状态位来获取当前总结工作在什么环节。
I2C口是通过以下寄存器控制的:
I2CON (控制寄存器)
I2CINTSTS (中断状态寄存器)
I2CSTATUS (状态寄存器)
I2DIV (时钟分频寄存器)
I2CTOUT (超时控制寄存器)
I2CDAT (数据寄存器)
I2CSADDRn (地址寄存器, n=0~1), I2CSAMASKn 地址掩码寄存器, n=0~1
I2CON2(控制寄存器2) 和I2CSTATUS2 (状态寄存器2).
状态寄存器 (I2CSTATUS)
I2CSTATUS是一个8位只读寄存器,I2CSTATUS[7:0]域包含着26种状态码。I2CSTATUS[7:0]为F8H时为无中断请求,其它值对应于I2C的状态。当进入其中任一状态时,就会产生中断请求(INTSTS (I2CINTSTS[0]) = 1)。在INTSTS被硬件置位后一个机器周期,有效状态码出现在I2CSTATUS[7:0] 中。
INTSTS位被软件清0后,状态码仍会存在1个时钟周期。
此外,00H 状态表示总线错误。总线错误发生在START 或STOP 条件出现在帧结构不正确的位置。不正确的位置比如是在串行传输地址字节、数据字节或应答位期间。要从总线错误中恢复I2C,STOP (I2CON[2])必须置位以及必须清除INTSTS (I2CINTSTS[0])以进入无寻址模式。然后清除STOP 用来释放
总线,等待新的通信。当总线错误产生时,I2C 总线不能识别停止条件。
以前看不懂厂家的那个例程种一堆针对状态字的分支操作,现在懂了。
|