I2C接口信号的处理(SCL、SDA)

I2C有SCL,SDA这2根线,对这2个信号的处理如下:

always@(posedge clk or negedge rstn)begin

    if(!rstn)begin

      rg_sclD1<=1’b1;

      rg_sclD2<=1’b1;

      rg_sclD3<=1’b1;

      rg_sclD4<=1’b1;

      rg_sclD5<=1’b1;

      rg_sclD6<=1’b1;

      rg_sclD7<=1’b1;

      rg_sclD8<=1’b1;

      rg_sdaD1<=1’b1;

      rg_sdaD2<=1’b1;

      rg_sdaD3<=1’b1;

      rg_sdaD4<=1’b1;

      rg_sdaD5<=1’b1;

      rg_sdaD6<=1’b1;

      rg_sdaD7<=1’b1;

      rg_sdaD8<=1’b1;

  end

  else begin

       rg_sclD1<=xi_scl;

       rg_sclD2<= rg_sclD1;

       rg_sclD3<= rg_sclD2;

       rg_sclD4<= rg_sclD3;

       rg_sclD5<= wr_sclD5_nxt;

       rg_sclD6<= rg_sclD5;

       rg_sclD7<= rg_sclD6;

       rg_sclD8<= rg_sclD7;

       rg_sdaD1<=xi_sda;

       rg_sdaD2<= rg_sdaD1;

       rg_sdaD3<= rg_sdaD2;

       rg_sdaD4<= rg_sdaD3;

       rg_sdaD5<= wr_sdaD5_nxt;

       rg_sdaD6<= rg_sdaD5;

       rg_sdaD7<= rg_sdaD6;

       rg_sdaD8<= rg_sdaD7;

      end

end

assign wr_sclD5_nxt=(rg_sclD2==rg_sclD3&& rg_sclD3==rg_sclD4)? rg_sclD4:

rg_sclD5;

assignwr_sdaD5_nxt=(rg_sdaD2==rg_sdaD3&&rg_sdaD3==rg_sdaD4)? rg_sdaD4:rg_sclD5;

wr_sclD5_nxt,wr_sclD5_nxt这2个信号是当连续的三个延迟量相等则对其进行更新,否则不更新

上述代码中xi_scl,xi_sda分别是i2C的接口对外的2个信号

I2C 读写过程中 SCLSDA 的变化情况如下: ### 开始条件 当主机要和某个从机通讯时,会先发送一个开始条件。此时,SDASCL 高电平期间由高电平跳变为低电平。这一变化向总线上的所有设备表明,接下来将开始一次新的 I2C 通信过程[^2]。 ### 数据传输 SDA 数据线在 SCL 的每个时钟周期传输一位数据。传输时,当 SCL 为高电平的时候,SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”;当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。传输的每个字节为 8 位,高位在前,低位在后 [^1]。 ### 应答信号 在主机发送完一个字节的数据后,会释放 SDA 线,等待从机发送应答信号。从机在接收到数据后,会在第 9 个时钟周期将 SDA 拉低,表示应答。此时 SCL 仍然按照时钟周期变化,当 SCL 为高电平时,若 SDA 为低电平,则主机认为从机已经正确接收数据 [^1]。 ### 停止条件 数据传输结束时,主机会发送停止条件。SDASCL 高电平期间由低电平跳变为高电平,这一变化表示本次 I2C 通信结束,总线再次进入空闲状态 [^2]。 ### 代码示例(Arduino 模拟 I2C 读写) ```cpp #include <Wire.h> void setup() { Wire.begin(); // 初始化 I2C 总线 Serial.begin(9600); // 初始化串口通信 } void loop() { // 发送数据 Wire.beginTransmission(0x50); // 从机地址 Wire.write("Hello"); // 发送数据 Wire.endTransmission(); // 结束传输 // 接收数据 Wire.requestFrom(0x50, 5); // 向从机请求 5 个字节的数据 while (Wire.available()) { char c = Wire.read(); Serial.print(c); } delay(1000); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值