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
00065 CMU_ClockEnable( cmuClock_GPIO, true );
00066
00067
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
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
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
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
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 }