zpalwaysyoung的个人空间 https://blog.eetop.cn/1505587 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

I2C协议IP debug记录(二)

热度 1已有 803 次阅读| 2021-6-10 21:02 |系统分类:芯片设计| I2C

捕获.PNG

  如图是公司量产芯片i2c模块配置为slave模式(slave地址配置为8‘h6a)时一次传输利用示波器抓到的信号。start之后master写8’h6a,芯片回ack,master写8‘h11,芯片回ack,stop之后master发起restart,然后再次发送8‘h6b,此时芯片却回nack,按照设计此时硬件也是必须要回复ack的。那么问题到底出在哪里?是软件问题还是硬件问题?

  补充说明:中断发生的条件为:

  1、收到有效byte(地址或者数据)

  2、检测到错误格式(byte数据没有接收完毕就收到start或stop)

  3、有效byte后的stop

  图中紫色信号表示中断,每次进中断了该信号就会翻转一次。

  原因:I2C_CTL有个可写位BUS_R,写BUS_R会产生两个作用:释放hold住的SCL,复位内部的接收counter。收到byte后进入中断,这种情况下中断程序处理再慢也没有关系,因为此时电路设计会将SCL拉低hold住,master无法发送后续的数据,直到软件写了BUS_R释放SCL线才会开始接收数据。而收到stop进入中断,如果中断程序处理太慢了,后面的start和新数据已经在传输了,此时软件再去写BUS_R会复位内部的counter导致判断ack的时刻出错。

  关键点就在于cpu响应中断的时间,在FPGA上抓到的波形显示,每次从发出I2C_IRQ到进入中断程序时间不一,一般都有50个HCLK(7.2M),STOP后的这个更长,接近100个HCLK,在经过了这段时间后,硬件已经接收了start并开始接收bit了。当硬件接收到start会将收到stop的标记位清零,而软件此时还在使用stop的标记位作判断,但此时查询到的状态已经不是stop了,在非stop的条件下对BUS_R有写操作,产生了如图所示的错误。


点赞

发表评论 评论 (1 个评论)

回复 杰克淡定 2021-12-30 10:26
总结并记录遇到过的问题

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 1

    关注
  • 4

    粉丝
  • 1

    好友
  • 9

    获赞
  • 5

    评论
  • 297

    访问数
关闭

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


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

GMT+8, 2024-12-24 02:38 , Processed in 0.014830 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部