MSP430FR2433 用driverlib方式 SPI调试记录

由于MSP430FR2433红板子搞活动,弄了几块玩玩,发现网上很多MSP430系列的SPI很多都使用普通的GPIO模拟SPI,很少有说如何使用driverlib来操作GPIO的,MSP430本身就支持SPI,为何费劲要用GPIO模拟呢?

  • MSP430系列TI提供了driverlib方便用户进行开发,driverlib是对标准的寄存器操作进行了二次封装,用户只需要调用API就可以了,非常方便。
  • 这里有一个迷惑的地方,就是primary function和secondary以及ternary这三个功能对应的芯片GPIO是怎么对应的,刚开始很困惑,其实非常简单,由于MSP430是兼容了UART和SPI,但是同一个引脚同一时刻只有一个功能工作,如果工作在SPI模式,那么UART就无效了,反之亦然,看一下TRM手册就明白了。

直接上SPI初始化代码

    // Configure SPI Pins for UCA0CLK, UCA0TXD/UCA0SIMO and UCA0RXD/UCA0SOMI
    /*
    * Select Port 1
    * Set Pin 4, Pin 5 and Pin 6 to input Primary Module Function
    */
    GPIO_setAsPeripheralModuleFunctionInputPin(
    	GPIO_PORT_P1,
    	GPIO_PIN4+GPIO_PIN5+GPIO_PIN6,
    	GPIO_PRIMARY_MODULE_FUNCTION
    );    
    
    GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN1);
    GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN1);
    
    GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN7);
    GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN7);    

    /*
     * Disable the GPIO power-on default high-impedance mode to activate
     * previously configured port settings
     */
    PMM_unlockLPM5();

    //Initialize Master
    EUSCI_A_SPI_initMasterParam param = {0};
    param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
    param.clockSourceFrequency = CS_getSMCLK();
    param.desiredSpiClock = 500000;
    param.msbFirst = EUSCI_A_SPI_MSB_FIRST;
    param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
    param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH;
    param.spiMode = EUSCI_A_SPI_3PIN;
    EUSCI_A_SPI_initMaster(EUSCI_A0_BASE, &param);

    //Enable SPI module
    EUSCI_A_SPI_enable(EUSCI_A0_BASE);

    //Clear receive interrupt flag
    EUSCI_A_SPI_clearInterrupt(EUSCI_A0_BASE,
          EUSCI_A_SPI_RECEIVE_INTERRUPT
          );

    // Enable USCI_A0 RX interrupt
    EUSCI_A_SPI_enableInterrupt(EUSCI_A0_BASE,
                         EUSCI_A_SPI_RECEIVE_INTERRUPT);

你可能感兴趣的:(嵌入式软件,嵌入式硬件)