【I2C】IIC读写时序

### I2C协议的读写时序及其实现细节 #### 1. I2C协议概述 I2C(Inter-Integrated Circuit)是一种广泛使用的串行通信协议,主要用于短距离通信。它通过两根信号线——时钟线(SCL)和数据线(SDA),实现了多设备之间的高效通信[^4]。 #### 2. I2C读写时序图解析 I2C协议的读写操作依赖于严格的时序控制,以下是具体说明: ##### (1) 起始条件 起始条件标志着一次I2C事务的开始。主机先将SCL保持高电平,随后将SDA从高电平拉低。这种状态转换通知所有连接到I2C总线上的设备准备接收命令[^3]。 ##### (2) 地址帧 在起始条件之后,主机发送一个7位或10位的设备地址,紧接着是一个方向位(R/W)。如果该位为0,则表示写入;如果是1,则表示取。每个字节传输完成后,从机需要回传一个应答位(ACK)来确认已成功接收到数据[^2]。 ##### (3) 数据帧 对于写操作,主机继续向从机发送数据,每次8比特,并等待从机发出ACK信号作为回应。而对于操作,情况稍显复杂: - 主机会设置最后一个要取的数据包不发ACK而是NACK,以此告知从机即将终止本次会话。 - 如果需要连续多次取多个寄存器内容,则可以在中间阶段持续给出ACK直到最后才切换为NACK并触发停止条件[^2]。 ##### (4) 停止条件 当所有必要的数据交互完毕后,主控端需生成停止标志以正式结束当前对话过程。这一步骤涉及先把SCL置零再把SDA恢复原状的操作序列[^3]。 #### 3. FPGA实现中的注意事项 利用FPGA开发环境模拟上述标准流程时需要注意几个方面: - **精确计时**:确保每一个高低脉冲宽度满足规格书规定范围内的最小值要求; - **竞争冒险规避措施**:考虑到实际电路可能存在毛刺现象等因素干扰正常工作状况下的波形质量,因此建议加入适当延时环节或者采用锁存机制加以优化处理[^5]。 ```python def i2c_write(address, data): start_i2c() send_byte(address << 1 | 0) # Write bit is set to '0' wait_for_acknowledge() for byte in data: send_byte(byte) wait_for_acknowledge() stop_i2c() def i2c_read(address, num_bytes): result = [] start_i2c() send_byte((address << 1) | 1) # Read bit is set to '1' wait_for_acknowledge() while len(result) < num_bytes - 1: result.append(receive_byte()) send_acknowledge(True) last_byte = receive_byte() send_acknowledge(False) # NACK before STOP condition result.append(last_byte) stop_i2c() return result def start_i2c(): global scl, sda scl = True sda = False delay_us(5) def stop_i2c(): global scl, sda scl = False sda = False delay_us(5) scl = True delay_us(5) sda = True delay_us(5) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞IC的那些年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值