Some old AVR projects
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

#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;
}