主要从两种协议的读取操作,数据流向叙述;
i2c协议:有两个信号分别是i2c_sda和i2c_scl。
inout:i2c_sda;
output:i2c_scl。
串行输入串行输出;对i2c有两种操作,一种是FPGA对i2c写数据,另一种是FPGA从i2c读取数据。
当FPGA对i2c设备写数据时,i2c_sda为一个 输出信号,写操作过程如下:
1 起始信号:在i2c_scl为高电平期间,i2c_sda从高电平变为低电平;即i2c_scl==1&&i2c_sda:1>>0;
2 写从机设备的物理地址:从机设备地址为7位,后面补0表示主机向从机写数据;后面补1表示主机从从机 读取数据;
3 从机向主机发送应答信号ack==0,表示从机告诉主机已经准备好接收数据;
4 主机向从机发送要操作的寄存器地址8位;
5 从机向主机发送应答信号ack==0,表示从机告诉主机已经准备好接收数据;
6 主机向从机写数据;
7 从机向从机发送应答信号ack==0,表示从机告诉主机已经准备好接收要发送的数据;
8 结束信号:i2c_scl==1期间,i2c_sda为 上升沿。
如下图所示为主机向从机 写数据操作的时序图:
主机向从机写数据的过程:是将并行的数据转成串行数据输出;如:待写入的数据
input[7:0] i2c_wr_data;
数据流向:{I2C_SLAVE_ADDR,1'b0,i2c_reg_addr,i2c_wr_data}>>shift_w_reg>>i2c_sdata_out>>i2c_sda;
当FPGA从i2c设备读取数据时,此时,i2c_sda作为输入信号,读操作过程如下:
1 起始信号:i2c_scl==1期间,i2c_sda为下降沿;
2 主机写从机设备的物理地址,为7位,在后面添加0表示主机向从机写数据;
3 从机向主机发送应答信号;
4 主机向从机写要操作的寄存器地址,为8位;
5 从机向主机发送应答信号;
6 主机再次向从机发送起始信号Sr(Repeated started)
7 主机向从机写7位设备物理地址,并在后面添加1,表示主机要从从机读取数据;
8 从机向主机发送应答信号;
9 主机读取从机中的数据;
10 发送完毕后,主机再次占用i2c_sda 信号线发送一个非应答信号ack==1;
11 主机发送一个停止信号给从机结束整个读取过程。
白色:表示从机正在控制i2c_sda 总线;
灰色:表示主机正在控制i2c_sda 总线。
主机从从机读取数据,是将串行数据转成并行数据读入主机,此时,i2c_sda是主机的输入信号,数据流向如下:
output[7:0] i2c_rd_data;
i2c_sda>>i2c_sdata_in>>{shift_r_reg[I2C_DATA_BYTE*8-2:0],i2c_sdata_in}>>i2c_rd_data.
在实际操作时, 需要添加启动i2c总线的信号i2c_go,命令模式信号i2c_cmd,应答信号i2c_ack,从机设备地址,要操作的从机寄存器地址等。