正常的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中断接收数据处理代码。所以万事不明找论坛,这里大佬荟萃、大神云集,希望能有老师给小弟答疑解惑,非常感谢。