You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.9 KiB
88 lines
1.9 KiB
#include "main.h"
|
|
#include "spi.h"
|
|
|
|
/* Initialize and enable the SPI module */
|
|
void spi_initialize()
|
|
{
|
|
P3SEL = 0x00E; // Setup P3 for SPI mode
|
|
P3OUT |= 0x010; // Setup P3.4 as the SS signal, active low. So, initialize it high.
|
|
P3DIR |= 0x010; // Set up P3.4 as an output
|
|
|
|
U0CTL = (CHAR | SYNC | MM | SWRST); // 8-bit, SPI, Master
|
|
U0TCTL = (SSEL1 | STC | CKPH); // Normal polarity, 3-wire
|
|
U0BR0 = 0x002; // SPICLK = SMCLK/2 (2=Minimum divisor)
|
|
U0BR1 = 0x000;
|
|
U0MCTL = 0x000;
|
|
ME1 |= USPIE0; // Module enable
|
|
U0CTL &= ~SWRST; // SPI enable
|
|
}
|
|
|
|
/* Set the baud-rate divisor. The correct value is computed by dividing
|
|
the clock rate by the desired baud rate. The minimum divisor allowed
|
|
is 2. */
|
|
|
|
void spi_set_divisor(unsigned int divisor)
|
|
{
|
|
U0CTL |= SWRST; // Temporarily disable the SPI module
|
|
U0BR1 = divisor >> 8;
|
|
U0BR0 = divisor;
|
|
U0CTL &= ~SWRST; // Re-enable SPI
|
|
}
|
|
|
|
/* Assert the CS signal, active low (CS=0) */
|
|
void spi_cs_assert()
|
|
{
|
|
// Pin 3.4, Pin 32
|
|
P3OUT &= ~0x010;
|
|
}
|
|
|
|
/* Deassert the CS signal (CS=1) */
|
|
void spi_cs_deassert()
|
|
{
|
|
// Pin 3.4, Pin 32
|
|
P3OUT |= 0x010;
|
|
}
|
|
|
|
|
|
/* Send a single byte over the SPI port */
|
|
void spi_send_byte(uint8_t input)
|
|
{
|
|
IFG1 &= ~URXIFG0;
|
|
/* Send the byte */
|
|
TXBUF0 = input;
|
|
/* Wait for the byte to be sent */
|
|
while ((IFG1 & URXIFG0) == 0) { }
|
|
}
|
|
|
|
|
|
/* Receive a byte. Output an 0xFF (the bus idles high) to receive the byte */
|
|
uint8_t spi_rcv_byte()
|
|
{
|
|
uint8_t tmp;
|
|
IFG1 &= ~URXIFG0;
|
|
/* Send the byte */
|
|
TXBUF0 = 0xFF;
|
|
/* Wait for the byte to be received */
|
|
while ((IFG1 & URXIFG0) == 0) { }
|
|
tmp = U0RXBUF;
|
|
return (tmp);
|
|
}
|
|
|
|
|
|
/* Disable the SPI module. This function assumes the module had
|
|
* already been initialized. */
|
|
void spi_disable()
|
|
{
|
|
/* Put the SPI module in reset mode */
|
|
U0CTL |= SWRST;
|
|
/* Disable the USART module */
|
|
ME1 &= ~USPIE0;
|
|
}
|
|
|
|
void spi_enable()
|
|
{
|
|
/* Enable the USART module */
|
|
ME1 |= USPIE0;
|
|
/* Take the SPI module out of reset mode */
|
|
U0CTL &= ~SWRST;
|
|
}
|
|
|