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.

[参考译文] MSP430G2553:MSP430G2231的 SPI 通信问题

Guru**** 2390995 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/671519/msp430g2553-spi-communication-issue-with-msp430g2231

器件型号:MSP430G2553

您好!

我正在尝试在2553 (主器件)和2231 (从器件)之间建立 SPI 通信、以便能够切换从器件上的 P1.0 LED。

我找到了 TI 提供的一些代码、因此大多数后续代码都是通过这些代码获得灵感的。

由于我没有几个从器件,所以我只使用:MOSI 和 CLK。

实际上、当两个 LaunchPad 都插入到计算机中时、它就可以工作了。 但是、当其中一个设备插入另一台计算机或电池时、SPI 通信停止(失败)。

我假设这是一个接地问题、因此我将一个接地端连接到另一个接地端、但即使两个接地端都插入同一台计算机、通信仍然失败...

这是调试的一天、我找不到任何解决方案。

有人可以帮帮我吗?  

以下是代码:

主设备:  

void init_SPI (void){
P1DIR |= BIT5;
P1SEL |= BIT5 + BIT7;
P1SEL2 |= BIT5 + BIT7;
UCB0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 |= 0x02; ///2
UCB0BR1 = 0; //
UCB0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**

__DELAY_CYCLES (75); //等待从器件初始
化}

void init_timer_1s (void)
{
TA0CTL = tassel_2 | ID_3 | MC_3;
TA0CCR0 = 0xFFFF;
}

void timer_wait (void)
{
TA0R = 0x00;
while (!(TA0CTL 和 TAIFG))
;
TA0CTL &=~TAIFG;
}

void main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
BCSCTL1 = CALBC1_1MHz; //将 DCO 设置为1MHz
DCOCTL = CALDCO_1MHz; //将 DCO 设置为1MHz

init_spi ();
init_timer_1s ();

__enable_interrupt ();

while (1){
while (!(IFG2 & UCB0TXIFG))
;
UCB0TXBUF =数据;
timer_wait();

while (!(IFG2 & UCB0TXIFG))
;
UCB0TXBUF =数据;
Timer_wait();
}




从属方:
void init_SPI (void)
{
USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE;/*端口、SPI 从器件*
USICTL1 |= USIIE;/*计数器中断、标志保持置位*/
USICTL0 &=~USISWRST;/* USI 被释放以进行操作*/
USISRL = P1IN;//初始化加载数据*/
USICNT = 8;/* init-load 计数器:NB DE BITS A Recevoir */
}

void main (void)
{

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器*/

init_spi();

P1DIR |= 0x01;

_enable_interrupt ();

while (1)
{
//
}

}

#pragma vector=USI_vector
__interrupt void universal_serial_interface (void)
{
开关(USISRL)
{
情况0xA1:
P1OUT |= 0x01;
中断;
情况0xB1:
P1OUT &=~0x01;
中断;
}
USISRL = P1IN;//重新加载数据
USICNT = 8;//重载计数器

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

    我假设发生的情况是、主器件在从器件准备就绪之前开始发送数据、因此从器件看到的数据不正确。 您还应确保连接了两个器件的 GND、以便它们具有相同的参考点。

    通过始终确保在主器件尝试发送任何数据之前从器件完全上电并初始化、可以缓解这种情况。 此外、我建议使用逻辑分析仪或示波器来探测 SPI 引脚、并确保它们正在工作并发送正确的数据。

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

    根据我在上一帖子中提供的信息、您是否能够解决此问题?

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

    您好!

    是的、它最终是与我的从器件的相位/极性相关的问题、与主器件上的相位/极性不同。

    感谢您的提问!