差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
i2c_master_core [2017/12/16 19:29] 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_device_address == | ||
+ | 该信号为从机设备地址,暂只支持7位的设备地址。 | ||
+ | == i2c_reg_address == | ||
+ | 该信号为读/写操作目标寄存器的地址,由外部输入。 | ||
+ | == i2c_write_reg_data == | ||
+ | 该信号为I2C写入目标寄存器数据,由外部输入。 | ||
+ | == i2c_config == | ||
+ | 该信号为配置I2C工作模式的外部输入信号,本I2C Master IP核支持如下工作模式,分别对应输入信号为: | ||
* **i2c_config = 8`h00** : I2C挂起,进入等待模式(WAIT),等待状态下主机将SCL拉高并释放SDA总线。 | * **i2c_config = 8`h00** : I2C挂起,进入等待模式(WAIT),等待状态下主机将SCL拉高并释放SDA总线。 | ||
* **i2c_config = 8`h01** : I2C单次写入模式(I2C_Single_Write_Byte),标准1Byte数据写入模式。 | * **i2c_config = 8`h01** : I2C单次写入模式(I2C_Single_Write_Byte),标准1Byte数据写入模式。 | ||
行 53: | 行 61: | ||
* **i2c_config = 8`h05** : I2C连续读取状态(I2C_Continuous_Read_Byte),主机对从机目标寄存器进行连续的数据读取操作,即在通讯的过程中,主机成功读取从机目标寄存器数据后,不会发送NACK信号,而是发送ACK信号并再次读取从机目标寄存器的数据。 | * **i2c_config = 8`h05** : I2C连续读取状态(I2C_Continuous_Read_Byte),主机对从机目标寄存器进行连续的数据读取操作,即在通讯的过程中,主机成功读取从机目标寄存器数据后,不会发送NACK信号,而是发送ACK信号并再次读取从机目标寄存器的数据。 | ||
* **i2c_config= 8`h06** : I2C直接读取状态(I2C_Read_Directly),主机对从机设备进行直接读取数据操作,即成功访问到设备并接受到ACK信号后,直接再次进行START模式,进行数据的读取。 | * **i2c_config= 8`h06** : I2C直接读取状态(I2C_Read_Directly),主机对从机设备进行直接读取数据操作,即成功访问到设备并接受到ACK信号后,直接再次进行START模式,进行数据的读取。 | ||
- | + | == state_debug == | |
- | 4.1.9 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|}} | ||