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.

[参考译文] MSP430F5529:MSP430F5529 I2C 主器件通信代码有问题

Guru**** 2553910 points
Other Parts Discussed in Thread: MSP430F5529, MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/596864/msp430f5529-problem-with-the-code-for-msp430f5529-i2c-master-communication

器件型号:MSP430F5529
主题中讨论的其他器件: MSP430G2553

大家好、首先、感谢大家对我的问题给予的关注和时间。

因此、我正在开发一个包含 MSP430F5529的系统、该系统通过 I2C 与 AD5933通信。 之前、我对 MSP430G2553执行了同样的操作、一切都进展顺利、我的代码运行完美。 我确实使用示波器进行了检查、并且正在发送每个数据。 我从新系统的代码开始、并在 G2553至 F5529之间进行了所有必要的更改、端口、中断、寄存器。

无论什么、我的代码都会在验证循环中停止。 特别是这个:

while (UCB0STAT 和 UCBBUSY); 

当我用示波器检查总线时、SCL 始终为高电平、SDA 始终为低电平。 因此、总线上没有发生任何事情。

我在代码执行期间使 LED 闪烁、这样就可以正常工作了。

我的代码是波纹波纹的、请检查它、如果您发现错误、或者您有一些想法让我尝试一下、请告知我。

#include 

#define SLAVE_ADDRESS 0x0D /**< AD5933的地址。 //
#define BAUD_RATE 0x12 /**<波特率值。 */
#define SDA_PIN BIT0 // msp430F5529 UCB0SDA 引脚
#define SCL_PIN BIT1 // msp430F5529 UCB.S.引脚

有符号 char byteCtr;
无符号 char * TI_transmit 字段;
无符号 char * TI_receive_field;

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//LED 配置
P1DIR |= BIT1;
P1OUT |= BIT1;
P1OUT ^=(BIT1);//打开 LED

要发送的//MSP 配置
P3SEL |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0

UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 =波特率; //设置预分频器
UCB0BR1 = 0;
UCB0I2CSA = SLAVE_ADDRESS; //设置从器件地址
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
UCB0IE = UCNACKIE;
UCB0IE |= UCTXIE; //启用中断

P1OUT ^=(BIT1); //关闭 LED
while (UCB0STAT 和 UCBBUSY) //等待先前的通信清除
;

//从机寄存器的配置(发送数据)
unsigned char field[2]={0x80、0xB1};
TI_Transmit 字段=字段;
byteCtr = 2;
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件
while (UCB0STAT 和 UCBBUSY)
;

while (1)
;
}//

中断
#pragma vector = USCI_B0_vector
__interrupt void USCI_B0_ISR (void)
{
开关(_偶数_在范围内(UCB0IV、12))
{
情况0:
中断; //向量0:无中断
案例2:
中断; //向量2:ALIFG
案例4:
UCB0CTL1 |= UCTXSTP;
UCB0IFG &=~UCNACKIFG;
中断; //向量4:NACKIFG
案例6:
中断; //向量6:STTIFG
案例8:
中断; //向量8:STPIFG
案例10: //向量10:RXIFG --我还没有使用它(但我会)
IF (byteCtr = 0)
{
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
* TI_Receive_field = UCB0RXBUF;
TI_Receive_field++;
}
其他
{
* TI_Receive_field = UCB0RXBUF;
TI_Receive_field++;
字节 Ctr --;
}
中断;
情况12: //向量12:TXIFG
IF (byteCtr = 0)
{
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
UCB0IFG &=~UCTXIFG; //清除 USCI TX int 标志
}
其他
{
UCB0TXBUF =* TI_transmit 字段;
TI_Transmit 字段++;
字节 Ctr --;
}
中断;
默认值:
中断;

}
}

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

    您永远不会设置全局中断使能位(SR 寄存器的 GIE)、因此永远不会访问 USCI_B0中断。 因此、一个起始条件被发送、但没有其他的发送、并且 UCBBUSY 位永远不会被一个停止条件清除。

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

    您好、Ryan、非常感谢您抽出宝贵的时间。

    我添加了以下行:

    _enable_interrupt (); 

    就在启用其他中断之后。 仍然是同样的问题、它会在相同的时间卡住。

    此致、

    加布里埃拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第一个还是第二个 while 环路? 是否曾经从 IFG 的情况12发送停止条件? 需要进一步进行中断调试。

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

    第一个问题、代码不再继续。
    我真的不知道是否发送了停止条件。 因为中断已启用、它应该是这样、对吧? 如何检查它?
    通过示波器、我看不到任何东西、SCL 始终为高电平、SDA 始终为低电平。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果它没有比第一个 while 环路更远、那么您甚至还没有特意发送启动条件、在这种情况下、这听起来像是一个硬件问题、使 SDA 线路保持低电平。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Ryan! 我发现、如果我停止代码时、我拔下 USB 插头并重新插上插头、数据将被发送。 我可以在示波器上看到总线。 现在它正在工作!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还有一个问题。 为什么 G2553中不需要该线路启用全局中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还需要在 MSP430G2553中设置 GIE。

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

    但我没有在 G5223系统中执行它。 它的工作原理非常好。 这就是为什么很难理解这一个(F5529系统)的错误。

    在 G5223系统中、我只初始化:

    UCB0I2CIE = UCNACKIE;
    IE2 = UCB0TXIE; //启用 TX 就绪中断 

    或:

    UCB0I2CIE = UCNACKIE;
    IE2 = UCB0RXIE; //启用 RX 中断 

    如果您知道发生这种情况的原因、请告诉我。

    总之、非常感谢您、我的系统现在可以正常工作。 我真的很沮丧! 你拯救了我的生命:)

    此致、

    加布里埃拉