IIC信号上升下降沿问题

IIC信号上升沿很缓,但是下降沿很陡并且有下冲
 一般在测试IIC信号的时候,仔细观察其实会发现IIC信号上升沿都会比较缓,一般都不会有过冲的现象,就像接了容性负载;而下降沿就比上升沿陡很多,严重的甚至有过冲,就好像接了感性负载;以下是个人理解:

1.  一般IIC链路上会有一个1~10k的上拉电阻(Rp)和一个0~100ohm的串阻(Rs)
2. IIC为OD/OC门结构,截止状态对外等效阻抗大,导通状态阻抗小;
3. 由低电平变为高电平时,IIC接口处于截止状态,加上寄生电容影响,RC较大,并且上拉电阻限制了充电电流,所以上升沿比较缓;
4. 由高电平变为低电平时,IIC接口导通,导通阻抗非常小,RC较小,下降沿变化比较快
5. 至于下降沿有时候出现下冲(振铃),信号边沿变化快,并且与反射信号叠加,就容易形成下冲,反复反射和叠加就会形成振铃;
6. 验证:减小上拉电阻和增大串阻确实能够改善上升沿的斜率以及下降沿的下冲(不过串阻都加到100ohm了还是有点下冲,只是比之前有改善而已,并没有完全消除,感觉这个100ohm已经不是做为匹配电阻,更多是作为阻尼电阻了)。
 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIC读写24C02存储verilog实验Quartus9.1工程源码,可以做为你的学习设计参考。 module iic_top( clk,rst_n, sw1,sw2, scl,sda, sm_cs1_n,sm_cs2_n,sm_db ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output sm_cs1_n,sm_cs2_n; //数码管片选信号,低有效 output[6:0] sm_db; //7段数码管(不包括小数点) wire[7:0] dis_data; //在数码管上显示的16进制数 iic_com iic_com( .clk(clk), .rst_n(rst_n), .sw1(sw1), .sw2(sw2), .scl(scl), .sda(sda), .dis_data(dis_data) ); led_seg7 led_seg7( .clk(clk), .rst_n(rst_n), .dis_data(dis_data), .sm_cs1_n(sm_cs1_n), .sm_cs2_n(sm_cs2_n), .sm_db(sm_db) ); endmodule module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //-------------------------------------------- //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 always @ (posedge clk or negedge rst_n) if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 always @ (posedge clk or neged

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值