经过两周的调试,总结I2C的经验如下,请大侠们指正:
1)
SCL时钟的产生:
主发送模式时,SCL时钟是依据DR数据寄存器产生的,当数据写到DR数据寄存器之后,DR通过移位寄存器发出数据到SDA的同时,SCL时钟产生9个时钟脉冲,即8位数据+1位应答。
主接收模式时,在发送器件写地址和 数据地址的时候,SCL时钟 与 主发送模式是一样的,当发送到器件读地址时候,需要判断ADDR位确定地址是否发送完成,如果ADDR是1则认为地址发送完成,此时,清ADDR,SCL时钟随即产生。也就是说此时的SCL时钟是伴随ADDR被清除产生的。
2)
单字节接收:
单字节接收时,数据接收完成后,是需要一个NACK的,所以要关掉ACK应答,在发送STOP条件后在开启ACK应答,以便下次的发送和接收。
3)
I2C被中断问题
I2C可以被别的任务和中断服务函数打断,但是不能超过25ms,否则则认为是超时错误。I2C被打断器件,SCL时钟会保持前一个状态的电平不变。
|