微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请教I2C设计的问题

请教I2C设计的问题

时间:10-02 整理:3721RD 点击:
我是一位初学者,最近在练习用Verilg语言写I2C,第一步在写I2C从机接收数据,对I2C简单的协议能看懂,但具体实现就不知道怎么回事。最开始做了一件很笨的事,因为看到I2C的协议上只有两根数据总线,SCL 和SDA,在设计从机接收数据时,一位老师就告诉我说从机就只有这两根线,我还真的就按他的话,用两根线把从机的功能实现了。后来遇到了一位做IC设计的高手,他说我的思路是错的。必须还要有另外的端口,由于和那位高手只有一面之缘,不能像他请教。所以我在这向大家请教。请大家说说你们对这个的想法。我是一个菜鸟,还需要多像大家学习。期待佳音。

能用简单方式实现复杂功能的才是真正高手

不是呀,我都是乱写的。肯定不对。我再描述下我现在的思路,请哪位高手帮我解答下。一个文件是实现从机接收数据的功能,一个testbench来代替主机发数据。我的从机中有系统时钟clk,复位信号rst_n, 两根总线输入scl,sdi,输出sdo就是从机的响应信号,stop_en是用来告诉testbench不用发数据了,但感觉用这根线有点不对。所以就不知道testbench怎么检测到从机是否响应,然后又怎么控制不发送数据。我也知道我问的问题有点太笨,希望大家理解。

建议你先把i2c协议研究好了,再写代码,你目前连最基本的数据如何收发都不很清楚



    最基本的数据收发,我还是看懂了的。只是在实现时就不知道咋实现了。感觉用VERILOG语言来写,思路就乱了。

只需要scl和sda啊~
master 发送完数据(经过八个scl)后,slave ack,即将sda下拉,若slave没有ack,则sda仍为高电平。(sda为OD,默认接上拉电阻,一般情况下总为高电平),master在第九个scl检测sda是否下拉,若下拉了,则进行下一步操作,否则认为slave没有ack。

同问!

论坛里有很多I2C程序,我自己也写过:http://bbs.eetop.cn/thread-267572-1-1.html
可以先参考参考别人的。



    对于主机来说,不可能就这两根线吧,肯定需要外部接口,比如说系统时间,复位信号,数据输入端。我想问那对于从机有外部接口吧,我在开源代码网上下的一个代码里,它的从机就只有SDA,SCL两个端口和外部相连,在它的代码里,SDA,SCL既作了时钟线,又作了数据线,这种verilog代码风格是不对的吧。听说是一个端口线不能既作时钟线又作时钟线的。

对于slave,scl是时钟线,sda是数据线。i2c协议是:
若要传输数据,scl高电平期间sda保持不变,数据有效,sda只能在scl的低电平期间变化。否则在scl高电平期间sda的跳变将被视为start(sda由1到0)和stop(sda由0到1)。实际操作一般选scl下降沿作为sda的输出时刻,选scl的上升沿作sda的数据采集时刻。
一般slave中还有一个上电复位por(reset)信号,这个在编verilog时模块需要,但实际芯片造出来后并没有这个pin,这个por信号由芯片内部一个专门的电路模块产生。
slave要实现的功能就是依据sda和scl的状态提取出,master发出的start,stop,和data信号,同时根据master的操作需要(读或是写)遵守scl的一定时序规律输出sda_o
你具体编写代码时就明白了。


I2C就两根线外加一个地。你需要仔细研究好i2c的协议。如果需要主机对从机进行控制,那么就需要另外在从机上加一个状态机对协议进行分析。这个你可以看看一些i2c-eerom的仿真模型和pdf,然后可以知道人家是怎么定的。

我见过一个写的比较好的I2C协议,SDA变高的时候,不用置1,直接置为高阻就可以了,使用外部的上拉把它拉高,感觉这种方法蛮好的。

我们这里用的貌似就是直接用上拉电阻将高阻态直接拉高变成1,

小编的意思不能完全懂。



   那请问,用verilog语言写时,就是把它赋值为'z'吗?

1)IIC是用来进行芯片间通信的,为了简化连线,只有两根线。但是无论Master还是Slave都不会工作在IIC时钟线SCL上的,每个芯片有自己的工作时钟
2)高阻通常通过特定的单元来实现,FPGA上用的话,可以在代码中直接使用1‘bz。

我想还是再研究一下IIC的协议。

请用心读懂协议!最好自己画一个时序图,谢谢!

对一个新手来说  还是一个比较复杂的工作

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top