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/MSP430FR5994:从属代码不进入中断向量

Guru**** 2390755 points
Other Parts Discussed in Thread: MSP430FR5969, MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/575565/ccs-msp430fr5994-slave-code-does-not-enter-the-interrupt-vector

部件号:MSP430FR5994
主题中讨论的其他部件:MSP430FR5969MSP430WARE

工具/软件:Code Composer Studio

这是我的主代码

/*--版权--,BSD
 *版权所有(c) 2016,Texas Instruments Incorporated
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用,无论是否使用
 *允许进行修改,前提是满足以下条件
 满足*:
 *
 ** 重新分发源代码必须保留上述版权
 *   注意,此条件列表和以下免责声明。
 *
 ** 以二进制形式重新分发必须复制上述版权
 *   注意,此条件列表和中的以下免责声明
 *   随分发提供的文档和/或其他材料。
 *
 ** 既不是德州仪器(TI)公司的名称,也不是的名称
 *   其贡献者可用于支持或推广衍生产品
 *   未经事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *和任何明示或暗示的担保,包括但不限于
 *对适销性和特定适用性的暗示担保
 *不承担目的。 在任何情况下,版权所有者或
 *贡献者对任何直接,间接,附带,特殊,
 *惩戒性或后果性损害(包括但不限于
 采购替代货物或服务;使用,数据或利润损失;
 (*或营业中断),但基于任何责任理论,
 *无论是合同,严格责任还是侵权行为(包括疏忽或
 *否则)因使用本软件而产生,
 *即使已被告知可能发生此类损害。
 *--/copyright--*/
//*************************************************************************************************
//! USI_B0,SPI 3线主控增量数据
//! 此示例显示SPI主中继器如何使用3线模式与SPI从属设备进行对话。
//! 从0x01开始,由主控制器发送递增数据。 接收的数据为
//! 应与之前的传输相同。 eUSCI RX ISR用于
//! 处理与CPU的通信,通常在LPM0中。 如果高,表示为“WFP 1.0 (WFP高)”
//! 有效的数据接收。  因为LPM0之后的所有执行都在ISR中,
//! 初始化等待DCO稳定在ACLK上。
//! ACLK =~32.768kHz,MCLK = SMCLK = DCO ~ 1048kHz。  BRCLK = SMCLK/2
//!
//! 与SPI从属数据回显代码示例一起使用。  如果从属设备处于调试模式,则为WFP 1.1
//! 从属复位信号与从属JTAG冲突;要解决此问题,请使用IAR
//! 从设备上的"release JTAG on Go (释放JTAG on Go)"。  如果在中设置了断点
//! 从RX ISR,主中继器也必须停止,以避免从中继器过度运行
//! RXBUF。
//!
//!             已在MSP430FR5969上测试
//!                 --------
//!            /|\|                |
//!             | ||                |
//!    主----+->|RST             |
//!                ||                 
//!                            世界气象组织| 1.6 |->数据输出(UCB0SIMO)
//!                ||                 
//!                            WFP | 1.7 |<-数据输入(UCB0SOMI)
//!                ||                 
//!                            WFP | 2.2 |->串行时钟输出(UCB0CLK)
//!
//!
//! 本示例使用以下外围设备和I/O信号。  您必须
//! 查看这些内容并根据需要对您自己的主板进行更改:
//! -SPI外围设备
//! - GPIO端口外设(用于SPI引脚)
//! -UCB0SIMO
//! - UCB0SOMI
//! - UCB0CLK
//!
//! 此示例使用以下中断处理程序。  以使用此示例
//! 在您自己的应用程序中,必须将这些中断处理程序添加到
//! 引导程序表。
//! - USI_B0_Vector
//!
//*************************************************************************************************

#include "driverlib.h"
#include <stdio.h>

易失性uint8_t RXData = 0;
易失性uint8_t TXData = 0;
易失性UINT32_t I;

