Menu Close

I2C(IIC)Verilog开发学习技巧(一)

很多小伙伴在进入I2C学习的时候,总是感觉时序复杂、步骤多、控制麻烦,在此给这些小伙伴们提供一些简洁明了的学习技巧。限于时间所限,本节先讨论到字节写部分,其他内容后面文章继续。
【1】I2C 是什么
I2C(Inter-Integrated Circuit),集成电路总线,是由Philips公司开发的一种简单、双向二线制同步串行半双工总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
【2】I2C通讯速度
3种速度,标准速度0~100kbit/s  , 快速 0~ 400kbit/s   , 高速  0~ 3.4Mbit/s
【3】典型电路结构
%title插图%num
也可以一个FPGA对多个I2C芯片,只要把其他I2C芯片挂载在SCL,SDA 线上即可,理论上可以挂接多达128个设备。
【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从低到高的跳变
%title插图%num
【8】操作要点
1、只有在开始和结束的时候,SDA是在SCL为高期间发生变化,其他任何时候SDA都是在SCL为低期间才能变化。
2、不论主机从机,SDA 线上单次发送的每个字节必须为8 位,接收方每个字节后必须给一个响应位。每次传输可以发送的字节数量不受限制。
【9】代码实现(部分)
好了,本节就先讨论到这里,欢迎小伙伴们评论。
代码文件:
运行效果:
Posted in FPGA, FPGA, IC, Verilog, 教材与教案, 编程语言

发表评论

相关链接