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

标题: I2C设计 [打印本页]

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

( , 下载次数: 53 )

最后得到读出的I2C字节并送给温度寄存器
( , 下载次数: 54 )
( , 下载次数: 51 )
写字节计数同样采用start_ack_pos清零,并transmit_data_request_pos计数,如下:
( , 下载次数: 43 )
通过计数器可以产生发送数据如下:
( , 下载次数: 55 )
最后,FPGA的话,在顶层产生输入输出IO即可。
( , 下载次数: 47 )


作者: gavin99    时间: 2024-11-28 14:20
where is the code, bro
作者: gavin99    时间: 2024-11-28 14:35
代码在这里
作者: student321    时间: 2024-11-28 21:33
kankads
作者: ic886    时间: 2024-12-3 16:23
感谢分享
作者: jjjggg    时间: 2025-4-16 10:11
thanks
作者: davie_huang    时间: 2025-4-27 01:42
感谢分享
作者: zixin1hao    时间: 2025-4-27 11:48
Thanks for sharing
作者: sutaotao2001    时间: 2025-4-27 12:00
Thanks
作者: john_123    时间: 2025-4-27 12:12
thanks
作者: linggan2005    时间: 2025-6-19 17:16
thanks
作者: ziven    时间: 2025-7-23 17:36


   
gavin99 发表于 2024-11-28 14:35
代码在这里


不支持高速,还是有点难受

作者: bagshtag    时间: 2025-8-13 16:42
Thanks!




欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) Powered by Discuz! X3.5