This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] F28M36P63C2:正确处理I2C Nack

Guru**** 2585275 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655389/f28m36p63c2-handling-i2c-nack-correctly

部件号:F28M36P63C2

I2C processors.wiki.ti.com/.../I2C_Tips上的Nice wiki有两种方法可以在传输时处理nack。

首先在'Repeat Start'部分,它建议将CMD寄存器设置为0以释放SCL。

如果(*I2C_ICSTR & ICSTR_Nack )
{
*I2C_ICMDR = 0; //重置I2C以使SCL不保持在低电平位置
返回RRET__FAIL;
} 


但在设置和处理nack中,它具有以下内容:它发出stop命令,然后从状态寄存器中清除nack:

//如果出现nack,则SCL保持在低位,STP位清除
(*I2C_STR & ICSTR_nack)
{
*I2C_MDR |= ICMDR_STP;//发送STP到结束传输
*I2C_STR = ICSTR_Nack;//清除位
返回I2C_FAIL;
} 

什么是适当的回应? 如果能够澄清维基,将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Derek,

    我同意你的看法。 维客页面中似乎存在一些不一致。

    请查看此线程: e2e.ti.com/.../27.5669万 。 我认为手动清除nack位可以保证行为。 如果可以,我将寻求更多的澄清,并更新Wiki。

    谢谢!
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我也不知道为什么会有差异。 我不明白为什么在重复启动方案中,一个会比另一个更好。 I2CMDR =0方法将清除I2CMDR.ISR,它将清除所有I2CSTR (而不仅仅是nack位),两种方法都确保SCL不被保持在低水平。

    所以我认为这两个都不是错的。 第一种方法可能更全面,但在我看来,如果您出于某种原因不想清除所有I2CSTR和I2CMDR,第二种方法似乎仍然足够。

    Whitney