Sending Data as a Host SPI Device
Full Code Example
#include<avr/io.h>voidSPI0_init(void);voidclientSelect(void);voidclientDeselect(void);
uint8_t SPI0_exchangeData(uint8_t data);voidSPI0_init(void){
PORTA.DIR |= PIN4_bm;/* Set MOSI pin direction to output */
PORTA.DIR &=~PIN5_bm;/* Set MISO pin direction to input */
PORTA.DIR |= PIN6_bm;/* Set SCK pin direction to output */
PORTA.DIR |= PIN7_bm;/* Set SS pin direction to output */
SPI0.CTRLA = SPI_CLK2X_bm /* Enable double-speed */| SPI_DORD_bm /* LSB is transmitted first */| SPI_ENABLE_bm /* Enable module */| SPI_MASTER_bm /* SPI module in Host mode */| SPI_PRESC_DIV16_gc;/* System Clock divided by 16 */}
uint8_t SPI0_exchangeData(uint8_t data){
SPI0.DATA = data;while(!(SPI0.INTFLAGS & SPI_IF_bm))/* Waits until data are exchanged*/{;}return SPI0.DATA;}voidclientSelect(void){
PORTA.OUT &=~PIN7_bm;// Set SS pin value to LOW}voidclientDeselect(void){
PORTA.OUT |= PIN7_bm;// Set SS pin value to HIGH}intmain(void){
uint8_t data =0;SPI0_init();while(1){clientSelect();SPI0_exchangeData(data);clientDeselect();}}
Receiving Data as a Client SPI
Device Full Code Example
#include<avr/io.h>#include<avr/interrupt.h>voidSPI0_init(void);volatile uint8_t receiveData =0;volatile uint8_t writeData =0;voidSPI0_init(void){
PORTA.DIR &=~PIN4_bm;/* Set MOSI pin direction to input */
PORTA.DIR |= PIN5_bm;/* Set MISO pin direction to output */
PORTA.DIR &=~PIN6_bm;/* Set SCK pin direction to input */
PORTA.DIR &=~PIN7_bm;/* Set SS pin direction to input */
SPI0.CTRLA = SPI_DORD_bm /* LSB is transmitted first */| SPI_ENABLE_bm /* Enable module */&(~SPI_MASTER_bm);/* SPI module in Client mode */
SPI0.INTCTRL = SPI_IE_bm;/* SPI Interrupt enable */}ISR(SPI0_INT_vect){
receiveData = SPI0.DATA;
SPI0.DATA = writeData;
SPI0.INTFLAGS = SPI_IF_bm;/* Clear the Interrupt flag by writing 1 */}intmain(void){SPI0_init();sei();/* Enable Global Interrupts */while(1){;}}
Changing Data Type Full Code
Example
#include<avr/io.h>voidSPI0_init(void);voidclientSelect(void);voidclientDeselect(void);
uint8_t SPI0_exchangeData(uint8_t data);voidSPI0_init(void){
PORTA.DIR |= PIN4_bm;/* Set MOSI pin direction to output */
PORTA.DIR &=~PIN5_bm;/* Set MISO pin direction to input */
PORTA.DIR |= PIN6_bm;/* Set SCK pin direction to output */
PORTA.DIR |= PIN7_bm;/* Set SS pin direction to output */
SPI0.CTRLA = SPI_CLK2X_bm /* Enable double-speed */| SPI_DORD_bm /* LSB is transmitted first */| SPI_ENABLE_bm /* Enable module */| SPI_MASTER_bm /* SPI module in Host mode */| SPI_PRESC_DIV16_gc;/* System Clock divided by 16 */
SPI0.CTRLB |= SPI_MODE_3_gc;/* Data Mode 3 */}
uint8_t SPI0_exchangeData(uint8_t data){
SPI0.DATA = data;while(!(SPI0.INTFLAGS & SPI_IF_bm))/* Waits until data are exchanged*/{;}return SPI0.DATA;}voidclientSelect(void){
PORTA.OUT &=~PIN7_bm;// Set SS pin value to LOW}voidclientDeselect(void){
PORTA.OUT |= PIN7_bm;// Set SS pin value to HIGH}intmain(void){
uint8_t data =0;SPI0_init();while(1){clientSelect();SPI0_exchangeData(data);clientDeselect();}}