Energy Micro IEC60355 Library Example Project 1.0 (internal use only!) GCC-Version
Example project demonstrating POST and BIST library functions

dvk_spi.c

Go to the documentation of this file.
00001  /***************************************************************************/
00029 #include "efm32.h"
00030 #include "iec60335_class_b.h"
00031 #include "efm32g890f128.h"
00032 #include "dvk_spi.h"
00033 
00039 #if defined (__ICCARM__)
00040 #pragma section="IEC60335_code"
00041 #else
00042 __attribute__((section(".IEC60335_code")))
00043 #endif
00044 
00047 void DVK_SPI_Com(uint8_t Addr, uint16_t Data)
00048 {
00049   uint16_t Dummy = Addr;
00050   GPIO->P[2].DOUTCLR = (1 << 5);          // CS
00051   while (!(USART2->STATUS & USART_STATUS_TXBL)) ;
00052   USART2->TXDATA = Dummy;                 // addr
00053   while (!(USART2->STATUS & USART_STATUS_RXDATAV)) ;
00054   Dummy = USART2->RXDATA;
00055   while (!(USART2->STATUS & USART_STATUS_TXBL)) ;
00056   USART2->TXDATA = (Data & 0x00FF);       // LSB
00057   while (!(USART2->STATUS & USART_STATUS_RXDATAV)) ;
00058   Dummy = USART2->RXDATA;
00059   while (!(USART2->STATUS & USART_STATUS_TXBL)) ;
00060   USART2->TXDATA = ((Data & 0xFF00)>>8);  // MSB
00061   while (!(USART2->STATUS & USART_STATUS_RXDATAV)) ;
00062   Dummy = USART2->RXDATA;
00063   GPIO->P[2].DOUTSET = (1 << 5);          // CS
00064 }
00065 
00067 #if defined (__ICCARM__)
00068 #pragma section="IEC60335_code"
00069 #else
00070 __attribute__((section(".IEC60335_code")))
00071 #endif
00072 
00078 void DVK_SPI(uint8_t mode)
00079 {
00080   if (mode == 0) {
00081     /* Enable module clocks */
00082     CMU->HFCORECLKEN0 |= (1<<0x0C)|(1<<0x02);
00083     CMU->HFPERCLKDIV |= (1<<0x08);
00084     CMU->HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO | CMU_HFPERCLKEN0_USART2 ;
00085 
00086     /* Configure SPI pins */
00087     GPIO->P[2].DOUTCLR = (1<<0x0D)|(1<<0x02)|(1<<0x03)|(1<<0x04)|(1<<0x05);
00088     GPIO->P[2].MODEH |= 0x00400000;
00089     GPIO->P[2].MODEL |= 0x00444400;
00090     /* Keep CS high to not activate slave */
00091 
00092     /* Enable pins at default location */
00093     USART2->ROUTE = 0x0B;
00094     /* Reset USART just in case */
00095     USART2->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS |
00096                   USART_CMD_RXBLOCKDIS | USART_CMD_TXTRIDIS | USART_CMD_CLEARTX | USART_CMD_CLEARRX;
00097     USART2->CTRL     = _USART_CTRL_RESETVALUE;
00098     USART2->FRAME    = _USART_FRAME_RESETVALUE;
00099     USART2->TRIGCTRL = _USART_TRIGCTRL_RESETVALUE;
00100     USART2->CLKDIV   = _USART_CLKDIV_RESETVALUE;
00101     USART2->IEN      = _USART_IEN_RESETVALUE;
00102     USART2->IFC      = _USART_IFC_MASK;
00103     USART2->IRCTRL   = _USART_IRCTRL_RESETVALUE;
00104 
00105     /* Configure to use SPI master with manual CS */
00106     /* For now, configure SPI for worst case 32MHz clock in order to work for all */
00107     /* configurations. */
00108 
00109     USART2->CMD = USART_CMD_RXDIS | USART_CMD_TXDIS | USART_CMD_MASTERDIS;
00110     USART2->CTRL &= ~(_USART_CTRL_CLKPOL_MASK |  _USART_CTRL_CLKPHA_MASK |
00111                       _USART_CTRL_MSBF_MASK | _USART_CTRL_SCMODE_MASK |
00112                       _USART_CTRL_SCRETRANS_MASK);
00113 
00114     /* Set bits for synchronous mode */
00115     USART2->CTRL |= USART_CTRL_SYNC;
00116     USART2->IRCTRL &= ~USART_IRCTRL_IREN;
00117     USART2->FRAME = USART_FRAME_DATABITS_EIGHT | USART_FRAME_STOPBITS_DEFAULT | USART_FRAME_PARITY_DEFAULT;
00118     USART2->CTRL = USART_CTRL_SYNC;
00119     USART2->CMD = USART_CMD_MASTEREN;
00120     USART2->CMD = USART_CMD_RXEN | USART_CMD_TXEN;
00121     USART2->CLKDIV = 0x200;
00122 
00123     // clear LED
00124     DVK_SPI_Com(0, 0x0006);
00125     DVK_SPI_Com(1, 0x8C00);
00126     DVK_SPI_Com(2, 0x0003);
00127     DVK_SPI_Com(3, 0x0000);
00128 
00129   }
00130   else if (mode == 1) {
00131     // set LED0
00132     DVK_SPI_Com(0, 0x0006);
00133     DVK_SPI_Com(1, 0x8C00);
00134     DVK_SPI_Com(2, 0x0003);
00135     DVK_SPI_Com(3, 0x0001);
00136   }
00137   else{
00138     // set LED0,1
00139     DVK_SPI_Com(0, 0x0006);
00140     DVK_SPI_Com(1, 0x8C00);
00141     DVK_SPI_Com(2, 0x0003);
00142     DVK_SPI_Com(3, 0x0003);
00143   }
00144 }
00148 /************************************** EOF *********************************/