Void主(void)

   易失性uint16_t i;

   //停止看门狗计时器
   WDT_A_HOLD (WDT_A_BASE);

   //将WFP 1.0 设置为输出引脚。
   /*

    *选择端口1
    *将引脚0设置为输出
    */
   GPIO_setAsOutputPin(.
       GPIO端口P1,
       GPIO_PIN0
       );
   //将WFP 1.0 设置为低输出。
   /*

    *选择端口1
    *将引脚0设置为输出低电平。
    */
   GPIO_setOutputLowOnPin (
       GPIO端口P1,
       GPIO_PIN0
       );

   //为LFXIN配置引脚
   //将PJ.4和PJ.5设置为主模块功能输入。
   /*

    *选择端口J
    *将引脚4,5设置为输入主模块功能(LFXIN)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口PJ,
       GPIO _PIN4 + GPIO _PIN5,
       GPIO主要模块功能
       );

   //设置XT1的外部频率
   cs_setExternalClockSource(3.2768万,0);
   //将DCO频率设置为最大DCO设置
   CS_setDCOFreq (CS_DCORSEL_0,CS_DCOFSEL_3);
   //选择XT1作为无分频器的ACLK的时钟源
   CS_initClockSignal (CS_ACLK,CS_LFXTCLK_SELECT,CS_Clock_diver_1);
   //在没有超时的情况下启动XT1
   cs_turnOnLFXT(CS_LFXT_DRIVE_0);

   //配置SPI引脚
   //为UCB0CLK配置引脚

   /*

    *选择端口2
    *将引脚2设置为输入辅助模块功能(UCB0CLK)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口_P5,
       GPIO _PIN2,
       GPIO辅助模块功能
       );
   //为UCB0TXD/UCB0SIMO,UCB0RXD/UCB0SOMI配置引脚
   //将WFP 1.6 ,WFP 1.7 设置为辅助模块功能输入。
   /*

    *选择端口1
    *将引脚6,7设置为输入辅助模块功能(UCB0TXD/UCB0SIMO,UCB0RXD/UCB0SOMI)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口_P5,
       GPIO _PIN0 + GPIO _PIN1,
       GPIO辅助模块功能
       );

   //为UCA1STE配置引脚
          //将WFP 2.3 设置为辅助模块功能输入。
          /*
           *选择端口2
           *将引脚3设置为输入辅助模块功能(UCA1STE)。
           */
      GPIO_setAsPeripheralModuleFunctionOutputPin (
              GPIO端口_P5,
              GPIO _PIN3,
              GPIO辅助模块功能
              );

   /*
    *禁用GPIO开机默认高阻抗模式以激活
    *以前配置的端口设置
    */
   pm_unlockLPM5();
   printf("Hello world!\n");
   //初始化主中继器
   EUSCI_B_SPI_initMasterParam参数={0};
   param.selectClockSource = EUSCI_B_SPI_CLOCKSOURCE_ACLK;
   Param.clockSourceFrequency = CS_getACLK();
   param.desiredSpiClock = 50万;
   para.msbFirst = EUSCI_B_SPI_MSB_FIRST;
   Param.clockPhase = EUSCI_B_SPI_PHASE DATA_Changed_ONFIRST_Captured_on_next;
   Param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACILY_HIGH;
   PARAM.spin模式= EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW;
   EUSCI_B_SPI_initMaster(EUSSCI_B1_base,&param);

   //选择4引脚功能
       EUSCI_B_SPI_select4PinFunctional(EUSCI_B1_base,
       EUSCI_B_SPI_enable_signal_of_4WIRE_SLAVE
      );

   //启用SPI模块
   EUSCI_B_SPI_ENE(EUSI_B1_base);

   EUSCI_B_SPI_clearInterrupt (EUSI_B1_base,
                              EUSCI_B_SPI_Receive_interrupt
                              );

   //启用USI_B0 RX中断
   EUSCI_B_SPI_enableInterrupt (EUSI_B1_base,
                               EUSCI_B_SPI_Receive_interrupt);

   //等待从属设备初始化
   __DELAY周期(100);

   TXData = 0x1;                            //保存TX数据

   //USI_B0 TX缓冲器准备就绪?
   while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B1_BASE,
                                         EUSCI_B_SPI_Transmit_Interrupt))
   {
       ;
   }

   //将数据传输到从属设备
   EUSCI_B_SPI_TXData(EUSI_B1_base, TXData);

   __bis_sr_register(LPM0_bits + GIE);     // CPU关闭,启用中断
   __no_operation();                      //保留在LPM0中
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_B1_vector
__中断
#Elif已定义(__GMNU__)
__attribute__(中断(USI_B1_Vector))
#endif
空USI_B1_ISR(void)

   SWITCH(__EIV_IN_RANGE(UCB1IV,4))
   {
   //矢量2 - RXIFG
   案例2:
       //USI_B0 TX缓冲器准备就绪?
       while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B1_BASE,
                                             EUSCI_B_SPI_Transmit_Interrupt))
       {
           ;
       }

       RXData = EUSCI_B_SPI_receiveData (EUSCI_B1_BASE);
       IF (RXData=TXData)
       {gPIO_ToggleOutputOnPin (
                          GPIO端口P1,
                       GPIO_PIN0
                       );

                      //延迟
                      对于(i=1万; i>0; i--);}

       //增量数据
       TXData++;

       //发送下一个值
       EUSCI_B_SPI_SpeneData(EUSI_B1_base,
                                TXData
                                );


       //从属设备处理信息的传输之间的延迟
       __DELAY周期(40);

       中断;
   默认值:中断;
   }
}

