找回密码
 立即注册
查看: 149|回复: 3

请教一个硬件I2C从机ACK应答信号的时序问题

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-06-01 22:30:56

3

主题

18

回帖

375

积分

中级会员

积分
375
发表于 2025-5-31 14:11:49 | 显示全部楼层 |阅读模式

正常的I2C从机硬件中断的代码是这样的:

void I2C_ISR_Handler() interrupt I2C_VECTOR
{
    //其它事件处理代码

    if (I2CSLST & I2C_RXIF)  // 0x20	处理RECV事件
    {
	I2CSLST &= ~(I2C_RXIF | I2C_SLACKO);  //SLACKO设置为0,应答ACK
  
        //接收数据处理代码
    }
}

我的问题是:这个SLACK0的应答ACK信号(拉低SDA),是(情况1)在I2CSLST被赋值的那一刻就被发送出去了,还是(情况2)要等到整个中断代码全部执行完毕,在中断返回语句 RETI 执行后才发送?

手册上只非常简单地讲了一句:“SLACKO:从机模式时,准备将要发送出去的 ACK 信号”,并没有说这个“将要”的任何时序问题。而ACK信号产生的时序问题,涉及到如果正确编写硬件I2C中断接收数据处理代码。所以万事不明找论坛,这里大佬荟萃、大神云集,希望能有老师给小弟答疑解惑,非常感谢。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5131

回帖

9132

积分

超级版主

DebugLab

积分
9132
发表于 2025-6-1 01:19:51 | 显示全部楼层
一切时序以SCL为同步时钟,SCL由主机驱动,从机仅接收SCL,对SCL只读
ACK位,从机写,主机读
SCL前沿(下降沿)从机改变SDA电平(写SDA),时钟后沿(上升沿)主机锁存SDA电平(读SDA)
保证SCL前沿这个时间点之前SLACKO的状态正确即可
截图202506010113433917.jpg



DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6018

积分

版主

积分
6018
发表于 2025-6-1 10:11:07 | 显示全部楼层
进入接受中断的时候,其实是已经接受完了一整个数据,但是还没到ack(马上就到)
所以此时设置ack后是立刻发送
考虑到一般都是ack,所以可以初始化接受前设置一次即可
Screenshot_2025-06-01-10-07-14-385_cn.wps.moffice_eng.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2025-06-01 22:30:56

3

主题

18

回帖

375

积分

中级会员

积分
375
发表于 2025-6-1 22:30:56 | 显示全部楼层
非常感谢两位版主的回复!
通过拜读两位大佬的赐教,是不是可以这样理解:对从机而言,SLACKO应答信号的产生,并没有固定的产生时机,也与从机I2C中断退出与否无关,只取决于主机的下一个SCL下降沿(由紧跟主机“写数据”指令的下一条主机“读ACK”指令产生 ?)什么时候到来。
若将上面的结论延伸开来,对于以数据帧为单位的I2C主从通讯来说,从机接收当前数据帧的正确与否判断(通过CRC效验正确与否来赋值I2CSLST的SLACKO位,以回应ACK还是NACK),必须在主机等待读ACK指令超时之前完成,这样才不会错过标准的I2C应答逻辑流程,而“人为”产生从机无应答(NACK)的逻辑错误。

不知道我这种理解和延伸推理是否正确,还请两位大佬不吝赐教,小弟这里先行谢过!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 13:19 , Processed in 0.179354 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表