Guest User

Untitled

a guest
Jan 2nd, 2017
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.84 KB | None | 0 0
  1.  
  2. void spi_init(void) {
  3.     /* Wait for synchronization */
  4.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
  5.    
  6.     /* Disable the SERCOM SPI module */
  7.     BOOT_SPI_MODULE->SPI.CTRLA.bit.ENABLE = 0;
  8.    
  9.     /* Wait for synchronization */
  10.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.SWRST);
  11.    
  12.     /* Perform a software reset */
  13.     BOOT_SPI_MODULE->SPI.CTRLA.bit.SWRST = 1;
  14.    
  15.     /* Wait for synchronization */
  16.     while(BOOT_SPI_MODULE->SPI.CTRLA.bit.SWRST);
  17.    
  18.     /* Wait for synchronization */
  19.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.SWRST || BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
  20.    
  21.    
  22.     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;
  23.    
  24.    
  25.     // mux the pins
  26.     // we use PMUXE for the PMUXO pins as the .bit.PMUXO already gives us the offset
  27.     #if BOARD_MOSI_PIN % 2
  28.     PORT->Group[BOARD_MOSI_PORT].PMUX[BOARD_MOSI_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
  29.     #else
  30.     PORT->Group[BOARD_MOSI_PORT].PMUX[BOARD_MOSI_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
  31.     #endif
  32.     #if BOARD_MISO_PORT % 2
  33.     PORT->Group[BOARD_MISO_PORT].PMUX[BOARD_MISO_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
  34.     #else
  35.     PORT->Group[BOARD_MISO_PORT].PMUX[BOARD_MISO_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
  36.     #endif
  37.     #if BOARD_SCK_PIN % 2
  38.     PORT->Group[BOARD_SCK_PORT].PMUX[BOARD_SCK_PIN / 2].bit.PMUXO = PORT_PMUX_PMUXE_D;
  39.     #else
  40.     PORT->Group[BOARD_SCK_PORT].PMUX[BOARD_SCK_PIN / 2].bit.PMUXE = PORT_PMUX_PMUXE_D;
  41.     #endif
  42.    
  43.     PORT->Group[BOARD_MOSI_PORT].PINCFG[BOARD_MOSI_PIN].bit.PMUXEN = 1;
  44.     PORT->Group[BOARD_MISO_PORT].PINCFG[BOARD_MISO_PIN].bit.PMUXEN = 1;
  45.     PORT->Group[BOARD_SCK_PORT].PINCFG[BOARD_SCK_PIN].bit.PMUXEN = 1;
  46.    
  47.     /* Enable transmit and receive and set data size to 8 bits */
  48.     BOOT_SPI_MODULE->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_RXEN | SERCOM_SPI_CTRLB_CHSIZE(0);
  49.    
  50.    
  51.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.CTRLB);
  52.    
  53.     /* Load the baud value */
  54.     GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_CLKEN | BOARD_GCLK_ID;
  55.     while(GCLK->STATUS.bit.SYNCBUSY); //Wait for synchronisation
  56.     BOOT_SPI_MODULE->SPI.BAUD.reg = SERCOM_SPI_BAUD_BAUD(60);
  57.    
  58.     /* Wait for synchronization */
  59.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
  60.     /* Enable SERCOM UART */
  61.     BOOT_SPI_MODULE->SPI.CTRLA.bit.ENABLE = 1;
  62.    
  63.     while(BOOT_SPI_MODULE->SPI.SYNCBUSY.bit.ENABLE);
  64. }
  65.  
  66. void spi_transfer(uint8_t* send_buff, unsigned int bc, uint8_t* receive_buff) {
  67.     do {
  68.         while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.DRE);
  69.         if (send_buff == NULL) {
  70.             BOOT_SPI_MODULE->SPI.DATA.reg = 0xFF;
  71.         } else {
  72.             BOOT_SPI_MODULE->SPI.DATA.reg = *send_buff++;
  73.         }
  74.        
  75.         while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.TXC);
  76.         while(!BOOT_SPI_MODULE->SPI.INTFLAG.bit.RXC);
  77.        
  78.         uint8_t b = BOOT_SPI_MODULE->SPI.DATA.reg;
  79.         if ( receive_buff != NULL ) {
  80.             *receive_buff++ = b;
  81.         }
  82.     } while (--bc);
  83. }
Add Comment
Please, Sign In to add comment