![]() |
Energy Micro IEC60355 Library Example Project 1.0 (internal use only!) GCC-Version
Example project demonstrating POST and BIST library functions
|
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 *********************************/