MSP430 LaunchPad SPI Example

Das folgende Programm verschickt auf Tasterdruck (S2) ein byte (0x22) per SPI.

[c]
// P1.5 = SCLK
// P1.6 = DOUT
// P1.7 = DIN

#include

void main(void)
{

WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

// Port 1.3: Switch Input
P1DIR &= ~BIT3; // P1.3 = input
P1REN |= BIT3; // Pullup/down resistor enabled
P1OUT |= BIT3; // Pin is pulled enabled
P1IE |= BIT3; // Enable interrupts from switch
P1IES |= BIT3; // rising edge

// Setup USI -> SPI Master
USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master
USICTL1 |= USIIE; // Counter interrupt, flag remains set
USICTL1 |= USICKPH; // Data is captured on the first SCLK edge and changed on the following edge
USICKCTL = USIDIV_4 + USISSEL_2; // /16 SMCLK
USICTL1 &= ~USIIFG; // reset IRQ flag
USICTL0 &= ~USISWRST; // USI released for operation

_BIS_SR(GIE);
while(1);
}

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
USICTL1 &= ~USIIFG; // reset IRQ flag
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1IE &= ~BIT3; // Disable interrupts from switch

USISRL = 0x22; // write data to send into fifo
USICNT = 8; // reload counter

P1IFG &= ~BIT3; // clear Interrupt Flag
P1IE |= BIT3; // Enable interrupts from switch
}
[/c]

Mit dem folgenden Programm können die Daten auf einem zweiten LaunchPad empfangen werden:

[c]
#include

void main(void)
{
int received_data[1];
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

// Setup USI -> SPI Slave
USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE; // Port setup
USICNT &= ~USI16B; // only 8 bit mode
USICTL0 &= ~USIMST; // SPI slave
USICTL1 |= USIIE; // Counter interrupt, flag remains set
USICTL1 |= USICKPH; // Data is captured on the first SCLK edge and changed on the following edge
USICKCTL = USIDIV_4 + USISSEL_2; // /16 SMCLK
USICTL1 &= ~USIIFG; // reset IRQ flag
USICTL0 &= ~USISWRST; // USI released for operation
received_data[0] = USISRH;
received_data[0] = USISRL; // Empty USISRL
//USISRL = 0x22;
USICNT = 7; // init-load counter

_BIS_SR(GIE);
while(1);

}

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
int received_data[1];
received_data[0] = USISRH;
received_data[0] = USISRL;

USICNT = 7;
USICTL1 &= ~USIIFG; // reset IRQ flag
}
[/c]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert