1) 在 主微控制器中、如果端口2的引脚0断开连接、则 mster (MSP 430)将仅向从器件(msp432)传输(0x01)、LED 将在 msp432的端口2.0处切换。
2) 在 主微控制器中、如果端口2的引脚1断开连接、则 mster (MSP 430)将仅向从器件(msp432)传输(0x02)、LED 将在 msp432的端口1.0处切换。
程序工作正常、但我的问题是 LED 持续闪烁。我希望 LED 在引脚断开连接后仅闪烁一次(在1引脚0情况下为1引脚1、在2引脚1情况下为任何情况)
3) plz 帮助我、、、我认为我可以使用 interrupt、但不确定..您也可以帮助我提供不同的替代方案。
#include
volatile char received_ch = 0;
int main (空)
{
//P1OUT |= BIT5;
P1SEL = BIT0 | BIT2 | BIT4;
P1SEL2 = BIT0 | BIT2 | BIT4;
UCA0CTL1 = UCSWRST;
UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;// 3引脚、8位 SPI 主器件
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 |= 0x01;///2
UCA0BR1 = 0;//
UCA0MCTL = 0;//无调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
IE2 |= UCA0TXIE;//启用 USCI0 RX 中断
// P1OUT &=(~BIT5);//选择器件
_bis_SR_register (LPM0_bits + GIE);// CPU 关闭、启用中断
// P1OUT |=(BIT5);//取消选择器件
}
///----------------------------------------------------------
//测试有效的 RX 和 TX 字符
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0TX_vector
_interrupt void USCIA0TX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (USCIAB0TX_vector)) USCIA0TX_ISR (void)
其他
错误编译器不受支持!
#endif
{
while (!(IFG2 & UCA0TXIFG));// USCI_A0 TX 缓冲器准备就绪?
{
如果((0x01 & P2IN))//由于 LED1为(0x01)即(0000 0001) 8位,因为2V 电源是我们的常数
{//输入所有输入引脚都为高电平 WT 和 P2IN、因此如果输入被置位
P1OUT &=~ 0x01;
}
其他
{
UCA0TXBUF = 0x01;//通过 SPI 发送到从器件
__DELAY_CYCLES (50);//将传输之间的时间添加到
}
如果((0x02 & P2IN))//由于 LED1为(0x01)即(0000 0001) 8位,因为2V 电源是我们的常数
{//输入所有输入引脚都为高电平 WT 和 P2IN、因此如果输入被置位
P1OUT &=~ 0x01;//停止输出蜂鸣器(不执行任何操作)
}
其他
{
UCA0TXBUF = 0x02;//通过 SPI 发送到从器件
_DELAY_CYCLES (50);
}
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*********
* MSP 432从设备
* IDS 系统
*引脚连接
* MSP430g2553主器件 MSP432P401x 从器件
//------------ --------
///|\|/|\||
//||||| |
//-|RST |-|RST |
//||||
//||数据输入(UCB0SIMO)|
//| P1.0|--- |P1.6 |
//||||
//|数据输出(UCB0SOMI)|
//| P1.2|--------------- |P1.7 |
//||||
//| S 时钟(UCB0CLK)|
//| P1.4|--- |P1.5 |
//||||
//
********* 从站计划是'********* /
#include "msp.h"
volatile unsigned int RXData、w;
int main (空)
{
WDT_A->CTL = WDT_A_CTL_PW |//停止看门狗计时器
WDT_A_CTL_HOLD;
P2->DIR |= BIT0;// P2.0设置为输出
P1->SEL0 |= BIT5 | BIT6 | BIT7;//将 P1.5、P1.6和 P1.7设置为
// SPI 引脚功能
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将状态机置于复位状态
EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |//保持状态机处于复位状态
EUSCI_B_CTLW0_SYNC |//设置为同步模式
EUSCI_A_CTLW0_CKPL |//将时钟极性设置为高电平
EUSCI_B_CTLW0_MSB;// MSB 优先和从
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_ssel_ACLK;// ACLK
EUSCI_B0->BRW = 0x02;///2、fBitClock = fBRCLK/(UCBRx+1)。
EUSCI_B0->CTLW0 &=~EUSCI_B_CTLW0_SWRST;//初始化 USCI 状态机
EUSCI_B0->IE |= EUSCI_B_IE_RXIE;//启用 USCI_B0 RX 中断
//启用全局中断
__ENABLE_IRQ();
//在 NVIC 模块中启用 eUSCI_B0中断
NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);
_SLEEP();
__no_operation();
//在退出 ISR 时保持在 LPM 中
// SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;
//确保 SLEEPONEXIT 立即生效
//_ DSB();
}
///--------------------------------------------
// SPI 中断服务例程
空 EUSCIB0_IRQHandler (空)
{
//等待字符被接收
while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG));
RXData = EUSCI_B0->RXBUF;
如果(RXData=0x01)
{
P2->OUT μ^ BIT0;// XOR P1.0
对于(w = 20000;w > 0;w-);//延迟
}
如果(RXData=0x02)
{
P1->OUT μ^ BIT0;// XOR P1.0
对于(w = 20000;w > 0;w-);//延迟
}
//清除接收中断标志
EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;
NVIC->ISER[0]&&~(1 <<(((EUSCIB0_IRQn)& 31));
}
///----------------------------------------------