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.

[参考译文] MSP430FR5043:MSP430FR5043:与 BQ25700A IC 进行 I2C 通信,MSP430FR5043不提供 ACK

Guru**** 663810 points
Other Parts Discussed in Thread: BQ25700A, MSP430FR5043
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1117521/msp430fr5043-msp430fr5043-i2c-communication-with-bq25700a-ic-msp430fr5043-not-giving-ack

器件型号:MSP430FR5043
主题中讨论的其他器件:BQ25700A

你(们)好

我正在尝试将 MSP430FR5043与 BQ25700A 连接,但在测试时发现 MSP430FR5043正在为从 BQ25700A 接收的数据提供 ACK。 请参阅下面的波形。

MSP430给出了 R/W 位为零的从器件地址0x12H。 这里、从器件 BQ25700A 提供 ACK。

然后 MSP430发出命令0x34H。 这里、从器件 BQ25700A 提供 ACK。

从器件地址0x13H 由 MSP430的 R/W 位指定为1、然后从器件 BQ25700A 提供数据0x20、但 MSP430不会为接收到的数据提供 ACK、因此通信失败。

在这里、我们怀疑 MSP 在 BQ25700A 从器件之前设置 ACK 位、到到时钟时、该位将被视为 NACK。

建议解决此问题。

此致

Bivin

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

    您好、Vivin、

    对于0x13H、这是 I2C 读取命令、对吧?

    您是否使用此示例代码来测试 I2C 读取函数?

    https://dev.ti.com/tirex/explore/node?node=AM2CqGohFh.JSojcZJH6mA__IOGqZri__LATEST

    谢谢!

    此致

    Johnson

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

    你(们)好,约翰逊

    如果出现 NACK、您是否建议使用下面突出显示的部分、请确认。

    您能否告诉我 MSP430为何不将由 BQ25700A 从器件设置的 SDA 线路拉低

    是否有单独设置 ACK 位的方法。

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

    MSP430 I2C 硬件通常可以处理 ACK。 这使我怀疑您的代码有问题。 但我无法告诉您、因为您尚未展示它。

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

    您的代码似乎在接收第一个字节后(期间)发出 Stop 命令。 在这种情况下、I2C 单元生成一个到当前 Rx 字节的 NACK [参考用户指南(SLAU367P)第32.5.2.2节]。

    您的代码是什么样的?

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

    你(们)好

    请找到以下代码。

    请对此进行评论。

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

    我的第一个猜测是 i2c_addn_config_b0 ()正在尝试更新 UCB0TBCNT 而不复位 UCB0 (切换 UCSWRST)、因此在读取阶段它仍然为=1。

    该函数的具体作用是什么?  

    未经请求:在第二次读取 UCB0RXBUF 之前、您真的应该等待 UCRXIFG0再次变为高电平。 我怀疑这是(将会)由于您对串行端口的写操作而意外工作。

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

    大量代码丢失。 (请使用"插入代码"按钮发布代码、图像捕捉是一种糟糕的方法。) 初始化和中断服务例程。  加号、当然、该代码用于设置自动停止的字节计数。 (注意:该寄存器只能在 UCSWRST=1时更改。)

    如果使用此代码来生成捕获、则会将数据的初始部分保留下来。

    接收代码就是一场噩梦。 您启用接收中断、然后轮询 RXIFG。 您不能同时执行这两项操作。 ISR 将产生接收中断、主例程永远不会看到 RXIFG 置1、因此它将在不读取 RXBUF 的情况下一直等待。 当然、该位关于第二次读取 RXBUF 而无需等待第二次 RXIFG。

    它还会显示为在传输一个字节后发出停止。 处理这种情况的常用方法是重复启动。 不是一个完整的停留