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.

[参考译文] MSP430F5659:I2C 主设备读取的字节多于所需的字节

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430F5659

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/587755/msp430f5659-i2c-master-reads-one-byte-more-than-needed

器件型号:MSP430F5659

您好!

我将 MSP430F5659用作 I2C 主设备、目前我正在尝试通过 I2C 中断执行干净的读取命令。 从器件按预期发送数据、但主器件似乎会 ACK 最后所需的字节、而不是发送 Nack/stop、因此从器件会发送另一个字节(比需要多一个字节)、然后 MSP 才会发送 Nack/stop。

以下是我在中断中完成的代码示例:

开关(__evo_in_range (UCB2IV、USCI_I2C_UCTXIFG))

/*... 一些其他代码... *

 案例 USCI_I2C_UCRXIFG://接收到的数据

   count++;

   if (count == nBytesToRead)//此事务不需要更多操作
   {
    //发送停止条件。
    UCB2CTL1 |= UCTXSTP;
   }

   //此处,我们在发送 STOP 并递增计数后读取 UCBxRXBUF,以便立即生成 STOP
   buf[count-1]= UCB2RXBUF;//从缓冲区获取数据


   中断;

/*... 一些其他代码... *

 

I2C 数据表(slau412e)指出"将 UCTXSTP 位置1会产生一个停止条件。 置位 UCTXSTP 后、在从器件接收到数据后会产生一个 NACK、然后是一个停止条件、如果 USCI 模块当前正在等待 UCBxRXBUF 被读取、则会立即产生一个 NACK。"

我正在尝试达到句子的第二部分、即 发送 STOP 后读取 UCBxRXBUF、以便立即停止。 而我得到的是该句子的第一部分、即停止仅在接收到下一个字节后发送。

扼要重述一下:我打算通过 I2C 主机中断接收2个字节、但我接收3个字节。

是否有任何关于为什么会发生这种情况的想法?

谢谢、

Fred

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

    您好!

    当在 MSP430上以 I2C 主机模式接收字节时、主机需要在接收到的 N-1字节处设置 UCTXSTP 位。 例如、当尝试接收两个字节时、UCTXSTP、但当接收到第一个字节时应置位。 如果主器件试图接收一个字节、主器件需要发送起始条件、等待它被发送、然后置位 UCTXSTP 位。

    最后、请查看 MSP430 MCU 上 eUSCI 和 USCI 串行通信常见问题解决方案的 I2C 部分。 这详细说明了在开发串行通信时遇到的许多常见问题、包括您在此处描述的问题。

    此致、  

    Caleb Overbay

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

    您好 Caleb、

    感谢您的回答。 但是、我尝试过它、现在主器件似乎没有发送正确的停止、或者它确实延迟了。 以下是2张图、用于说明我的意思:

    1- 在接收到第二个字节后设置 UCTXSTP

    2-在接收第二个字节之前设置 UCTXSTP

    正如您在第一个图中看到的、STOP 在接收到第三个字节后立即发送。 但是、在第二个图中、第二个字节被确认、而不是 NACK + STOP、然后这些行被保持在低电平。 此外、线路保持低电平的时间似乎是接收第三个字节的时间(请参阅图1)。 有什么关于为什么会发生这种情况的想法?

    谢谢、

    Fred

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

    请忽略我的最后一条消息、这是我部件上的编码错误。 它现在按预期工作、谢谢!