请教I2C设计的问题
能用简单方式实现复杂功能的才是真正高手
不是呀,我都是乱写的。肯定不对。我再描述下我现在的思路,请哪位高手帮我解答下。一个文件是实现从机接收数据的功能,一个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的协议。
请用心读懂协议!最好自己画一个时序图,谢谢!
对一个新手来说 还是一个比较复杂的工作
