ezradio_hal.c

Go to the documentation of this file.
00001 /**************************************************************************/
00033 #include <stdlib.h>
00034 #include <stdint.h>
00035 #include "ezradiodrv_config.h"
00036 
00037 #include "em_gpio.h"
00038 
00039 #if (defined EZRADIODRV_USE_SPIDRV)
00040 #include "spidrv.h"
00041 #else //EZRADIO_USE_SPIDRV
00042 #include "em_cmu.h"
00043 #include "em_usart.h"
00044 #endif //EZRADIO_USE_SPIDRV
00045 
00046 #include "gpiointerrupt.h"
00047 #include "ezradio_hal.h"
00048 
00049 #if (defined EZRADIODRV_USE_SPIDRV)
00050 SPIDRV_HandleData_t  ezradioSpiHandle;
00051 SPIDRV_Handle_t      ezradioSpiHandlePtr = &ezradioSpiHandle;
00052 SPIDRV_Init_t        ezradioSpiInitData = SPIDRV_MASTER_USART1;
00053 #endif //EZRADIO_USE_SPIDRV
00054 
00060 void ezradio_hal_GpioInit( GPIOINT_IrqCallbackPtr_t ezradioIrqCallback )
00061 {
00062 
00063 #if !(defined EZRADIODRV_USE_SPIDRV)
00064    /* Ensure gpio clock is set up */
00065    CMU_ClockEnable( cmuClock_GPIO, true );
00066 
00067    /* Setup pins used for SPI communication to radio */
00068    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_USARTRF_MOSI_PORT, RF_USARTRF_MOSI_PIN, gpioModePushPull, 0 );
00069    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_USARTRF_MISO_PORT, RF_USARTRF_MISO_PIN, gpioModeInput,    0 );
00070    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_USARTRF_CLK_PORT,  RF_USARTRF_CLK_PIN,  gpioModePushPull, 0 );
00071 #endif // !EZRADIO_USE_SPIDRV
00072 
00073    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_USARTRF_CS_PORT,   RF_USARTRF_CS_PIN,   gpioModePushPull, 1 );
00074 
00075    /* Setup enable and interrupt pins to radio */
00076    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_SDN_PORT,  RF_SDN_PIN,   gpioModePushPull, 0 );
00077    GPIO_PinModeSet( (GPIO_Port_TypeDef) RF_INT_PORT, RF_INT_PIN, gpioModeInputPull, 1 );
00078 
00079    if (NULL != ezradioIrqCallback)
00080    {
00081        /* Register callback and enable interrupt */
00082        GPIOINT_CallbackRegister( RF_INT_PIN, ezradioIrqCallback );
00083        GPIO_IntConfig( (GPIO_Port_TypeDef) RF_INT_PORT, RF_INT_PIN, false, true, true );
00084    }
00085 
00086    return;
00087 }
00088 
00089 void ezradio_hal_SpiInit( void )
00090 {
00091 
00092 #if !(defined EZRADIODRV_USE_SPIDRV)
00093    USART_InitSync_TypeDef init = USART_INITSYNC_DEFAULT;
00094 
00095 
00096    /* Enable USART clock */
00097    CMU_ClockEnable( cmuClock_USARTRF0, true );
00098 
00099    init.baudrate     = 1000000;
00100    init.databits     = usartDatabits8;
00101    init.msbf         = 1;
00102    init.master       = 1;
00103    init.clockMode    = usartClockMode0;
00104    init.prsRxEnable  = 0;
00105    init.autoTx       = 0;
00106 
00107    USART_InitSync(USARTRF0, &init);
00108 
00109    /* Enable output pins and set location */
00110    USARTRF0->ROUTE = USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_CLKPEN;
00111 
00112    ezradio_hal_SetNsel();
00113 #else // !EZRADIO_USE_SPIDRV
00114    ezradioSpiInitData.port         = USARTRF0;
00115    ezradioSpiInitData.portLocation = RF_USARTRF_CLK_PORT;
00116    ezradioSpiInitData.csControl    = spidrvCsControlApplication;
00117    SPIDRV_Init( ezradioSpiHandlePtr, &ezradioSpiInitData );
00118 
00119 #endif // !EZRADIO_USE_SPIDRV
00120 
00121    return;
00122 }
00123 
00127 void ezradio_hal_AssertShutdown(void)
00128 {
00129   GPIO_PinOutSet( (GPIO_Port_TypeDef) RF_SDN_PORT, RF_SDN_PIN);
00130 }
00131 
00135 void ezradio_hal_DeassertShutdown(void)
00136 {
00137   GPIO_PinOutClear( (GPIO_Port_TypeDef) RF_SDN_PORT, RF_SDN_PIN);
00138 }
00139 
00143 void ezradio_hal_ClearNsel(void)
00144 {
00145   GPIO_PinOutClear( (GPIO_Port_TypeDef) RF_USARTRF_CS_PORT, RF_USARTRF_CS_PIN);
00146 }
00147 
00151 void ezradio_hal_SetNsel(void)
00152 {
00153   GPIO_PinOutSet( (GPIO_Port_TypeDef) RF_USARTRF_CS_PORT, RF_USARTRF_CS_PIN);
00154 }
00155 
00161 uint8_t ezradio_hal_NirqLevel(void)
00162 {
00163   return GPIO_PinInGet( (GPIO_Port_TypeDef) RF_INT_PORT, RF_INT_PIN);
00164 }
00165 
00171 void ezradio_hal_SpiWriteByte(uint8_t byteToWrite)
00172 {
00173 #if (defined EZRADIODRV_USE_SPIDRV)
00174   SPIDRV_MTransmitB(ezradioSpiHandlePtr, &byteToWrite, 1);
00175 #else //EZRADIO_USE_SPIDRV
00176   USART_SpiTransfer(USARTRF0, byteToWrite);
00177 #endif //EZRADIO_USE_SPIDRV
00178 }
00179 
00185 void ezradio_hal_SpiReadByte(uint8_t* readByte)
00186 {
00187 
00188 #if (defined EZRADIODRV_USE_SPIDRV)
00189   SPIDRV_MReceiveB(ezradioSpiHandlePtr, readByte, 1);
00190 #else  //EZRADIO_USE_SPIDRV
00191   *readByte = USART_SpiTransfer(USARTRF0, 0xFF);
00192 #endif //EZRADIO_USE_SPIDRV
00193 }
00194 
00201 void ezradio_hal_SpiWriteData(uint8_t byteCount, uint8_t* pData)
00202 {
00203 
00204 #if (defined EZRADIODRV_USE_SPIDRV)
00205   SPIDRV_MTransmitB(ezradioSpiHandlePtr, pData, byteCount);
00206 #else //EZRADIO_USE_SPIDRV
00207   for (; byteCount; byteCount--)
00208   {
00209     USART_SpiTransfer(USARTRF0, *pData);
00210     pData++;
00211   }
00212 #endif //EZRADIO_USE_SPIDRV
00213 }
00214 
00221 void ezradio_hal_SpiReadData(uint8_t byteCount, uint8_t* pData)
00222 {
00223 
00224 #if (defined EZRADIODRV_USE_SPIDRV)
00225   SPIDRV_MReceiveB(ezradioSpiHandlePtr, pData, byteCount);
00226 #else //EZRADIO_USE_SPIDRV
00227   for (; byteCount; byteCount--)
00228   {
00229     *pData = USART_SpiTransfer(USARTRF0, 0xFF);
00230     pData++;
00231   }
00232 #endif //EZRADIO_USE_SPIDRV
00233 
00234 }