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:MSP430FR4133 SPI与MFRC522/RFID RC522模块通信

Guru**** 655270 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/1090207/msp430fr4133-msp430fr4133-spi-communication-with-mfrc522-rfid-rc522-module

部件号: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
            }
        }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kieran,

    TIREX (TI资源管理器)中有一个MSP430FR4133 SPI主控制器的示例代码,将很有帮助。

    SS是“从选择”引脚,并在MSP430从器件发送/接收数据期间启用器件。  在示例中,这将是Slave Chip Select (从芯片选择)。

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

    您好,Kieran,

    距离我听到您的消息已有几天,所以我假设您的问题已得到回答。
    我会将此帖子标记为已解决。 如果不是这种情况,请单击"这不能解决我的问题"按钮,并回复此主题以了解更多信息。
    如果此线程锁定,请单击"提出相关问题"按钮,在新线程中描述您的问题的当前状态以及您可能需要帮助我们解决您的问题的任何其他详细信息。