差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
i2c_master_core [2017/12/16 19:27]
group002
i2c_master_core [2017/12/16 19:39] (当前版本)
group002
行 38: 行 38:
 \\ \\
 {{ ::​signlei22.png?​700 |}} {{ ::​signlei22.png?​700 |}}
-clk_in:时钟输入信号,该信号直接影响I2C总线工作频率,典型输入频率为100Kbit/​s,可使I2C总线工作在100K标准模式下,如果从机设备支持快速或高速模式,该时钟频率可响应输入更高频率,如400Kbit/​s或者3.4Mbit/​s。 +===clk_in===  
-rst_n:复位输入信号,该信号为被拉低时,电路进入复位状态。 +时钟输入信号,该信号直接影响I2C总线工作频率,典型输入频率为100Kbit/​s,可使I2C总线工作在100K标准模式下,如果从机设备支持快速或高速模式,该时钟频率可响应输入更高频率,如400Kbit/​s或者3.4Mbit/​s。 
-scl&sda:I2C通讯总线,硬件电路需配置为上拉,管脚约束建议同样调整为为上拉。 +=== rst_n === 
-i2c_read_data:该寄存器用于存储主机在从机中读取到的数据。 +复位输入信号,该信号为被拉低时,电路进入复位状态。 
-i2c_device_address:该信号为从机设备地址,暂只支持7位的设备地址。 +=== scl&​sda ​=== 
-i2c_reg_address:该信号为读/​写操作目标寄存器的地址,由外部输入。 +I2C通讯总线,硬件电路需配置为上拉,管脚约束建议同样调整为为上拉。 
-i2c_write_reg_data:该信号为I2C写入目标寄存器数据,由外部输入。 +== i2c_read_data ​== 
-i2c_config:该信号为配置I2C工作模式的外部输入信号,本I2C Master IP核支持如下工作模式,分别对应输入信号为: +该寄存器用于存储主机在从机中读取到的数据。 
-  * i2c_config= 8`h00:​I2C挂起,进入等待模式(WAIT),等待状态下主机将SCL拉高并释放SDA总线。 +== i2c_device_address ​== 
-  * i2c_config= 8`h01:​I2C单次写入模式(I2C_Single_Write_Byte),标准1Byte数据写入模式。 +该信号为从机设备地址,暂只支持7位的设备地址。 
-  * i2c_config= 8`h02:​I2C连续写入模式(I2C_Continuous_Write_Byte),主机对从机目标寄存器进行连续写入1Byte的数据,当主机发送到从机的1Byte数据并接受到ACK信号时,不会停止I2C总线,而是继续写入1Byte数据。该模式不会主动停止。 +== i2c_reg_address ​== 
-  * i2c_config= 8`h03:​I2C直接写入状态(I2C_Write_Directly),主机直接对从机设备进行1Byte的数据写入,即成功访问到设备并接受到ACK信号之后,直接写入8bit的数据即可。 +该信号为读/​写操作目标寄存器的地址,由外部输入。 
-  * i2c_config= 8`h04:​I2C单次读取状态(I2C_Single_Read_Byte),标准1Byte数据读取模式。 +== i2c_write_reg_data ​== 
-  * i2c_config= 8`h05:​I2C连续读取状态(I2C_Continuous_Read_Byte),主机对从机目标寄存器进行连续的数据读取操作,即在通讯的过程中,主机成功读取从机目标寄存器数据后,不会发送NACK信号,而是发送ACK信号并再次读取从机目标寄存器的数据。 +该信号为I2C写入目标寄存器数据,由外部输入。 
-  * i2c_config= 8`h06:​I2C直接读取状态(I2C_Read_Directly),主机对从机设备进行直接读取数据操作,即成功访问到设备并接受到ACK信号后,直接再次进行START模式,进行数据的读取。 +== i2c_config ​== 
-  +该信号为配置I2C工作模式的外部输入信号,本I2C Master IP核支持如下工作模式,分别对应输入信号为: 
-4.1.9  ​state_debug +  ​* **i2c_config = 8`h00** : I2C挂起,进入等待模式(WAIT),等待状态下主机将SCL拉高并释放SDA总线。 
- 该信号为程序运行状态指示寄存器。+  ​* **i2c_config = 8`h01** : I2C单次写入模式(I2C_Single_Write_Byte),标准1Byte数据写入模式。 
 +  ​* **i2c_config = 8`h02** : I2C连续写入模式(I2C_Continuous_Write_Byte),主机对从机目标寄存器进行连续写入1Byte的数据,当主机发送到从机的1Byte数据并接受到ACK信号时,不会停止I2C总线,而是继续写入1Byte数据。该模式不会主动停止。 
 +  ​* **i2c_config = 8`h03** : I2C直接写入状态(I2C_Write_Directly),主机直接对从机设备进行1Byte的数据写入,即成功访问到设备并接受到ACK信号之后,直接写入8bit的数据即可。 
 +  ​* **i2c_config = 8`h04** : I2C单次读取状态(I2C_Single_Read_Byte),标准1Byte数据读取模式。 
 +  ​* **i2c_config = 8`h05** : I2C连续读取状态(I2C_Continuous_Read_Byte),主机对从机目标寄存器进行连续的数据读取操作,即在通讯的过程中,主机成功读取从机目标寄存器数据后,不会发送NACK信号,而是发送ACK信号并再次读取从机目标寄存器的数据。 
 +  ​* **i2c_config= 8`h06** : I2C直接读取状态(I2C_Read_Directly),主机对从机设备进行直接读取数据操作,即成功访问到设备并接受到ACK信号后,直接再次进行START模式,进行数据的读取。 
 +== state_debug ​== 
 +该信号为程序运行状态指示寄存器。 
 +i2c_ack:​该信号为响应指示信号,对应关系如下: 
 +  * i2c_ack[0] : 写入设备地址从机响应位 
 +  * i2c_ack[1] : 写入寄存器地址从机响应位 
 +  * i2c_ack[2] : 写入寄存器数据从机响应位 
 +  * i2c_ack[3] : 读取寄存器地址从机响应位 
 +  * i2c_ack[4] : 成功读取寄存数据后主机发送ACK  
 +  * i2c_ack[5] : 成功读取寄存器数据后主机发送NACK  
 +  * i2c_ack[4] : 预留,默认值为0  
 +  * i2c_ack[5] : 预留,默认值为0
  
