在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 482|回复: 4

[转贴] I2C设计

[复制链接]
发表于 2024-11-28 13:01:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[color=rgba(0, 0, 0, 0.9)]https://mp.weixin.qq.com/s/92HXj-CdSlz_a_lqKpnF2A
[color=rgba(0, 0, 0, 0.9)]本文简单看下I2C设计,如何利用寄存器控制I2C总线,实现EEPROM读写以及温度传感器读出功能。
[color=rgba(0, 0, 0, 0.9)]EEPROM型号为24LC04B,容易从数据手册里面找到各种I2C读写的时序,以PAGE WRITE页写为例,如下图所示:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]容易看出,除START和STOP握手协议之外,需要发送控制字节,地址字节,以及连续16个数据字节。
[color=rgba(0, 0, 0, 0.9)]再以随机读取为例,如下图所示:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]第一次发送控制字节和地址字节之后,需要再发一次START,然后发送控制字节并读取数据。
[color=rgba(0, 0, 0, 0.9)]温度传感器型号为LM75A,其时序如下所示:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]发送器件地址和指针字节之后需要RE-START并再次发送器件地址,然后读取2个字节的温度数据。
[color=rgba(0, 0, 0, 0.9)]为节省时间,找到一个Lattice的开源设计https://www.latticesemi.com/prod ... i2cmastercontroller
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]图中的I2C Master Controller是开源代码,只需要设计接口模块,并根据器件替换I2C IO即可。
[color=rgba(0, 0, 0, 0.9)]根据上述需求,设计寄存器如下:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]根据通用I2C读写,温度传感器读,EEPROM读写的不同,有如下接口设计:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]其它关键设计,在于产生i2c_rd_byte_cnt和i2c_wr_byte_cnt,用于控制IIC写入字节和读出字节。
[color=rgba(0, 0, 0, 0.9)]首先产生start_ack的上升沿,
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]用上升沿对i2c_rd_byte_cnt清零,用received_data_valid对i2c_rd_byte_cnt计数,

[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg

[color=rgba(0, 0, 0, 0.9)]最后得到读出的I2C字节并送给温度寄存器
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]写字节计数同样采用start_ack_pos清零,并transmit_data_request_pos计数,如下:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]通过计数器可以产生发送数据如下:
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg
[color=rgba(0, 0, 0, 0.9)]最后,FPGA的话,在顶层产生输入输出IO即可。
[color=rgba(0, 0, 0, 0.9)] 640?wx_fmt=png&from=appmsg.jpg

发表于 2024-11-28 14:20:45 | 显示全部楼层
where is the code, bro
发表于 2024-11-28 14:35:37 | 显示全部楼层
代码在这里

I2CMasterControllerSourceCode.zip

657.96 KB, 下载次数: 29 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2024-11-28 21:33:31 | 显示全部楼层
kankads
发表于 2024-12-3 16:23:49 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-19 02:34 , Processed in 0.020546 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表