由於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, ¶m);
//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);