主题中讨论的其他部件:MSP430FR5969, MSP430WARE
工具/软件: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,¶m);
//选择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,¶m);
//选择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