请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430FR4133 对于一个项目,我们一直在尝试为MSP430fr4133编写一个代码,使其作为MFRC522 RFID读写器的主设备,如果ID包含在可接受的ID数组中,并且可以访问解锁,则该读写器是我们的解锁系统的从属设备 系统。 我们一直在尝试使用SPI通信来连接主设备和从设备,但我们在课堂上尚未了解到这一点,因此一直在努力解决这一问题。 我已经设法在使用eUSI_A0的不同控制器上,根据在线看到的视频编写了一些代码,并将其配置为在我的控制器上的eUSI_B0中使用SPI。 使用此代码,我能够将Miso和MOSI引脚连接在一起,并在电缆之间传输简单数据。 例如,将开关1设置为Tx缓冲区(UCB0TXBUF = 0x10),将开关2设置 为Tx缓冲区(UCB0TXBUF = 0x66)。 在接收中断(ISR_EUSCI_B0)内,我已将变量RX_DATA = UCB0RXBUF设置为,然后测试变量0x10和0x66,以便在检测到该数据时将不同的LED设置为高。 这是下面的代码
我们对如何从这一进程向前迈进感到困惑。 mfrc522数据表声称我们需要使用SDA/SS (不确定此引脚的用途),Miso,MOSI和CLK引脚来进行SPI模式。 我们不知道如何将RFID遥控器/卡ID通过RFID从属设备以字符串的形式传输给主机,因为在当前设置中,它以单字节的形式发送(我认为),但对于我们的情况,我认为我们可能需要14个字符 (我也认为是14字节,不确定我对这一点的理解是否不正确)。
在我们的另一个程序中,我们有一种方法可以比较字符串(即读取到RxBuffer中的ID数据),并将其与可能具有解锁访问权限的其他ID字符串进行比较。因此,这种方法有效。 我们的主要优先事项是从从属设备读取数据。
#include <msp430.h> int Rx_Data; int main(void) { WDTCTL = WDTPW | WDTHOLD; //stop watch-dog timer //--Setup A0 SPI UCB0CTLW0 |= UCSWRST; //Put B0 into software reset UCB0CTLW0 |= UCSSEL__SMCLK; //choose SMCLK ~= 16MHz UCB0BRW = 160; //pre-scale=10 to set SCLK=100kHz UCB0CTLW0 |= UCSYNC; //put into SPI mode UCB0CTLW0 |= UCMST; //set as a master //-- Configure Ports P1DIR |= BIT5; //Sets P1.5 to output to power MFRC522 P1OUT |= BIT5; P1DIR |= BIT0; //set P1.0 (red LED) to output P1OUT &= ~BIT0; //LED1=OFF initially P4DIR |= BIT0; //set P4.0 (green LED) to output P4OUT &= ~BIT0; //LED2=OFF initially P1DIR &= ~BIT2; //set P1.2 (SW1) to input P1REN |= BIT2; //turn on resistor P1OUT |= BIT2; //makes resistor pull-up-resistor P1IES |= BIT2; //make sensitive to high-to-low P2DIR &= ~BIT6; //set P2.6 (SW2) to input P2REN |= BIT6; //turn on resistor P2OUT |= BIT6; //makes resistor pull-up-resistor P2IES |= BIT6; //make sensitive to high-to-low //P5SEL1 &= ~ BIT1; //P5.1=SCLK (P1SEL1:P1SEL0 = 01) P5SEL0 |= BIT1; //P5SEL1 &= ~ BIT2; //P5.2=SIMO (P5SEL1:P5SEL0 = 01) P5SEL0 |= BIT2; //P5SEL1 &= ~ BIT3; //P5.3=SOMI (P5SEL1:P5SEL0 = 01) P5SEL0 |= BIT3; PM5CTL0 &= ~LOCKLPM5; //turn on i/o UCB0CTLW0 &= ~UCSWRST; //take B0 out of software reset //--Setup Interrupts P1IE |= BIT2; //enable P1.2 IRQ (SW1) P1IFG &= ~BIT2; //clear flag P2IE |= BIT6; //enable P2.6 IRQ (SW1) P2IFG &= ~BIT6; //clear flag UCB0IE |= UCRXIE; //enable SPI Rx interrupt UCB0IFG &= ~UCRXIFG; //clear flag __enable_interrupt(); //enable maskable interrupts while(1){} //do nothing return 0; } //------------------------------------------- //--Interrupts #pragma vector = PORT1_VECTOR //ISR for SW1 __interrupt void ISR_Port1_S1(void) { UCB0TXBUF = 0x10; //Tx 0x10 out over SPI P1IFG &= ~BIT2; //clear flag } #pragma vector = PORT2_VECTOR //ISR for SW2 __interrupt void ISR_Port1_S2(void) { UCB0TXBUF = 0x66; //Tx 0x66 out over SPI P2IFG &= ~BIT6; //clear flag } #pragma vector = USCI_B0_VECTOR //DATA is in B0 SPI buffer __interrupt void ISR_EUSCI_B0(void) { Rx_Data = UCB0RXBUF; //read Rx buffer if(Rx_Data == 0x10){ P1OUT^= BIT0; //Toggle LED 1 } else if(Rx_Data == 0x66){ P4OUT ^= BIT0; //Toggle LED 2 } }