laoki8888 发表于 2007-12-24 19:15:11

FPGA模拟I2C协议读写24C02

还是写一个数据读一个数据,纯粹学习

1.模拟I2C协议需要熟读数据手册掌握时序

2.I2C协议对时序的要求比SPI更严格,具体表现在时钟SCL处于高电平时,SDA线上传输的数据必须稳定,否则将被视为开始或截止传输的信号。

如何保证信号稳定?这个问题困扰了我几天,后来用double时钟的方法解决

具体解决方法如下:

输入信号为CLK,SCL信号为CLK的2分频,即采用两个周期来处理一个SCL信号

当送START信号或者送STOP信号时,在第二个时钟的下降沿改变SDA信号,此时可以保证SCL为高电平

当送普通数据时,在第一个时钟周期的下降沿改变SDA信号,可保证SCL为高时,数据不变。

具体可以参考以下时序图
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_192852.jpg



3.sda口为双向inout口线,在FPGA中处理起来比较麻烦,其实搞懂了还是很简单的

对inout口线类型要选择为bidir,刚开始设置成output,能收到数据就怪了

双向总线总结:

一般用高阻态来控制信号的进出,需要上拉电阻!归纳为一句话“当需要输入的时候将输出置为高阻态”。

使用时,输出数据时可以任意置数,输入数据时将首先将 sda <= 1'bz,然后才可以读取sda。

上面的时序图中最后那个高组态就是读取24c02返回信号的周期

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_192853.jpg



偷懒了,没有分模块写,写在一个状态机里面的,程序比较乱
CYCLONE2+Quartus6.1sp调试通过 i2c.rar
点击此处下载ourdev_192854.rar(文件大小:447K)

laoki8888 发表于 2007-12-24 19:28:22

scl我给了固定的周期,如果闲时给高电平说不定不用这么麻烦

mahui625 发表于 2008-1-7 11:42:50

leo_cheung 发表于 2008-3-21 11:27:53

eagle1979 发表于 2008-3-30 13:02:49

学习中!

jianglitao2007 发表于 2008-10-31 22:47:47

laoxizi 发表于 2008-10-31 23:02:43

为啥不用SOPC里面的IP?

gliet_su 发表于 2008-10-31 23:20:11

如果真是要用IP是要收费的,还是自己写的好

MATRIX_023 发表于 2008-11-1 16:49:03

好东西,顶一下,只是下不了,怎么回事?

zchong 发表于 2008-11-21 19:16:37

不知道有没有人做过I2C&nbsp;slave的verilog程序?

sunlichao 发表于 2009-1-17 06:22:41

支持

zchong 发表于 2009-1-17 10:38:20

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=2037010&bbs_page_no=1&bbs_id=3037

这里有个slave的,经验证好用

weiw2009 发表于 2009-5-1 16:02:42

mark

xu373297464 发表于 2009-5-3 16:39:36

太有用了

cihu 发表于 2010-3-13 21:23:00

mark

tear086 发表于 2010-3-14 09:23:10

改天抄袭一个。

majk1990 发表于 2011-10-21 23:12:05

求学习求教育

majk1990 发表于 2011-10-21 23:31:11

学习中

mysunmax 发表于 2012-5-18 21:06:33

mark~~~~~~~

shangdawei 发表于 2012-5-18 21:44:42

>>一般用高阻态来控制信号的进出,需要上拉电阻!归纳为一句话“当需要输入的时候将输出置为高阻态”

当不需要输出时, 将输出置为高阻态, 是否可行 ?

lu976046395 发表于 2015-6-3 17:34:43

学习了            

辰星和月 发表于 2015-6-3 19:51:11

不错            

moeyard 发表于 2015-8-6 13:23:45

好坟 FPGA做I2c 也叫模拟?
页: [1]
查看完整版本: FPGA模拟I2C协议读写24C02