这个就是状态寄存器,状态一旦发生改变,就会发生I2C中断,然后读该寄存器就知道发生了何事。
下图就是I2C作为Master和Slave时各个状态的含义表格: 0xF8是总线空闲的状态值,也是STATUS寄存器的缺省值。 下面详细介绍一下上表的各个状态。 Master状态介绍: 1) 发送 START 信号成功,发生 I2C 中断,STATUS 寄存器的值=0x08 2) 作为 I2C Master 没有发送 STOP 又发送 START 信号成功,发生 I2C 中断,STATUS 寄存器的值=0x10 3) 发送地址+W 成功并收到 ACK,发生 I2C 中断,STATUS 寄存器的值=0x18 4) 发送地址+W 成功并收到 NACK,发生 I2C 中断,STATUS 寄存器的值=0x20 5) 发送数据成功并收到 ACK,发生 I2C 中断,STATUS 寄存器的值=0x28 6) 发送数据成功并收到 NACK,发生 I2C 中断,STATUS 寄存器的值=0x30 7) Master发生仲裁失败,发生 I2C中断,STATUS寄存器的值=0x38 8) 发送地址+R 成功并收到 ACK,发生 I2C 中断,STATUS 寄存器的值=0x40 9) 发送地址+R 成功并收到 NACK,发生 I2C 中断,STATUS 寄存器的值=0x48 10) 收到数据并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0x50 11) 收到数据并返回 NACK,发生 I2C 中断,STATUS 寄存器的值=0x58 12) 总线错误,发生 I2C 中断,STATUS 寄存器的值=0x00 Slave状态介绍: 1) 收到 RE-START 信号或者 STOP 信号,发生 I2C 中断,STATUS 寄存器的值=0xA0 2) 收到 SLA+R 信号并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0xA8 3) 作为 Master 仲裁失败 HW 会自动转为 Slave,之后收到 SLA+R 信号,发生 I2C 中断, STATUS 寄存器的值=0xB0 4) 发送数据并收到 ACK,发生 I2C 中断,STATUS 寄存器的值=0xB8 5) 发送数据并收到 NACK,发生 I2C 中断,STATUS 寄存器的值=0xC0 6) 从接发送最后一个数据,但是居然收到的是 ACK,发生 I2C 中断,STATUS 寄存器的值 =0xC8 7) 从接收到 SLA+W 并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0x60 8) 作为 Master 仲裁失败 HW 会自动转为 Slave,之后收到 SLA+W 信号,发生 I2C 中断, STATUS 寄存器的值=0x68 9) 收到数据并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0x80 10) 收到数据并返回 NACK,发生 I2C 中断,STATUS 寄存器的值=0x88 11) 广播模式收到 SLA+W 并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0x70 12) 广播模式仲裁失败,发生 I2C中断,STATUS寄存器的值=0x78
13) 广播模式收到数据并返回 ACK,发生 I2C 中断,STATUS 寄存器的值=0x90
|