bsp_bcc.c
Go to the documentation of this file.00001
00018 #include <string.h>
00019 #include "em_device.h"
00020 #include "em_cmu.h"
00021 #include "em_gpio.h"
00022
00023 #include "bsp.h"
00024
00025 #if defined( BSP_BCC_LEUART )
00026 #include "em_leuart.h"
00027 #else
00028 #include "em_usart.h"
00029 #endif
00030
00031 #if defined( BSP_STK )
00032
00035
00036 static uint32_t rxByteCount;
00037 static uint32_t txByteCount;
00038
00039
00040 static void TxByte( uint8_t data );
00041 static uint8_t RxByte( void );
00042
00045
00050
00055
00061 int BSP_BccDeInit( void )
00062 {
00063
00064 rxByteCount = 0xFFFFFFFFUL;
00065 txByteCount = 0xFFFFFFFFUL;
00066
00067 BSP_BccPinsEnable( false );
00068
00069 #if defined( BSP_BCC_LEUART )
00070
00071 LEUART_Reset( BSP_BCC_LEUART );
00072 #else
00073
00074 USART_Reset( BSP_BCC_USART );
00075 #endif
00076
00077
00078 CMU_ClockEnable( BSP_BCC_CLK, false );
00079
00080 return BSP_STATUS_OK;
00081 }
00082
00083
00089 int BSP_BccInit( void )
00090 {
00091 #if defined( BSP_BCC_LEUART )
00092 LEUART_Init_TypeDef leuartInit = LEUART_INIT_DEFAULT;
00093 #else
00094 USART_InitAsync_TypeDef usartInit = USART_INITASYNC_DEFAULT;
00095 #endif
00096
00097 rxByteCount = 0;
00098 txByteCount = 0;
00099
00100
00101 CMU_ClockEnable(cmuClock_HFPER, true);
00102
00103
00104 CMU_ClockEnable(cmuClock_GPIO, true);
00105
00106
00107 CMU_ClockEnable( BSP_BCC_CLK, true );
00108
00109 #if defined( BSP_BCC_LEUART )
00110
00111 CMU_ClockEnable(cmuClock_CORELE, true);
00112
00113
00114 CMU_ClockSelectSet( cmuClock_LFB, cmuSelect_CORELEDIV2 );
00115
00116
00117 leuartInit.baudrate = 115200;
00118 LEUART_Init( BSP_BCC_LEUART, &leuartInit );
00119 #else
00120
00121 USART_InitAsync( BSP_BCC_USART, &usartInit );
00122 #endif
00123
00124
00125 BSP_BccPinsEnable( true );
00126
00127 return BSP_STATUS_OK;
00128 }
00129
00130
00137 bool BSP_BccPacketReceive( BCP_Packet *pkt )
00138 {
00139 int i;
00140 int length;
00141 uint8_t *bptr;
00142
00143
00144 bptr = (uint8_t *) pkt;
00145
00146
00147 *bptr++ = RxByte();
00148 if (pkt->magic != BSP_BCP_MAGIC)
00149 {
00150 return false;
00151 }
00152
00153
00154 *bptr++ = RxByte();
00155 if ( (pkt->type < BSP_BCP_FIRST) || (pkt->type > BSP_BCP_LAST) )
00156 {
00157 return false;
00158 }
00159
00160
00161 *bptr++ = RxByte();
00162 if (pkt->payloadLength > BSP_BCP_PACKET_SIZE)
00163 {
00164 return false;
00165 }
00166
00167 #if ( BSP_BCP_VERSION == 2 )
00168
00169 *bptr++ = RxByte();
00170 #endif
00171
00172
00173 length = pkt->payloadLength;
00174 if (length > BSP_BCP_PACKET_SIZE)
00175 {
00176 length = BSP_BCP_PACKET_SIZE;
00177 }
00178
00179
00180 for( i=0; i<length; i++ )
00181 {
00182 *bptr++ = RxByte();
00183 }
00184
00185 return true;
00186 }
00187
00188
00195 int BSP_BccPacketSend( BCP_Packet *pkt )
00196 {
00197 int i;
00198
00199
00200 pkt->magic = BSP_BCP_MAGIC;
00201
00202
00203 TxByte( pkt->magic );
00204
00205
00206 TxByte( pkt->type );
00207
00208
00209 TxByte( pkt->payloadLength );
00210
00211 #if ( BSP_BCP_VERSION == 2 )
00212
00213 TxByte( pkt->reserved );
00214 #endif
00215
00216
00217 for ( i=0; i<pkt->payloadLength; i++ )
00218 {
00219 TxByte( pkt->data[i] );
00220 }
00221
00222 return BSP_STATUS_OK;
00223 }
00224
00225
00230 void BSP_BccPinsEnable( bool enable )
00231 {
00232 if (enable)
00233 {
00234
00235
00236 GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModePushPull, 1 );
00237
00238
00239 GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeInput, 1 );
00240
00241
00242 GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModePushPull, 1 );
00243
00244 #if defined( BSP_BCC_LEUART )
00245 BSP_BCC_LEUART->ROUTE |= LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN | BSP_BCC_LOCATION;
00246 #else
00247
00248 #if defined( USART_ROUTEPEN_TXPEN )
00249 BSP_BCC_USART->ROUTEPEN = USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN;
00250 BSP_BCC_USART->ROUTELOC0 =
00251 ( BSP_BCC_USART->ROUTELOC0 &
00252 ~( _USART_ROUTELOC0_TXLOC_MASK | _USART_ROUTELOC0_RXLOC_MASK ) )
00253 | ( BSP_BCC_TX_LOCATION << _USART_ROUTELOC0_TXLOC_SHIFT )
00254 | ( BSP_BCC_RX_LOCATION << _USART_ROUTELOC0_RXLOC_SHIFT );
00255 #else
00256 BSP_BCC_USART->ROUTE |= USART_ROUTE_RXPEN | USART_ROUTE_TXPEN | BSP_BCC_LOCATION;
00257 #endif
00258 #endif
00259 }
00260 else
00261 {
00262 GPIO_PinModeSet( BSP_BCC_ENABLE_PORT, BSP_BCC_ENABLE_PIN, gpioModeDisabled, 0 );
00263
00264 #if defined( BSP_BCC_LEUART )
00265 BSP_BCC_LEUART->ROUTE &= ~(LEUART_ROUTE_RXPEN | LEUART_ROUTE_TXPEN);
00266 #else
00267 #if defined( USART_ROUTEPEN_TXPEN )
00268 BSP_BCC_USART->ROUTEPEN &= ~(USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN);
00269 #else
00270 BSP_BCC_USART->ROUTE &= ~(USART_ROUTE_RXPEN | USART_ROUTE_TXPEN);
00271 #endif
00272 #endif
00273
00274 GPIO_PinModeSet( BSP_BCC_TXPORT, BSP_BCC_TXPIN, gpioModeDisabled, 0 );
00275
00276 GPIO_PinModeSet( BSP_BCC_RXPORT, BSP_BCC_RXPIN, gpioModeDisabled, 0 );
00277 }
00278 }
00279
00282 static uint8_t RxByte( void )
00283 {
00284 uint8_t byte;
00285
00286
00287
00288 #if defined( BSP_BCC_LEUART )
00289 while (!(BSP_BCC_LEUART->IF & LEUART_IF_RXDATAV)) ;
00290 byte = BSP_BCC_LEUART->RXDATA;
00291 #else
00292 while (!(BSP_BCC_USART->STATUS & USART_STATUS_RXDATAV)) ;
00293 byte = BSP_BCC_USART->RXDATA;
00294 #endif
00295
00296 rxByteCount++;
00297 return byte;
00298 }
00299
00300 static void TxByte( uint8_t data )
00301 {
00302
00303
00304 #if defined( BSP_BCC_LEUART )
00305 while (!(BSP_BCC_LEUART->STATUS & LEUART_STATUS_TXBL)) ;
00306 BSP_BCC_LEUART->TXDATA = (uint32_t) data;
00307 #else
00308 while (!(BSP_BCC_USART->STATUS & USART_STATUS_TXBL)) ;
00309 BSP_BCC_USART->TXDATA = (uint32_t) data;
00310 #endif
00311
00312 txByteCount++;
00313 }
00314
00320 #endif