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]