TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] MSP430FR4133:SPI 通信问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568314/msp430fr4133-spi-communication-issue

器件型号:MSP430FR4133

您好!

我将 msp430fr4133 launchpad 用作主控模式、将另一个 msp430fr4133控制器板用作从控模式。  

我只需将数据从主器件发送到从器件、然后监控回传数据。

我只想在 LCD 上显示接收到的数据。 但我没有得到任何结果。

请提供任何帮助。 我的代码在这里。

**** 主控器件*******


#include
#include "global.h"

unsigned char RXData = 0;
unsigned char TXData;


int main (空)

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

P5SEL0 |= BIT0 | BIT1 | BIT2 | BIT3;                //将4-SPI 引脚设置为第二个功能

UCB0CTLW0 |= UCSWRST;                        //**将状态机置于重置中**
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPL|UCMSB|UCMODE_1_UCSTEM;              // 4引脚、8位 SPI 主器件
                                                                                    //时钟极性高,MSB
UCB0CTLW0 |= UCSSEL_SMCLK;                                                   //选择 SMCLK
UCB0BR0 = 0x01;                                ///2、fBitClock = fBRCLK/(UCBRx+1)。
UCB0BR1 = 0;
// UCA0MCTLW = 0;                              //无调制
UCB0CTLW0 &=~UCSWRST;                       //**初始化 USCI 状态机**
UCB0IE |= UCRXIE;                                //启用 USCI_A0 RX 中断
TXData = 0x01;                                    //保留 TX 数据

PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置

while (1)

UCB0IE |= UCTXIE;                                 //启用 TX 中断
_bis_SR_register (LPM0_bits | GIE);                  //启用全局中断,进入 LPM0

_DELAY_CYCLES (2000);                                //下次传输前延迟
TXData++;                                           //递增发送数据

//__delay_cycles (20000);


#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif


开关(__evo_in_range (UCB0IV、USCI_SPI_UCTXIFG))

USCI_NONE 案例:中断;                 //向量0 -无中断
USCI_SPI_UCRXIFG 案例:
RXData = UCB0RXBUF;
UCB0IFG &=~UCRXIFG;
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//唤醒以设置下一个 TX


LCDDataOut (RXData、pos1);   //在 LCD 上显示接收数据


中断;
USCI_SPI_UCTXIFG 案例:
UCB0TXBUF = TXData;                  //发送字符
UCB0IE &=~UCTXIE;

中断;
默认值:break;

(三 从属方********

#include

int main (空)

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

P5SEL0 |= BIT0 | BIT1 | BIT2 | BIT3;                           //将4-SPI 引脚设置为第二个功能

UCB0CTLW0 |= UCSWRST;                                     //**将状态机置于重置中**
UCB0CTLW0 |= UCSYNC|UCCKPL|UCMSB|UCMODE_1|UCSTEM;       // 4引脚、8位 SPI 从器件
//时钟极性高,MSB
UCB0CTLW0 |= UCSSEL_SMCLK;                             //选择 SMCLK
UCB0BR0 = 0x01;                                             ///2、fBitClock = fBRCLK/(UCBRx+1)。
UCB0BR1 = 0;
// UCB0MCTLW = 0;//无调制
UCB0CTLW0 &=~UCSWRST;                                  //**初始化 USCI 状态机**
UCB0IE |= UCRXIE;                                          //启用 USCI_A0 RX 中断

PM5CTL0 &=~LOCKLPM5;                                   //禁用 GPIO 上电默认高阻抗模式
                                                            //激活先前配置的端口设置

_bis_SR_register (LPM0_bits | GIE);                            //输入 LPM0,启用中断


#pragma vector=USCI_B0_vector
_interrupt void USCI_B0_ISR (void)


while (!(UCB0IFG&UCTXIFG));                                      // USCI_A0 TX 缓冲器就绪?
UCB0TXBUF = UCB0RXBUF;                                       //回显接收到的数据

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

    您能缩小问题的范围吗? 您说您正在将数据从主 MSP430传输到从 MSP430、并且您希望在 LCD 上显示数据。 这是两种通信方式-哪种方式不起作用、代码中哪些部分的行为不符合预期?

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

    尊敬的 Dennis:

    谢谢!!

    我的问题是、我无法在主 MSP430 launchpad 板的 MISO 引脚上获取任何数据。

    在这里、我的主板是 msp430fr4133 launchpad、而从板是我们设计的另一个 msp430fr4133控制器板。

    我将 SCLK、MOSI、MISO、CS、VDD、GND 引脚连接到从板。  

    我的代码中是否有任何问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "无法获取 MISO 上的任何数据"是否意味着 MISO 始终处于高电平? 还是始终处于低电平? (两个单独的症状。)

    您如何测试它? 您首先从哪一侧开始?

    至于代码、需要注意两个方面:
    1) 1)到从器件到达其 ISR 时、主器件上的 Tx/Rx 已完成。 您的"回波"机制将始终关闭(至少) 1。 这是非常不可避免的、但您可以使用一个眼图捕捉器(例如0x5A 表示"忙"或其他内容)预加载从器件的 TXBUF。
    2) 2)在主器件中、第二次通过 while ()循环、当您设置 TXIE 时、GIE 已经被设置。 因此、Tx 中断会立即关闭。 由于您的 SPI 时钟非常快,因此在您处理 Tx 中断时,Rx 中断将关闭,因此它也将被处理--在 main()转至 LPM0之前。 当 main()随后进入 LPM0时,将不会留下任何中断源,因此主器件将永久停止。 避免这种情况的一种方法是在 TXIE 设置之前加上_disable_interrupt ()。

    也就是说、我预计症状是(MISO):8位为0 (SCLK 为0x00) 7位为0 (SCLK 为0x01)、那么不再有 SCLK。 症状会因首先从哪一侧开始而异。 以上就是问题。