这是我的从属代码:

/*--版权--,BSD
 *版权所有(c) 2016,Texas Instruments Incorporated
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用,无论是否使用
 *允许进行修改,前提是满足以下条件
 满足*:
 *
 ** 重新分发源代码必须保留上述版权
 *   注意,此条件列表和以下免责声明。
 *
 ** 以二进制形式重新分发必须复制上述版权
 *   注意,此条件列表和中的以下免责声明
 *   随分发提供的文档和/或其他材料。
 *
 ** 既不是德州仪器(TI)公司的名称,也不是的名称
 *   其贡献者可用于支持或推广衍生产品
 *   未经事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *和任何明示或暗示的担保,包括但不限于
 *对适销性和特定适用性的暗示担保
 *不承担目的。 在任何情况下,版权所有者或
 *贡献者对任何直接,间接,附带,特殊,
 *惩戒性或后果性损害(包括但不限于
 采购替代货物或服务;使用,数据或利润损失;
 (*或营业中断),但基于任何责任理论,
 *无论是合同,严格责任还是侵权行为(包括疏忽或
 *否则)因使用本软件而产生,
 *即使已被告知可能发生此类损害。
 *--/copyright--*/
//*************************************************************************************************
//!   SPI从属设备使用3线模式与SPI主设备进行对话。 已接收数据
//!   然后从主中继器和从中继器发送的数据被传回主中继器。
//!   USCI RX ISR用于处理通信,CPU通常在LPm4中。
//!   在初始数据交换之前,主脉冲从RST开始,以完成
//!   重置。
//!
//!   与eusci_spI_ex1_master代码示例一起使用。  如果从属设备处于
//!   调试模式下,来自主控制器的重置信号将与从控制器冲突
//!   JTAG;要解决此问题,请在从属设备上使用IAR的“Release JTAG on Go”。  如果
//!   断点是在从RX ISR中设置的,主中继器也必须停止才能避免
//!   超速从RXBUF。
//!
//!              在MSP430FR5969上进行了Tested
//!                 --------
//!            /|\|                |
//!             | ||                |
//!    主----+->|RST             |
//!                ||                 
//!                            世界气象组织| 1.6 |->数据输出(UCB0SIMO)
//!                ||                 
//!                            WFP | 1.7 |<-数据输入(UCB0SOMI)
//!                ||                 
//!                            WFP | 2.2 |<-串行时钟输出(UCB0CLK)
//!
//! 本示例使用以下外围设备和I/O信号。  您必须
//! 查看这些内容并根据需要对您自己的主板进行更改:
//! -SPI外围设备
//! - GPIO端口外设(用于SPI引脚)
//! -UCB0SIMO
//! - UCB0SOMI
//! - UCB0CLK
//!
//! 此示例使用以下中断处理程序。  以使用此示例
//! 在您自己的应用程序中,必须将这些中断处理程序添加到
//! 引导程序表。
//! - USI_B0_Vector
//!
//
//*************************************************************************************************

#include "driverlib.h"
#include <stdio.h>

volatile uint8_t发射器数据= 0x01,接收数据= 0x00;
易失性UINT32_t I;