-4.1.10  i2c_ack +==== 4.2 i2c_master_config module ====
- 该信号为响应指示信号,对应关系如下: +
- i2c_ack[0] : 写入设备地址从机响应位 +
- i2c_ack[1] : 写入寄存器地址从机响应位 +
- i2c_ack[2] : 写入寄存器数据从机响应位 +
- i2c_ack[3] : 读取寄存器地址从机响应位 +
- i2c_ack[4] : 成功读取寄存数据后主机发送ACK  +
-i2c_ack[5] : 成功读取寄存器数据后主机发送NACK  +
-i2c_ack[4] : 预留,默认值为0  +
-i2c_ack[5] : 预留,默认值为0+
  
-4.2 i2c_master_config module 
 i2c_master_config module是主要功能为对I2C运行模式及寄存器地址、数据进行配置。相关寄存器与i2c_master_logic module相同,在此不在赘述。 i2c_master_config module是主要功能为对I2C运行模式及寄存器地址、数据进行配置。相关寄存器与i2c_master_logic module相同,在此不在赘述。
  
-4.3 clk_div module +==== 4.3 clk_div module ​====
-本module为时钟分频模块,通过对系统时钟信号进行分频可生成I2C所需时钟,你可以点击此处了解该clk_div module的详细说明。+
  
 +本module为时钟分频模块,通过对系统时钟信号进行分频可生成I2C所需时钟,你可以[[5._时钟分频|点击此处了解该clk_div module的详细说明]]。
  
 +===== 相关资料下载 =====
 +User Gudie : {{::​step_i2c_master_user_guide.pdf|}}\\
 +源码:{{::​i2c_master.zip|}}
  
- 
-==== 例化案例 ==== 
-<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|}}