显示页面 讨论 修订记录 反向链接 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 ====== 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结构 ===== \\ {{ ::i2c_master_block.png?900 |}} \\ I2C_Master_Core由4部分组成,分别为i2c_master, i2c_master_config, i2c_master_logic与clk_div,功能分别如下: * i2c_master : 为内核的top module,调用所有module并建立连接。 * i2c_master_config : 为内核配置module, 用户可修改该module实现i2c通信。 * i2c_master_logic : 为内部逻辑实现module,若预设操作模式没有涵盖到某种I2C设备,你可以自行修改该module中的内容,建立一种新的状态跳变模式。 * clk_civ : 时钟分频module,可进行任意整数分频,点击详细了解。 ===== 4.Signal & I/O Ports ===== ====4.1 i2c_master_logic Module==== i2c_master_logic Module是I2C Master Core逻辑实现部分,所包含接口如下所示: {{ ::signlei22.png |}} ==== 接口说明 ==== <WRAP center60%> | ^ 功能 ^ 备注 ^ ^ scl | I2C时钟管脚 | | ^ sda | I2C数据管脚 | | ^ i2c_clk | 时钟输入信号 | 直接支持100KHz与400Khz工作频率 | ^ rst_n | 复位信号 | 低电平有效 | ^ write_done | 写完成 | 每次写操作成功后会返回1次高电平脉冲 | ^ i2c_read_data | I2C读取数据 | 默认值位8‘h00 | ^ i2c_config | I2C配置管脚 | 包含器件地址,目标寄存器地址··· | </WRAP> **i2c_config信号说明** <file> i2c_config信号格式: i2c_config = {设备地址,读/写控制,连续/单次读取,读/写目标寄存器地址,写入寄存器数据}; 7bit 1bit 1bit 8bit 8bit e.g. 1.写入操作:设备地址0X50,写入目标寄存器0X16,写入数据0XAA i2c_config = {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 i2c_master_core( sys_clk_12m, rst_n, scl, sda, i2c_read_data, write_done ); input sys_clk_12m; input rst_n; output scl; inout sda; output [7:0] i2c_read_data; output write_done; wire clk_div_100k; clk_div clk_div_inst( .clk(sys_clk_12m), .rst_n(rst_n), .clkout(clk_div_100k) ); wire [24:0] i2c_config; assign i2c_config = {7'b100_1000,1'b1,1'b1,8'h00,8'h88}; i2c_master_config i2c_master_config_inst( .i2c_clk(clk_div_100k), .rst_n(rst_n), .scl(scl), .sda(sda), .i2c_read_data(i2c_read_data), .write_done(write_done), .i2c_config(i2c_config) ); endmodule </code> ===== 代码下载 ===== {{::i2c_master_core.zip|}}