Void主(void)

   //停止看门狗计时器
   WDT_A_HOLD (WDT_A_BASE);

   //为LFXIN配置引脚
   //将PJ.4和PJ.5设置为主模块功能输入。
   /*
    */
   GPIO_setAsOutputPin(.
       GPIO端口P1,
       GPIO_PIN0
       );

   GPIO_setOutputLowOnPin (
           GPIO端口P1,
           GPIO_PIN0
           );

   //
   /*选择端口J
    *将引脚4,5设置为输入主模块功能(LFXIN)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口PJ,
       GPIO _PIN4 + GPIO _PIN5,
       GPIO主要模块功能
       );

   //配置SPI引脚
   //为UCB0CLK配置引脚

   /*

    *选择端口2
    *将引脚2设置为输入辅助模块功能(UCB0CLK)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口_P5,
       GPIO _PIN2,
       GPIO辅助模块功能
       );
   //为UCB0TXD/UCB0SIMO,UCB0RXD/UCB0SOMI配置引脚
   //将WFP 2.0 ,WFP 2.1 设置为辅助模块功能输入。
   /*

    *选择端口1
    *将引脚6,7设置为输入辅助模块功能(UCB0TXD/UCB0SIMO,UCB0RXD/UCB0SOMI)。
    */
   GPIO_setAsPeripheralModuleFunctionInputPin (
       GPIO端口_P5,
       GPIO _PIN0 + GPIO _PIN1,
       GPIO辅助模块功能
       );

   //为UCA1STE配置引脚
              //将WFP 2.3 设置为辅助模块功能输入。
              /*
               *选择端口2
               *将引脚3设置为输入辅助模块功能(UCA1STE)。
               */
          GPIO_setAsPeripheralModuleFunctionOutputPin (
                  GPIO端口_P5,
                  GPIO _PIN3,
                  GPIO辅助模块功能
                  );

   /*
    *禁用GPIO开机默认高阻抗模式以激活
    *以前配置的端口设置
    */
   pm_unlockLPM5();

   //首先初始化从属设备到MSB,非活动高时钟极性和3线SPI
   EUSCI_B_SPI_initSlaveParam ={0};
   para.msbFirst = EUSCI_B_SPI_MSB_FIRST;
   Param.clockPhase = EUSCI_B_SPI_PHASE DATA_Changed_ONFIRST_Captured_on_next;
   Param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACILY_HIGH;
   PARAM.spin模式= EUSCI_B_SPI_4PIN_UCxSTE_ACTIVE_LOW;
   EUSCI_B_SPI_initSlave (EUSCI_B1_BASE,&param);

   //选择4引脚功能
          EUSCI_B_SPI_select4PinFunctional(EUSCI_B1_base,
          EUSCI_B_SPI_enable_signal_of_4WIRE_SLAVE
         );


   //启用SPI模块
   EUSCI_B_SPI_ENE(EUSI_B1_base);

   EUSCI_B_SPI_clearInterrupt (EUSI_B1_base,
                              EUSCI_B_SPI_Receive_interrupt
                              );
   //启用接收中断
   EUSCI_B_SPI_enableInterrupt (EUSI_B1_base,
                               EUSCI_B_SPI_Receive_interrupt
                               );
   printf("Hello world!\n");
   __bis_sr_register(LPM0_bits + GIE);      //输入LPM0,启用中断
}

//************************************************************************************************
//
//这是USI_B0中断向量服务例程。
//
//************************************************************************************************
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_B1_vector
__中断
#Elif已定义(__GMNU__)
__attribute__(中断(USI_B1_Vector))
#endif
空USI_B1_ISR(void)

   SWITCH(__EIV_IN_RANGE(UCB1IV,4))
   {
   //矢量2 - RXIFG
   案例2:
       //USI_B0 TX缓冲器准备就绪?
       while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B1_BASE,
                                             EUSCI_B_SPI_Transmit_Interrupt
                                             ))
       {
           ;
       }

       //将数据传输到主中继器
       EUSCI_B_SPI_SpeneData(EUSI_B1_base,
                                传输数据
                                );

       //从主服务器接收数据
       receiveData = EUSCI_B_SPI_receiveData (EUSI_B1_base);
       printf("Hello world!\n");
       IF (receiveData==传输数据)
       { gPIO_ToggleOutputOnPin(.
                  GPIO端口P1,
               GPIO_PIN0
               );

              //延迟
              对于(i=1万; i>0; i--);}

       //增加要传输的数据
       传输数据++;

       中断;

   默认值:中断;
   }
}

