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.

[参考译文] MSP430FR5994:I2C ACK 位于地址之后、但不在第一个数据字节之后

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1238457/msp430fr5994-i2c-ack-after-address-but-not-after-the-first-dats-byte

器件型号:MSP430FR5994

数据字节将从 I2C 主器件发送到从器件。 从器件在地址之后而不是在数据字节之后发送一个 ACK。 RX 寄存器为0x00。

使用了非常慢的时钟速率。 主器件和从器件位于同一 IC 中(主器件:UCB1、从器件:UCB2)。

SDA 和 SCL 上的电阻器为4.7k Ω。 示波器显示了发送地址(0x48)和数据字节(0xA5)时行的电平。

这是主器件的初始化:

    // Configure USCI_B0 for I2C mode
      UCB1CTLW0 |= UCSWRST;                     // Software reset enabled
      UCB1CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK; // I2C mode, Master mode, sync
      UCB1BRW = 0x1388;                         // baudrate = SMCLK / x
      UCB1I2CSA = 0x000A;                       // Slave address
      UCB1CTLW0 &= ~UCSWRST;                    // clear reset register
      UCB1IE |= UCRXIE | UCTXIE | UCNACKIE | UCBCNTIE;

这是从器件的初始化:

    // Configure USCI_B0 for I2C mode
      UCB2CTLW0 |= UCSWRST;                     // Software reset enabled
      UCB2CTLW0 |= UCMODE_3 | UCSYNC;           // I2C mode, sync mode
      UCB2I2COA0 = 0x000A | UCOAEN;             // own address is 0x0A + enable
      UCB2CTLW0 &= ~UCSWRST;                    // clear reset register
      UCB2IE |= UCTXIE | UCRXIE0 | UCSTPIE;

此示波器显示如下:

请帮助我们解决这个问题。
当主器件和从器件位于同一个 IC 时、是否有特殊注意事项? 如果地址被确认、但数据不是、原因可能是什么?
非常感谢您的帮助!

此致
哈迪

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

    我读取到该示波器跟踪结果表明从器件正在拉伸时钟(因此还没有 ACK 周期)、大概是因为它没有读取 RXBUF。

    将两侧托管在单个 MCU 中的主要考虑因素是避免其中任何一方锁定另一方。  

    此外、请注意 UCSTPIFG 的优先级。 我通常会尝试找到避免使用它的方法。

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

    感谢您的回答。
    我不理解从机的时钟拉伸。 从器件是否实际上影响了时钟? 为时钟脉冲的接收器吗? 我已经用这样的方式理解示例、在0xA5的最后1位发送后、仍然有一个时钟边沿、并且认为这用于 ACK 的请求。
    顺便说一下、从器件侧不调用任何中断。 我们将使用 DMA 进行实验。
    读取 RXBUF 是否真的是生成 ACK 的条件?
    众多问候语
    哈迪

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

    从器件可以拉伸(保持低电平) SCL 线路。 用户指南(SLAU367P)第32.3.7.2节列出了拉伸标准。 SEC 32.3.5.1.2提到、第一个(接收到的)数据字节始终是 ACK。  

    如果从机侧看不到任何可能解释未读取 RXBUF 原因的中断。 您在 UCB2IFG 中看到了什么? 此时、主端在做什么?

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

    当一个发送中断被触发时、主器件进行发送。 UCB2IFG 为0x04。 当一个字节被发送时、以及当几个字节已经被发送时、情况就是如此。 停止发送后、UCB2IE 为0x000B。
    我怀疑 UCB2缺少可工作的设置。

    感谢您的帮助。

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

    UCSTTIFG 指示 I2C 单元接受 SLA 字节、因此通常处于运行状态。 如何判断从侧中断永远不会触发? ISR 中的断点?

    作为快速实验、您可以尝试加快时钟速度。 是的、我知道它应该在最低0Hz 时有效、但有时最好检查一下假设。

    此外、主器件对 UCBCNTIFG 执行什么操作? 当 UCASTP=0时、我预计它永远不会触发、但看到它 就表明我们还没有看到其他一些相关代码。

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

    与此同时、我们已经看到 PCB 上的电容器安装不正确。 因此、信号不会作为方波到达接收引脚。
    非常感谢您的帮助。 然而、我们得到了一些有趣的事实。
    您好
    哈迪·齐塞尔