Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void spi_init(void) {
- /* Wait for synchronization */
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
- /* Disable the SERCOM SPI module */
- BOOT_SPI_MODULE->SPI.CTRLA.bit.ENABLE = 0;
- /* Wait for synchronization */
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.SWRST);
- /* Perform a software reset */
- BOOT_SPI_MODULE->SPI.CTRLA.bit.SWRST = 1;
- /* Wait for synchronization */
- while(BOOT_SPI_MODULE->SPI.CTRLA.bit.SWRST);
- /* Wait for synchronization */
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.SWRST || BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
- BOOT_SPI_MODULE->SPI.CTRLA.reg = SERCOM_SPI_CTRLA_MODE_SPI_MASTER | SERCOM_SPI_CTRLA_DIPO(BOARD_SERCOM_DIPO_PORT) | SERCOM_SPI_CTRLA_DOPO(BOARD_SERCOM_DOPO_PORT) | SERCOM_SPI_CTRLA_DORD;
- // mux the pins
- // we use PMUXE for the PMUXO pins as the .bit.PMUXO already gives us the offset
- #if BOARD_MOSI_PIN % 2
- PORT->Group[BOARD_MOSI_PORT].PMUX[BOARD_MOSI_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
- #else
- PORT->Group[BOARD_MOSI_PORT].PMUX[BOARD_MOSI_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
- #endif
- #if BOARD_MISO_PORT % 2
- PORT->Group[BOARD_MISO_PORT].PMUX[BOARD_MISO_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
- #else
- PORT->Group[BOARD_MISO_PORT].PMUX[BOARD_MISO_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
- #endif
- #if BOARD_SCK_PIN % 2
- PORT->Group[BOARD_SCK_PORT].PMUX[BOARD_SCK_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
- #else
- PORT->Group[BOARD_SCK_PORT].PMUX[BOARD_SCK_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
- #endif
- PORT->Group[BOARD_MOSI_PORT].PINCFG[BOARD_MOSI_PIN].bit.PMUXEN = 1;
- PORT->Group[BOARD_MISO_PORT].PINCFG[BOARD_MISO_PIN].bit.PMUXEN = 1;
- PORT->Group[BOARD_SCK_PORT].PINCFG[BOARD_SCK_PIN].bit.PMUXEN = 1;
- /* Enable transmit and receive and set data size to 8 bits */
- BOOT_SPI_MODULE->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_RXEN | SERCOM_SPI_CTRLB_CHSIZE(0);
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.CTRLB);
- /* Load the baud value */
- GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_CLKEN | BOARD_GCLK_ID;
- while(GCLK->STATUS.bit.SYNCBUSY); //Wait for synchronisation
- BOOT_SPI_MODULE->SPI.BAUD.reg = SERCOM_SPI_BAUD_BAUD(60);
- /* Wait for synchronization */
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
- /* Enable SERCOM UART */
- BOOT_SPI_MODULE->SPI.CTRLA.bit.ENABLE = 1;
- while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
- }
- void spi_transfer(uint8_t* send_buff, unsigned int bc, uint8_t* receive_buff) {
- do {
- while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.DRE);
- if (send_buff == NULL) {
- BOOT_SPI_MODULE->SPI.DATA.reg = 0xFF;
- } else {
- BOOT_SPI_MODULE->SPI.DATA.reg = *send_buff++;
- }
- while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.TXC);
- while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.RXC);
- uint8_t b = BOOT_SPI_MODULE->SPI.DATA.reg;
- if ( receive_buff != NULL ) {
- *receive_buff++ = b;
- }
- } while (--bc);
- }
Add Comment
Please, Sign In to add comment