我有两个MSP430FR5994板,并且希望使用SPI通信使两个板相互发送和接收。 我正在使用TI提供的示例代码,并根据我的主板更改了代码中的端口和引脚编号。

当我在一个主板上运行主代码时,LED的切换发生在我增加TXData而不与从属设备建立任何连接时。 当我调试从属设备上的从属设备代码时,当它连接到运行主设备代码的主设备上,从属设备代码从不会进入中断向量以接收主设备发送的数据。

我想将eUSI_B1端口用于SPI,以便在两块板之间连接以下引脚:

5V至5V

接地至接地

为5.2 UCB1CLK从5.2 到WFP

为UCB1SIMO从5.0 调至WFP 5.0

为5.1 UCB1SOMI从5.1 调到了WFP

为5.3 UCB1STE从5.3 调至WFP

 

我出了什么问题?

 

谢谢!

Madhu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从eusci_b_spi_ex1_master和eusci_b_spi_ex1_slave代码到FR5994的端口开始,在添加4线模式和更改eUSSCI_B外设之前获取简单的工作示例。 您无需连接5 V导轨,因为它们未使用(MSP在3.3 V上运行)。 示波器或逻辑分析器屏幕截图也非常有用。 www.ti.com/.../slaa734.pdf

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试了eusci_b_spi_ex1_master和eusci_b_spi_ex1_slave代码以及eusci_a_spi_ex1_master和eusci_a_spi_ex1_slave代码(仅使用3引脚模式),但仍然不起作用。 这就是为什么我切换到4引脚,看看这是否会产生影响。 没有示波器,因此无法调查此问题。 我觉得我的联系可能有问题。

    因此,我正在使用MSP430FR5994主板,并且我正在分别为UCB1使用5.0 ,5.1 和5.2 引脚SIMO,SOMI和CLK,并为代码中的B SPI模块使用相应的函数。 请告诉我我是否使用了正确的针脚,针脚之间的连接听起来是否正确

    谢谢!
    Madhu
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的SPI连接正确,您提到GND线已连接,但每个LauchPad如何通电? 从控制器很可能通过EZ-FET连接到您的PC,以便您可以使用CCS调试器,主控制器是否也通过EZ-FET供电,还是通过从控制器Vcc/外部电源供电? 如果是后者之一,则确保断开EZ-FET管座,并记住此示例不需要5 V电压。 您还可以尝试FR5994 C代码示例,看看它们是否提供了任何不同的结果。

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

    我读到,主控制器的针脚5.0 需要连接到从控制器的针脚5.1 ,主控制器上的针脚5.1 需要连接到从控制器上的针脚5.0。 这是真的吗?

    那么我应该断开两个板的5V端口之间的连接吗? 我是否应该用电缆连接两个主板的3V端口?

    因此从属设备通过USB电缆连接到我的PC (什么是EZ-FET?) 主控制器通过外部电源供电。 EZ-FET接头在哪里....它们是否在代码中?

    我找不到FR5994 C代码示例。 搜索了很多地方。 我最近的一个是FR5969。

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

    接地至接地

    为5.2 UCB1CLK从5.2 到WFP

    为UCB1SIMO从5.0 调至WFP 5.0

    为5.1 UCB1SOMI从5.1 调到了WFP

    我在再次尝试3个PIN码时删除了"从选择"

    非常感谢您的帮助! 我真的很感激!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目前的问题是您的Pxsel bits,用于WFP 5.0 和WFP 5.2。 您仍在使用eUSCI SPI引脚上的GPIO_secondary_module_function,当此示例使用UCB0时,将其更改为gPIO_primary_module_function将解决此问题。 保持图中所示的连接。 SPI C示例(原生UCB1)可从产品的工具和软件页面下载: www.ti.com/.../slac710

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

    您好,Ryan:

    非常感谢。 由于我对微控制器的使用不太熟悉,所以我遇到了一些问题。 已尝试更改为gPIO_PRIMARY_MODULE_FUNCTION,但未能正常工作。 所以我使用了本机UCB1的示例代码,现在这是我的代码:

    主代码:

    /*--版权--,BSD_EX
     *版权所有(c) 2015,Texas Instruments Incorporated
     *保留所有权利。
     *
     *以源代码和二进制形式重新分发和使用,无论是否使用
     *允许进行修改,前提是满足以下条件
     满足*:
     *
     ** 重新分发源代码必须保留上述版权
     *   注意,此条件列表和以下免责声明。
     *
     ** 以二进制形式重新分发必须复制上述版权
     *   注意,此条件列表和中的以下免责声明
     *   随分发提供的文档和/或其他材料。
     *
     ** 既不是德州仪器(TI)公司的名称,也不是的名称
     *   其贡献者可用于支持或推广衍生产品
     *   未经事先书面许可。
     *
     *本软件由版权所有者和贡献者"按原样"提供
     *和任何明示或暗示的担保,包括但不限于
     *对适销性和特定适用性的暗示担保
     *不承担目的。 在任何情况下,版权所有者或
     *贡献者对任何直接,间接,附带,特殊,
     *惩戒性或后果性损害(包括但不限于
     采购替代货物或服务;使用,数据或利润损失;
     (*或营业中断),但基于任何责任理论,
     *无论是合同,严格责任还是侵权行为(包括疏忽或
     *否则)因使用本软件而产生,
     *即使已被告知可能发生此类损害。
     *
     *****************
     *
     *                      MSP430代码示例免责声明
     *
     * MSP430代码示例是通常包含的低级程序
     *在高度中演示单个外设功能或器件功能
     *简明扼要。 为此,代码可能依赖于设备的默认开机设置
     *注册值和设置,如时钟配置和必须注意
     *在合并多个示例中的代码时使用,以避免潜在的问题
     效果。 另请参阅www.ti.com/grace以获取GUI和www.ti.com/msp430ware
     *用于API函数库方法的外围设备配置。
     *
     *--/copyright--*/
    //************************************************************************************************
    //  MSP430FR5x9x演示- eUSI_B1,SPI 3线主控增量数据
    //
    //  说明:SPI主中继器使用3线模式与SPI从属设备进行对话。 递增
    //  数据由主服务器从0x01开始发送。 接收到的数据预期为
    //  与以前的传输TXData = RXData-1相同。
    //  USCI RX ISR用于处理与CPU的通信,通常在LPM0中。
    //  ACLK = 32.768kHz,MCLK = SMCLK = DCO ~1MHz。  BRCLK = ACLK/2
    //
    //
    //                  MSP430FR5994
    //-----------                 
    //           /|\|             Xin|-
    //            |||32KHz                  Crystal
    //            --|RST         XOUT|-
    //               |                |
    //               |            WFP 5.0 |->数据输出(UCB1SIMO)
    //               |                |
    //               |            WFP 5.1 |<-数据输入(UCB1SOMI)
    //               |                |
    //               |            WFP 5.2 |->串行时钟输出(UCB1CLK)
    //
    //  威廉·高
    //  德州仪器(TI)
    //  2015年10月
    //  使用IAR嵌入式工作台构建6.30 和Code Composer 6.1
    //************************************************************************************************
    #include <MSP4S.h>

    #define LED0 BIT0
    #define LED1 BIT6.

    volatile unsigned char RXData = 0;
    volatile unsigned char TXData;
    易失性int I;

    内部主(无效)

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

       //配置GPIO
       P5SEL1 &=~(BIT0 | BIL1 | BIIT2);       // USI_B1 SCLK,MOSI和Miso引脚
       P5SEL0 ||(BIT0 | BIT1 | BIT2);
       PJSEL0 || BIT4 | BIT5;                 //用于XT1
       P1DIR ||(LED0 + LED1);//将WFP 1.0 设置为输出方向
       P1OUT &=~(LED0 + LED1);//将WFP 1.0 设置为0 (LED熄灭)
       //禁用GPIO开机默认高阻抗模式以激活
       //以前配置的端口设置
       PM5CTL0 &=~LOCKLPM2;

       // XT1设置
       CSCTL0_H = CSKEY_H;                    //解锁CS寄存器
       CSCTL1 = DCOFSEL_0;                    //将DCO设置为1MHz
       CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
       CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;  //设置所有分隔线
       CSCTL4 &=~LFxTOFF;
       做
       {
           CSCTL5 &=~LFxTOFFG;               //清除XT1故障标志
           SFRIFG1 &=~OFIFG;
       } While (SFRIFG1 & OFIFG);             //测试振荡器故障标志
       CSCTL0_H = 0;                          //锁定CS寄存器

       //为SPI操作配置USI_B1
       UCB1CTLW0 = UCSWRST;                   //**将状态机置于复位**
       UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚,8位SPI主控
                                               //时钟极性高,MSB
       UCB1CTLW0 |= UCSSEL__ACLK;             // ACLK
       UCB1BRW = 0x02;                        ///2
       //UCB1MCTLW = 0;                         //无调制
       UCB1CTLW0 &=~UCSWRST;                 //**初始化USCI状态机**
       UCB1IE |= UCRXIE;                      //启用USI_B1 RX中断
       TXData = 0x1;                          //保存TX数据

       同时(1)
       {
           UCB1IE |= UCTXIE;
           __bis_sr_register(LPM0_bits | GIE);// CPU关闭,启用中断
    //       __delay_cycles (1000);              //下一次传输前的延迟
           对于(i=10; i>0; i--);
           TXData=0x1;                          //增量传输数据
       }
    }

    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=EUSCI_B1_vector
    __interrupt void USI_B1_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (EUSI_B1_vector)) USI_B1_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

       Switch(__偶 数_in_range(UCB1IV, USI_SPI_UCTXIFG))
       {
           案例USI_NONE:中断;
           案例USI_SPI_UCRXIFG:
               RXData = UCB1RXBUF;
               UCB1IFG &=~UCRXIFG;
               __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//唤醒以设置下一个TX
               中断;
           案例USI_SPI_UCTXIFG:
               UCB1TXBUF = TXData;                  //传输字符
               UCB1IE &=~UCTXIE;

               IF (TXData-1=RXData)
               {P1OUT ^=(LED0 + LED1);// WFP 1.0 =切换
                                  //延迟
               对于(i=10; i>0; i--);
               }

               中断;
           默认值:中断;
       }
    }

    从属代码:

    /*--版权--,BSD_EX
     *版权所有(c) 2015,Texas Instruments Incorporated
     *保留所有权利。
     *
     *以源代码和二进制形式重新分发和使用,无论是否使用
     *允许进行修改,前提是满足以下条件
     满足*:
     *
     ** 重新分发源代码必须保留上述版权
     *   注意,此条件列表和以下免责声明。
     *
     ** 以二进制形式重新分发必须复制上述版权
     *   注意,此条件列表和中的以下免责声明
     *   随分发提供的文档和/或其他材料。
     *
     ** 既不是德州仪器(TI)公司的名称,也不是的名称
     *   其贡献者可用于支持或推广衍生产品
     *   未经事先书面许可。
     *
     *本软件由版权所有者和贡献者"按原样"提供
     *和任何明示或暗示的担保,包括但不限于
     *对适销性和特定适用性的暗示担保
     *不承担目的。 在任何情况下,版权所有者或
     *贡献者对任何直接,间接,附带,特殊,
     *惩戒性或后果性损害(包括但不限于
     采购替代货物或服务;使用,数据或利润损失;
     (*或营业中断),但基于任何责任理论,
     *无论是合同,严格责任还是侵权行为(包括疏忽或
     *否则)因使用本软件而产生,
     *即使已被告知可能发生此类损害。
     *
     *****************
     *
     *                      MSP430代码示例免责声明
     *
     * MSP430代码示例是通常包含的低级程序
     *在高度中演示单个外设功能或器件功能
     *简明扼要。 为此,代码可能依赖于设备的默认开机设置
     *注册值和设置,如时钟配置和必须注意
     *在合并多个示例中的代码时使用,以避免潜在的问题
     效果。 另请参阅www.ti.com/grace以获取GUI和www.ti.com/msp430ware
     *用于API函数库方法的外围设备配置。
     *
     *--/copyright--*/
    //************************************************************************************************
    //  MSP430FR5x9x演示- eUSI_B1,SPI 3线从属数据回波
    //
    //  说明:SPI从属设备使用3线模式与SPI主中继器进行对话。 已接收数据
    //  从主中继器返回。
    //  ACLK = 32.768kHz,MCLK = SMCLK = DCO ~ 1MHz
    //  注意:确保从设备在主设备之前通电,以防止由于造成的延迟
    //  从初始化。
    //
    //
    //                  MSP430FR5994
    //-----------                 
    //           /|\|             Xin|-
    //            |||32KHz                  Crystal
    //            --|RST         XOUT|-
    //               |                |
    //               |            WFP 5.0 |<-数据输入(UCB1SIMO)
    //               |                |
    //               |            WFP 5.1 |->数据输出(UCB1SOMI)
    //               |                |
    //               |            WFP 5.2 |<-串行时钟IN (UCB1CLK)
    //
    //
    //  威廉·高
    //  德州仪器(TI)
    //  2015年10月
    //  使用IAR嵌入式工作台构建6.30 和Code Composer 6.1
    //************************************************************************************************
    #include <MSP4S.h>

    #define LED0 BIT0
    #define LED1 BIT6.

    易失性int I;
    volatile unsigned char rx;

    内部主(无效)

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

       //配置GPIO
       P5SEL1 &=~(BIT0 | BIL1 | BIIT2);       // USI_B1 SCLK,MOSI和Miso引脚
       P5SEL0 ||(BIT0 | BIT1 | BIT2);
       PJSEL0 || BIT4 | BIT5;

       //禁用GPIO开机默认高阻抗模式以激活
       //以前配置的端口设置
       PM5CTL0 &=~LOCKLPM2;

       // XT1设置
       CSCTL0_H = CSKEY_H;                    //解锁CS寄存器
       CSCTL1 = DCOFSEL_0;                    //将DCO设置为1MHz
       CSCTL1 &=~DCORSEL;
       CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
       CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;  //设置所有分隔线
       CSCTL4 &=~LFxTOFF;
       做
       {
           CSCTL5 &=~LFxTOFFG;               //清除XT1故障标志
           SFRIFG1 &=~OFIFG;
       } While (SFRIFG1 & OFIFG);             //测试振荡器故障标志
       CSCTL0_H = 0;                          //锁定CS寄存器

       //为SPI操作配置USI_B1
       UCB1CTLW0 = UCSWRST;                   //**将状态机置于复位**
       UCB1CTLW0 || UCSYNC | UCCKPL | UCMSB;  // 3引脚,8位SPI从属设备
                                               //时钟极性高,MSB
       UCB1CTLW0 |= UCSSEL__SMCLK;            // ACLK
       UCB1BRW = 0x02;                        ///2
       //UCB1MCTLW = 0;                         //无调制
       UCB1CTLW0 &=~UCSWRST;                 //**初始化USCI状态机**
       UCB1IE |= UCRXIE;                      //启用USI_B1 RX中断

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

    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=EUSCI_B1_vector
    __interrupt void USI_B1_ISR(void)
    #Elif已定义(__GMNU__)
    void __attribute__((interrupt (EUSI_B1_vector)) USI_B1_ISR (void)
    #否则
    错误编译器不受支持!
    #endif

       同时(!(UCB1IFG&UCTXIFG);            // USI_B1 TX缓冲器就绪?
       Rx = UCB1RXBUF;                 //回波接收的数据
       如果(Rx=1)
       P1OUT ^=(LED0 + LED1);// WFP 1.0 =切换
                                      //延迟
                  //用于(i=100; i>0; i--);
    }

    因此,当我调试主代码时,如果没有连接从代码,我可以发送TXData=1两次,但不会超过两次,因为它卡在__bis_sr_register (LPM0_bits | GIE);指令中(因此,LED一次切换为高,然后再返回低,然后什么也不会发生)。 与往常一样,当主中继器已连接并从外部电源运行时,从属代码不会进入中断向量。

    所以我的程序的目标是从主程序发送一个1,然后在从程序端接收它。 如果我能让这个简单的例子发挥作用,我就能在这里建立更多的东西。 为此,我正在尝试从主端反复发送TXData=1,并希望从端接收它,因此我有一条IF语句,该语句表示如果(Rx=1)切换指示灯。

    我相信现在发生的是发送和接收在主端发生。 我们输入CASE USI_SPI_UCTXIFG:当数据准备好传输时,然后输入CASE USI_SPI_UCRXIFG:将接收到的数据保存到RXData并重置中断标志。 如何在从端而不是主端进行此接收?

    谢谢!

    Madhu

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的项目已从Driverlib更改为C代码格式。 由于您是从回波代码进行采样,因此主中继器希望在继续通信之前从从属设备接收到一个确认字节(刚发送的值相同)。 因此,在将UCB1RXBUF存储到Rx之后,从属端的ISR应包括以下行:UCB1TXBUF = Rx;

    此致,
    Ryan