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.

[参考译文] CCS/MSP430G2553:MSP430G2553在 I2C 从模式下、程序在每个传输周期传输两次中断

Guru**** 2546550 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/589708/ccs-msp430g2553-msp430g2553-in-i2c-slave-mode-the-program-go-to-transmit-interrupt-twice-per-transfer-period

器件型号:MSP430G2553

工具/软件:Code Composer Studio

我正在 I2C 从模式下使用 MSP430G2553、 并且已经启用  UCB0TXIE 位、现在主器件可以从从从从器件接收正确的数据、 但我发现、当我使用主器件时、从器件一次从从器件获取数据、从器 件将进入 TX 中断服务两次。

这是正常的、还是没有正确的配置?

谢谢!

这是 I2C 配置:

P1SEL |= SDA_PIN + SCL_PIN;//将 I2C 引脚分配给 USCI_B0
P1SEL2 |= SDA_PIN + SCL_PIN;//将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMODE_3 + UCSYNC;// I2C 从机、同步模式
UCB0I2COA = SLAVE_ADDRESS;//设置自有(从器件)地址
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
IE2 |= UCB0TXIE + UCB0RXIE;//启用 TX 中断
UCB0I2CIE |= UCSTTIE;//启用 STT 中断
TI_START_CALLBACK = SCallback;
TI_Receive_callback = RCallback;
TI_transmit 回调= Tcallback;

这是中断服务代码:

#pragma vector=USCIAB0TX_vector
_interrupt void USCI_i2c_data_ISR (void)

  IF (IFG2 & UCB0TXIFG)
  TI_Transmit 回调(&UCB0TXBUF);
  其他
  TI_Receive_callback (UCB0RXBUF);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么会错呢? 主器件实际上做什么? 显示了示波器或逻辑分析仪捕获的波形。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Clemens、您好、感谢您的回答。

    黄色波形为 SCL 信号、蓝色波形为 SDA 信号、从器件地址为0x48。 主器件开始通信 、并从从器件读取数据。

    通过调试、我发现当主器件完成从器件地址(7位)和读取命令(1位)的发送时、从器件进入 I2C TX 中断一次、当主器件完成从从器件读取一个字节时、从器件再次进入 I2C TX 中断。

    谢谢!

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

    [您的示波器具有屏幕截图功能。]

    此行为正常。 请参阅用户指南的第17.3.4.1.1节:

    如果主器件向从器件请求数据、USCI 模块将自动配置为发送器、并置位 UCTR 和 UCBxTXIFG。 SCL 线路被保持在低电平、直到将要发送的第一个数据被写入发送缓冲器 UCBxTXBUF。 然后地址被应答、UCSTTIFG 标志被清除、数据被发送。 一旦数据被传输到移位寄存器、UCBxTXIFG 就会再次被置位。

    您之所以获得 TX 中断、是因为硬件想知道要发送的下一个字节是什么。 这种情况会尽快发生(在发送前一个字节时)以避免字节之间的延迟、因此即使主器件不会请求下一个字节、也有可能获得中断。

    您可以忽略第二个 TX 中断。 但是、您实际上不知道主器件是否请求另一个字节。 如果它确实执行了并且您没有向 TXBUF 写入任何内容、则总线将挂起。

    因此您应该写入一些值。 只需使用与前一个字节相同的值、或0或0xFF;实际值实际上无关紧要。

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

    高 清流明:

    非常感谢您的帮助!

    我使用全局变量来标识要发送的数据、并且 在一个读取周期中、TXBUF 将填充与您建议的值相同的值。