原创 I2C的verilog实现

2014-12-3 13:46 6567 19 28 分类: FPGA/CPLD

I2C 有 2条双向串行线,一条数据线SDA,一条时钟线SCL。   SDA传输数据是大端传输,每次传输8bit,即一字节。数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束   数据改变:SCL为低电平时,SDA线才能改变传输的bit 。

工作流程:

写寄存器的标准流程为:
1.    Master发起START
2.    Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
3.    Slave发送ACK
4.    Master发送reg addr(8bit),等待ACK
5.    Slave发送ACK
6.    Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7.    Slave发送ACK
8.    第6步和第7步可以重复多次,即顺序写多个寄存器
9.    Master发起STOP

读寄存器的标准流程为:
1.    Master发送I2C addr(7bit)和w操作1(1bit),等待ACK
2.    Slave发送ACK
3.    Master发送reg addr(8bit),等待ACK
4.    Slave发送ACK
5.    Master发起START
6.    Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
7.    Slave发送ACK
8.    Slave发送data(8bit),即寄存器里的值
9.    Master发送ACK
10.    第8步和第9步可以重复多次,即顺序读多个寄存器

原理整理清楚编程思路就有了,首先要有开始工作的信号,分读和写来驱动I2C,本设计用M2408这款芯片进行工作,主要是了解到datasheet中时序的要求来进行编写。

编写过程中遇到的问题是scl没有满足时序要求,还有工作状态容易漏掉,比如说地址的发送以及等待ACK最后通过仿真及下载进行验证得到最终的结果,下图是modelsim的仿真图:

qq图片20141203134256.jpg

看来这次我终于把图插入成功了,呵呵。

附件带有程序,可以参考一下。

文章评论9条评论)

登录后参与讨论

用户1850883 2015-8-19 16:16

多谢分享,学习了!

用户419472 2015-7-12 09:12

厉害!

用户1843885 2015-6-30 15:07

好东西。谢谢分享!

用户1790896 2015-3-20 15:19

是的

用户1826713 2015-3-20 09:15

但如果不是用专用芯片,而是用fpga做i2c从机,地址应该是检测一下跟主机发的是否一样,一样就可以接受下面的数据了吧?

用户1790896 2015-2-28 16:57

7bit的I2C addr是由芯片手册里面规定的,可以仔细看一下,从机是跟随主机工作,所以传数据时这两边的地址应该是一样的,希望我的回答有帮到你

用户1826713 2015-2-28 14:10

求教:如果FPGA做I2C从机的话,想问7bit的I2C addr指的是什么呢?是自己可以任意设置的吗?谢谢~

用户1481079 2015-1-10 11:06

学习一下

用户436773 2015-1-2 11:10

学习一下
相关推荐阅读
用户1790896 2015-03-16 09:28
回差的艺术
           回差是一个比较专业的词汇,就是将条件点变成条件段。 举例说明:需要用外部电压来控制继电器的开关,但是这个电压是不稳定在跳变,这样就不能单一的用电压超过某一个值就改变继电...
用户1790896 2014-12-16 15:17
Lpm_compare的使用
        在没有使用QuartusII自带的Lpm_compare 这个模块时,自己理解的就是很简单的比较器,没有想到用到它有符号的功能就得出不一样的结果了。         首先要了解...
用户1790896 2014-12-06 13:59
Verilog中小数计算方法
在verilog中没有小数的概念,如果要有小数的计算,最普遍的办法是将小数按2的倍数增大计算完后缩小相同的倍数。按2的多少倍数增大是个关键。 例如需要将0.2变成整数计算,那么需要将0.2x2N使之成...
用户1790896 2014-11-21 08:42
Debussy与Modlesim的共处一室
Debussy与Modlesim的共处一个程序 Modlesim与Debussy的安装步骤网上一大把,我就不累述了。重点是在win7 64位系统下安装时需要下载msvcp71.dll、msvc...
用户1790896 2014-11-20 10:32
FPGA实现简单PWM
PWM原理:Pulse Width Modulation,是一种脉宽调制技术,通过对一系列脉冲的宽度进行调制,得到所需要的波形。可以通过硬件也可以通过软件的方式实现。这里主要介绍如何用FPGA实...
我要评论
9
19
关闭 站长推荐上一条 /2 下一条