首页 > 编程知识 正文

i2c详解,i2c接口

时间:2023-05-03 20:02:30 阅读:153510 作者:1533

我们平时在调试I2C时可能很少关注NACK信号。 当主机发送数据时,可能会出现MSB先发、LSB后发、连续发送一个字节(8位)、然后Slave返回一个ACK信号的情况,但在某些情况下,I2C slave也会发出NACK信号。 那么就看看NACK信号的存在吧。

1、从spec下抽取一级:

2、翻译:

每个字节后面跟着ACK信号。 ACK bit允许收件人成功接收数据,并通知发件人他们已准备好接收下一个数据。 所有的时钟脉冲都由master生成,包括与ACK信号对应的时钟脉冲。

ACK信号:发送器在ACK时钟周期内释放SDA线,且接收器可降低SDA,并在时钟信号为高时保持低电平。

NACK信号(在第9时钟时SDA线维持高电平被定义为NACK信号。 主机生成STOP条件以中止这次的传输,或者重复START条件以开始新的开始。

3、实例:

可以看到以下波形。 Master发送01101100(0x6c,MSB首发),第9个时钟时SDA变为高电平,表示Slave发送了NACK信号,然后整个I2C通信结束。 这是失败的I2C通信。 原因可能是I2C设备方面有问题,或者访问I2C设备的地址与I2C设备的实际地址不对应,因此没有接收到主数据就返回了NACK。

以ov 8825传感器的I2C为例进行说明。

OV8825的Slave Write Address为0x6c,OV8825的ID register Address为0x300a、0x300b,存储在ID register中的Value为0x6c、0x6c

正常的I2C波形如下。

1 )设置用I2C写的地址(01101100 )0x6c ) 00110000 )0x30 ) 0001010 )0x0a ) )。

Slave Write Address:0x6c,ID register address:0x300a

2 )在I2C中设定读取地址(01101101 )0x6d ) 10001000 )0x88 ) )。

Slave Read Address:0x6d,ID register value:0x88

20150716看这里有点不对劲。 i2c write在ack stop上结束通信,i2c read在nack stop上结束通信。 理由如下。

对于i2c write,master写入最后一个字节,然后slave返回ACK,master发送stop信号结束通信

对于i2c read,master在接收到slave发送的最后一个字节后返回NAK。 此时,master已经接收到足够的字节,所以NAK会告诉slave不要发送数据。

3 )设定用I2C写入的地址(01101100 )0x6c ) 00110000 )0x30 ) 0001011 )0x0b ) )。

Slave Write Address:0x6c,ID register address:0x300b

4 )在I2C中设定读取地址(01101101 )0x6d ) 00100101 )0x25 )。

Slave Read Address:0x6d,ID register value:0x25

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。