在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 13664|回复: 15

[原创] 芯片I2C slave将SDA拉低导致SCL不输出问题的解决过程

[复制链接]
发表于 2016-4-25 11:33:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

问题描述:

芯片S是我们做的一款电源管理芯片,其内部包含一个I2C slave,可以通过外部的I2C master对其内部的参数进行配置。

芯片流片回来后,进行测试时发现,当芯片工作在大电流充电时,通过I2C master对其进行读写操作,经常会出现SCL停止(因为I2Cmaster检测到SDA一直被拉低,所以不再输出SCL),SDA被一直拉低的情况。

注:芯片SI2C slave逻辑完全是SCL当做时钟信号,没有其他高频时钟对其进行处理。


测试方法:

在芯片上没有好的debug方法,只好将芯片的源代码下载到FPGA中进行回归测试。

I2C slave config error.doc

2.15 MB, 下载次数: 87 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2016-4-25 18:03:17 | 显示全部楼层
“注:芯片S的I2C slave逻辑完全是SCL当做时钟信号,没有其他高频时钟对其进行处理。”

你写的这句话就可以看出问题了。I2C的SCL是不能当作时钟信号使用的,必须有另外的高频时钟来处理SDA和SCL。首先是因为出到PIN脚的SCL会有毛刺,当作时钟肯定会有问题;即使绝对理想没有毛刺,那你该使用SCL的上升沿还是下降沿来抓数?你连start和stop都检测不到
 楼主| 发表于 2016-4-26 09:35:43 | 显示全部楼层
本帖最后由 atomdust 于 2016-4-26 09:37 编辑

回复 2# 杰克淡定

这个I2C项目速度很低,为了极简设计,没有增加额外的高频时钟来处理,按照下面的做法,芯片已经流片,运行正常。后端的PT很简单,timing比较好控制。
PIN输入端的毛刺处理:通过IO增加施密特来处理。
因为I2C master发出的时序是:SDA在SCL为高电平时保持稳定,所以I2C slave芯片用SCL的上升沿来采集SDA。
起始和停止位比较简单,如下这样处理即可:
//detect start/stop condition
always @(negedge sda_i or negedge scl or negedge rst_n) begin
    if(~rst_n)      start <= 'b0;
    else if(~scl)   start  <= 'b0;
    else if(scl)    start  <= 'b1;
end

always @(posedge  sda_i or posedge start or negedge rst_n) begin
    if(~rst_n)      stop <= 'b0;
    else if(start)    stop <= 'b0;
    else if(scl)    stop <= 'b1;
    else            stop <= 'b0;
end
发表于 2016-4-26 10:13:12 | 显示全部楼层
我有一个疑问啊,
“因为I2Cmaster检测到SDA一直被拉低,所以不再输出SCL”,这有什么必然联系吗,sda一直拉低,只表示sda总线一直被slave占住,master不能驱动,不影响它驱动scl时钟啊;还是说你们的master就是这样的,只要检测到sda拉低,就停时钟。谢谢
 楼主| 发表于 2016-4-26 10:22:44 | 显示全部楼层
回复 4# haimo
是这个I2C master做成了这个样子,I2C master除了按照I2C协议发出SCL和SDA时序,同时将SDA环回进行检测,当检测到一些关注的状态时,做相应的处理。
发表于 2016-4-26 11:48:23 | 显示全部楼层
回复 3# atomdust


   这样做自己玩玩可以,你们还拿去流片真是有钱烧。这样设计出来的I2C slave兼容性很差,对与之搭配的I2C master芯片的SCL毛刺要求相当苛刻,你要知道I2C协议规范是允许出现几十纳秒的毛刺的,这就是协议的容错性。你这个只要出现一次毛刺,你的slave逻辑就出错,一旦出现SDA被slave驱动到低并hold住,整个I2C总线上的通信全部被hold住而锁死。内部counter计数出错还影响下一次传输,而正常的I2C设计即使某次传输出错,只要重新检测到start,新一次的传输是不受影响的。
从工程角度看,你们这个只能供研究用,是无法量产的。
 楼主| 发表于 2016-4-26 12:46:24 | 显示全部楼层
回复 6# 杰克淡定
从稳定性来看,确实容易出问题。而且实际测试情况,这次也确实是出了问题。
因为之前这个逻辑一直在使用,没有出过问题,所以就一直沿用下来。


之前没有发现错误可能是运气好,比如I2C master发出的波形足够干净,还有就是因为这个I2C配置功能只是偶尔用一下。


所以后面如果再有类似的项目,确实需要用高速时钟来处理。
发表于 2016-4-28 00:33:21 | 显示全部楼层
学习了。
发表于 2016-4-28 10:43:01 | 显示全部楼层
回复 1# atomdust


你的SDA和SCL的时序关系是怎么样的,它们是在同时变化还是有相位差?
 楼主| 发表于 2016-4-28 14:52:01 | 显示全部楼层
回复 9# 益达。我的

read error

read error
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-25 16:22 , Processed in 0.023184 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表