/* p8_1.c: Using SERCOM1 to send A to Z characters via SPI * * SERCOM1 is configured as SPI with hardware Slave Select. * Clock rate is set to 500kHz, half of the main clock. * Polarity/Phase are 0, 0 * * PA16 PAD0 MOSI * PA17 PAD1 SCK * PA18 PAD2 SS hardware controlled * PA19 PAD3 MISO * * Tested with Atmel Studio 7 v7.0.1006 and Keil MDK-ARM v5.21a. */ #include "samd21.h" unsigned char* ARRAY_PORT_PINCFG0 = (unsigned char*)®_PORT_PINCFG0; unsigned char* ARRAY_PORT_PMUX0 = (unsigned char*)®_PORT_PMUX0; int main(void) { int c; REG_PM_APBCMASK |= 0x00000008; /* SERCOM1 bus clock */ REG_GCLK_CLKCTRL = 0x4015; /* SERCOM1 core clock */ ARRAY_PORT_PINCFG0[16] |= 1; /* allow pmux to set PA16 pin configuration */ ARRAY_PORT_PINCFG0[17] |= 1; /* allow pmux to set PA17 pin configuration */ ARRAY_PORT_PINCFG0[18] |= 1; /* allow pmux to set PA18 pin configuration */ ARRAY_PORT_PINCFG0[19] |= 1; /* allow pmux to set PA19 pin configuration */ ARRAY_PORT_PMUX0[8] = 0x22; /* PA16 = MOSI, PA17 = SCK */ ARRAY_PORT_PMUX0[9] = 0x22; /* PA18 = SS, PA19 = MISO */ REG_SERCOM1_SPI_CTRLA = 1; /* reset SERCOM1 */ while (REG_SERCOM1_SPI_CTRLA & 1) {} /* wait for reset to complete */ REG_SERCOM1_SPI_CTRLA = 0x0030000C; /* MISO-3, MOSI-0, SCK-1, SS-2, SPI master */ REG_SERCOM1_SPI_CTRLB = 0x00002000; /* Master SS, 8-bit */ REG_SERCOM1_SPI_BAUD = 0; /* SPI clock is 1MHz/2 = 500kHz */ REG_SERCOM1_SPI_CTRLA |= 2; /* enable SERCOM1 */ while(1) { for (c = 'A'; c <= 'Z'; c++) { while(!(REG_SERCOM1_SPI_INTFLAG & 1)) {} /* wait until Tx ready */ REG_SERCOM1_SPI_DATA = c; /* send data byte */ } } }