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.

[参考译文] MSP430I2041:I2C 向主器件发出 NAK 指令

Guru**** 2457700 points
Other Parts Discussed in Thread: MSP430I2041

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1438489/msp430i2041-i2c-issues-nak-to-master

器件型号:MSP430I2041

工具与软件:

要从 UART 迁移到 I2C、需更改 EMDC 生成的代码、如下主题所述:

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/809952/msp430i2040-interfacing-the-msp430i2040s-sub-metering-evm-on-i2c/2998095

问题是、有时 I2C 主器件事务处理正常工作、而有时从器件发出 NAK。 可以在任何位置发生-在地址字节本身、或在主器件写入的中间、甚至在主器件读取阶段的任何位置发生。  

 下面的波形展示了 I2C 主设备成功执行命令0x04读取 HMI 状态机"模式"的读取事务的示例。  

下面的波形显示了用于读取 HMI 状态的命令0x04的 I2C 主设备读取事务失败的示例。  

当循环中发出相同的读取命令0x04时、I2C 从器件为15个读取/写入事务提供 NAK、然后为4个读取/写入事务提供 NAK。 并且只要主器件发出 I2C 命令、该模式就会一直持续。 此测试中未在 SD24接口上给出信号、这些接口配置为 EMDC 生成的代码以测量单相(一个电压通道、一条电流通道)。

上面波形中的双杠在下面的波形中显示了更多细节。  

每个0x04写入命令都具有0x0A、0x55、0xAA、0x06、0x04 在主器件发送的 I2C 上为0x01、0x00、0x00、0x05、0x00。 对于读取、主器件发送0x0A (I2C 地址+读取)、后跟足够的 SCL 周期来从 I2C 从器件读取15个字节。

您能不能解释一下什么原因导致了由 I2C 总线上的 MSP430I2041 I2C 从器件生成的 NAK?

一些可能的可能性:

当 I2041忙于其它任务时、禁用 I2C (eUSCI-B)。 I2C/eUSCI 只是告诉主器件它不能被服务。  

2. EMDC 代码中的严格循环需要太长的时间、并且在该繁忙时间内禁用 I2C。  

3.中断配置不正确。

EMDC 输出几乎没有更改、只有更改如上文提到的另一个 E2E 主题中所述。 请查看您是否能提供任何见解。  

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

    I2C NAK 只是从器件、不将数据线拉低。 这不可能发生、因为 I2C 主器件忙。 实际上、如果时钟在 TXBUF 中没有可用的数据、在时钟的上升沿之前不会发生这种情况、并且主器件将在时钟保持低电平时停止。 或者对于读取、RXBUF 中的数据还没有被读取。

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

    你好、David、是的、这是 发出 NAK 的从器件。 即使在主器件发出的第一个字节(I2C 地址)上也会执行此操作。 EMDC 生成的代码中是否有在 ADC 处理过程中禁用 eUSCI 的东西? 我理解的 RXBUF 中没有尚未读取的数据。 如果您看到波形、一些事务运行良好、然后 i2041 (i2c 从器件)针对主器件启动的多个 i2c 地址阶段发出 NAK。 这方面真的需要帮助。 谢谢。  

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

    我现在看到 MSP430作为 I2C 从设备运行。 这是一个非常不同的东西。 但是、设置后、I2C 端口将继续完成它的工作。 如果在 TXBUF 中没有数据或从 RXBUF 读取数据、它可以保持 SCL (时钟)为低电平。 所以、如果代码执行这些操作的速度很慢、你将看到针对 ACK/NAK 的扩展时钟。

    确认地址失败是因为 I2C 端口未运行或配置错误。 我看不到其他禁用串行端口的代码、但检查起来很容易。 查看二进制文件(我会通过 msp430-elf-objdump -S 运行它、但这是 GCC 的东西。) 以获取 I2C 端口地址的引用。

    如果未找到该代码、则它必须是您的代码。

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

    问题已解决。 为了让其他运行此模式的人受益、NAK 是因为从器件重复被复位。 从器件再次复位和初始化 I2C 需要一段时间、在此期间、从器件不会将 SDA 拉至低电平。 由于电路板中的接地问题、它被复位。 一旦电压和电流 AFE 的接地连接在一起、i2041 I2C 从器件复位问题就消失了、事务开始正常工作。