**这是本文档旧的修订版!**

I2C Master

1.概述

I2C是一种简单的串行通讯总线,由飞利浦公司在1980年代为让主板、嵌入式系统或手机用以连接低速周边设备而发展。自2006年11月起,I2C协议是可以被免费使用的,但是芯片厂商仍需要付费以获得I2C从属设备的地址。 I2C只使用两条双向漏极开路(串行数据SDA与串行时钟SCL)并利用电阻进行上拉,I2C允许相当大的工作电压范围,但典型电压等级为+3.3V或者5V。其设备地址包含7bit长度与10bit长度。I2C传输速率有不同的模式:

  • 标准模式:100Kbit/s
  • 低速模式:10Kbit/s
  • 快速模式:400Kbit/s
  • 高速模式:3.4Mbit/s

本IP的设计旨在使用户能够高效进行开发,减少开发周期。支持7位设备地址与标准/快速/低速模式,暂不支持10位地址操作模式,若相关器件性能支持,该IP也可运行在3.4Mbit/s(所使用的FPGA IO建立时间需满足时序要求)。

:!:注意,该IP仅限学习与交流使用。

2.I2C Master 特性

  • 符合Philips I2C标准
  • 支持主动挂起I2C总线进入等待状态
  • 支持多种传输速率
  • 支持重复读/写操作
  • 支持非标准I2C设备(如无寄存器地址操作)
  • 提供ACK触发信号
  • 提供状态调试寄存器

3.IP结构



I2CMasterCore由4部分组成,分别为i2cmaster, i2cmasterconfig, i2cmasterlogic与clkdiv,功能分别如下:

  • i2cmaster : 为内核的top module,调用所有module并建立连接。 * i2cmasterconfig : 为内核配置module, 用户可修改该module实现i2c通信。 * i2cmasterlogic : 为内部逻辑实现module,若预设操作模式没有涵盖到某种I2C设备,你可以自行修改该module中的内容,建立一种新的状态跳变模式。
    * clk
    civ : 时钟分频module,可进行任意整数分频,点击详细了解。

4.Signal & I/O Ports

4.1 i2c_master_logic Module

i2cmasterlogic Module是I2C Master Core逻辑实现部分,所包含接口如下所示:

接口说明

功能 备注
scl I2C时钟管脚
sda I2C数据管脚
i2cclk | 时钟输入信号 | 直接支持100KHz与400Khz工作频率 | ^ rstn 复位信号 低电平有效
writedone | 写完成 | 每次写操作成功后会返回1次高电平脉冲 | ^ i2creaddata | I2C读取数据 | 默认值位8‘h00 | ^ i2cconfig I2C配置管脚 包含器件地址,目标寄存器地址···

i2cconfig信号说明** <file> i2cconfig信号格式: i2cconfig = {设备地址,读/写控制,连续/单次读取,读/写目标寄存器地址,写入寄存器数据}; 7bit 1bit 1bit 8bit 8bit e.g. 1.写入操作:设备地址0X50,写入目标寄存器0X16,写入数据0XAA i2cconfig = {7'h50,1'b0,1'bX,8'h16,8'hAA}; 注意:写入操作“连续/单次读取”位无效,输入1位任意值补空 2.单次读取:设备地址0X48,读取目标寄存器0X00,单次读取 i2c_config = {7'h48,1'b1,1'b0,8'h00,8'hXX}; 注意:读取操作“写入寄存器数据”无效,输入8位任意值补空。 </file> ==== 例化案例 ==== <code verilog> module i2cmastercore( sysclk12m, rstn, scl, sda, i2creaddata, writedone ); input sysclk12m; input rstn; output scl; inout sda; output [7:0] i2creaddata; output writedone; wire clkdiv100k; clkdiv clkdivinst( .clk(sysclk12m), .rstn(rstn), .clkout(clkdiv100k) ); wire [24:0] i2cconfig; assign i2cconfig = {7'b1001000,1'b1,1'b1,8'h00,8'h88}; i2cmasterconfig i2cmasterconfiginst( .i2cclk(clkdiv100k), .rstn(rstn), .scl(scl), .sda(sda), .i2creaddata(i2creaddata), .writedone(writedone), .i2cconfig(i2cconfig) ); endmodule </code> ===== 代码下载 ===== i2c_master_core.zip