很多小伙伴在进入I2C学习的时候,总是感觉时序复杂、步骤多、控制麻烦,在此给这些小伙伴们提供一些简洁明了的学习技巧。限于时间所限,本节先讨论到字节写部分,其他内容后面文章继续。
【1】I2C 是什么
I2C(Inter-Integrated Circuit),集成电路总线,是由Philips公司开发的一种简单、双向二线制同步串行半双工总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
【2】I2C通讯速度
3种速度,标准速度0~100kbit/s , 快速 0~ 400kbit/s , 高速 0~ 3.4Mbit/s
【3】典型电路结构

【4】I2C 总体操作
常用的I2C通讯操作主要有:字节写操作,连续写操作,当前地址读,随机地址读,连续读。
【5】I2C 从机地址
7 bit (XXXX_AAA)长度的从机地址。分2部分,XXXX 部分为芯片厂商固定部分,此部分可查看datasheet,AAA部分为PCB工程师设定部分,一般从原理图纸可查看到。
【6】三态门(inout端口)
I2C 通讯有输入和输出2种方向,但同一时间不能同时既输入又输出。这个操作是通过三态门来实现的,在Verilog里 是inout 端口。
例如:inout wire sda;
做输出,直接把逻辑值赋给a即可:a=1;
做输入,先把z值赋给a,再从a上读取数据:
a=1’bz;(此时相当于释放a,a接下来会被其他芯片所控制)
b=a;(读取a的值)
上面的用法没有问题,但我们一般写成下面的方式:
inout wire sda;
reg sda_sel;//sda线的选择
reg sda_buf;//sda线的缓冲
assign sda = sda_sel ? sda_buf : 1’bz;
使用时,做读取时,对sda_sel 赋 0,然后读取sda;写入时,sda_sel 赋 1,后对sda_buf 赋想要输出的值。
【7】字节写操作 步骤与实现方法
| 0 | 空闲状态 | SCL SDA 都是高电平 |
| 1 | 主机发送开始信号 | SCL 高电平时,SDA从高到低的跳变 |
| 2 | 主机发送设备地址,同时发送写命令 | 8bit长度,每一个bit 要求,SCL低电平时SDA可以改变,SCL高电平时,SDA保持不变 从机地址 7 bit位,读写命令1bit位,0-写命令,1-读命令 |
| 3 | 从机发送应答(ack)主机接收应答 | 主机释放SDA线,从机控制SDA发送低电平(SCL低电平时发送),主机在下一个SCL高电平时接受数据 |
| 4 | 主机发送寄存器地址 | 8bit长度,每一个bit 要求,SCL低电平时SDA可以改变,SCL高电平时,SDA保持不变 |
| 5 | 从机发送应答(ack)主机接收应答 | 主机释放SDA线,从机控制SDA发送低电平(SCL低电平时发送),主机在下一个SCL高电平时接受数据 |
| 6 | 主机发送要写入的数据 | 8bit长度,每一个bit 要求,SCL低电平时SDA可以改变,SCL高电平时,SDA保持不变 |
| 7 | 从机发送应答(ack)主机接收应答 | 主机释放SDA线,从机控制SDA发送低电平(SCL低电平时发送),主机在下一个SCL高电平时接受数据 |
| 8 | 主机发送结束命令 | SCL高电平时,SDA从低到高的跳变 |

【8】操作要点
1、只有在开始和结束的时候,SDA是在SCL为高期间发生变化,其他任何时候SDA都是在SCL为低期间才能变化。
2、不论主机从机,SDA 线上单次发送的每个字节必须为8 位,接收方每个字节后必须给一个响应位。每次传输可以发送的字节数量不受限制。
2、不论主机从机,SDA 线上单次发送的每个字节必须为8 位,接收方每个字节后必须给一个响应位。每次传输可以发送的字节数量不受限制。
【9】代码实现(部分)
好了,本节就先讨论到这里,欢迎小伙伴们评论。
代码文件下载:
[content_control]
[/content_control]
运行效果: