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) scl我给了固定的周期,如果闲时给高电平说不定不用这么麻烦 顶 顶 学习中! 顶 为啥不用SOPC里面的IP? 如果真是要用IP是要收费的,还是自己写的好 好东西,顶一下,只是下不了,怎么回事? 不知道有没有人做过I2C slave的verilog程序? 支持 http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=2037010&bbs_page_no=1&bbs_id=3037
这里有个slave的,经验证好用 mark 太有用了 mark 改天抄袭一个。 求学习求教育 学习中 mark~~~~~~~ >>一般用高阻态来控制信号的进出,需要上拉电阻!归纳为一句话“当需要输入的时候将输出置为高阻态”
当不需要输出时, 将输出置为高阻态, 是否可行 ?
学习了 不错 好坟 FPGA做I2c 也叫模拟?
页:
[1]