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.

[参考译文] MSP430FR2433:SPI 从器件不生成中断、但在轮询模式下工作

Guru**** 2551110 points
Other Parts Discussed in Thread: MSP430FR2433, MSP-EXP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987907/msp430fr2433-spi-slave-not-generating-interrupts-but-works-in-polling-mode

器件型号:MSP430FR2433
主题中讨论的其他器件: MSP-EXP430FR2433

您好!

我不熟悉 MSP430、并尝试确定如何将 MSP430FR2433设置为从器件(处于回路模式以验证操作)。 我正在使用 MSP-EXP430FR2433开发套件。

使用 SLAC700e 的示例代码(msp430fr243x_euscia0_SPI_10.c)、环回失败。

SLAC700e 的示例代码:

#include <msp430.h>

int main(void)
{
WDTCTL = WDTPW|WDTHOLD; // Stop watchdog timer

P1SEL0 |= BIT4 | BIT5 | BIT6; // set 3-SPI pin as second function

UCA0CTLW0 |= UCSWRST; // **Put state machine in reset**
UCA0CTLW0 |= UCSYNC|UCCKPL|UCMSB; // 3-pin, 8-bit SPI slave
// Clock polarity high, MSB
UCA0CTLW0 |= UCSSEL__SMCLK; // SMCLK
UCA0BR0 = 0x01; // /1, fBitClock = fBRCLK/UCBRx
UCA0BR1 = 0; //
UCA0MCTLW = 0; // No modulation
UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt

PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings

__bis_SR_register(LPM0_bits | GIE); // Enter LPM0, enable interrupts
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // Echo received data
}

主器件输出:

00

00

00

00

但在轮询模式下、从器件工作正常:

#include <msp430.h>
unsigned char RXData0 = 0;
unsigned char RXData1 = 0;
unsigned char TXData = 0xAA;
unsigned char counter = 0;

int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

P1SEL0 |= BIT4 | BIT5 | BIT6; // set 3-SPI pin as second function

UCA0CTLW0 |= UCSWRST; // **Put state machine in reset**
UCA0CTLW0 |= UCSYNC | UCCKPL | UCMSB; // 3-pin, 8-bit SPI slave
// Clock polarity high, MSB
UCA0CTLW0 |= UCSSEL__SMCLK; // SMCLK
UCA0BR0 = 0x01; // /1, fBitClock = fBRCLK/UCBRx
UCA0BR1 = 0; //
UCA0MCTLW = 0; // No modulation
UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt

PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings

// __bis_SR_register(LPM0_bits | GIE); // Enter LPM0, enable interrupts
while (1)
{
if (UCA0IFG & UCRXIFG)
{
if (counter == 0)
{
RXData0 = UCA0RXBUF;
while (!(UCA0IFG & UCTXIFG))
;
UCA0TXBUF = RXData0;
counter = 1;
}
else
{
RXData1 = UCA0RXBUF;
while (!(UCA0IFG & UCTXIFG))
;
UCA0TXBUF = RXData1;
counter = 0;
}
}
}

}

主器件输出:

00

11 AA

12 AB

13交流

14广告

15 AE

16 AF

17B0

18 B1

19 B2.

我知道中断标志已启用。 我不知道为什么从未调用 ISR。 如果有任何建议、我们都会很感激!

谢谢

高拉夫  

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

    您好、GauravS、

    在进入低功耗模式之前、尝试将第一个字节写入 TXBUF。

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

    您好 Dennis、

    感谢您的建议。  

    这真的很愚蠢,但我今天早上回来尝试你的建议,我重新按照上面的例子,令我惊讶的是,原来的例子现在是一种魅力。 为浪费每个人的时间而道歉。 我不知道问题是什么,也不知道问题是如何解决的!

    谢谢

    高拉夫

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

    FR2433 Launchpad 之前(可能仍然是)预加载了一个使用 RTC 的演示程序。 使用调试器加载新程序不会重置 RTC (这是一项功能)、因此新程序将在一秒钟左右之后莫名地在 FaultISR 处结束。

    这个症状在多个程序加载过程中会持续下去,直到用户(像我这样的人)感到沮丧并拔出 USB --芯片上电循环确实会复位 RTC。

    我不知道您的情况是否如此、但这是使用新 Launchpad 获得不可重现结果的一种方法。

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

    谢谢 Bruce! 所以我并没有完全失去我的大理石,看了。

    更重要的是、此 LaunchPad 并不是全新的、它通过了多对手。 昨天我在处理 RTC 示例代码、直到今天结束才拔下 USB 插头。 我想知道任何 RTC 实例都可以触发神秘的错误 ISR 吗? 此问题是否发生在生产电路板上、还是仅限于此评估板?  

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

    危险发生在芯片上、而不是主板上、但是只有当你(a)加载一个使用 RTC 的程序(特别是 RTCIE)、然后(b)加载一个不同的程序而不是。

    实际上、我希望在生产电路板上很少会发生这种序列。 相比之下、加载非常不同的程序可能是任何人使用新 Launchpad 进行的第一件事。

    另外一种选择--有一个 PUC 复位停止 RTC --将大大丧失功能。

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

    感谢您的澄清。 一个良好的经验法则是在启动时清除 RTCIE 以避免这种情况?

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

    是的、您可以使用"RTCCTL=0;"来启动每个程序。 我发现、只要意识到这种情况可能发生就足够了。