00001
00016 #ifndef __SILICON_LABS_SPIDRV_H__
00017 #define __SILICON_LABS_SPIDRV_H__
00018
00019 #include "em_device.h"
00020 #include "em_cmu.h"
00021 #include "em_dma.h"
00022 #include "ecode.h"
00023 #include "spidrv_config.h"
00024 #if defined( EMDRV_SPIDRV_INCLUDE_SLAVE )
00025 #include "rtcdrv.h"
00026 #endif
00027
00028 #ifdef __cplusplus
00029 extern "C" {
00030 #endif
00031
00032
00037
00045 #define ECODE_EMDRV_SPIDRV_OK ( ECODE_OK ) ///< Success return value.
00046 #define ECODE_EMDRV_SPIDRV_ILLEGAL_HANDLE ( ECODE_EMDRV_SPIDRV_BASE | 0x00000001 ) ///< Illegal SPI handle.
00047 #define ECODE_EMDRV_SPIDRV_PARAM_ERROR ( ECODE_EMDRV_SPIDRV_BASE | 0x00000002 ) ///< Illegal input parameter.
00048 #define ECODE_EMDRV_SPIDRV_BUSY ( ECODE_EMDRV_SPIDRV_BASE | 0x00000003 ) ///< The SPI port is busy.
00049 #define ECODE_EMDRV_SPIDRV_ILLEGAL_OPERATION ( ECODE_EMDRV_SPIDRV_BASE | 0x00000004 ) ///< Illegal operation on SPI port.
00050 #define ECODE_EMDRV_SPIDRV_TIMER_ALLOC_ERROR ( ECODE_EMDRV_SPIDRV_BASE | 0x00000005 ) ///< Unable to allocated timeout timer.
00051 #define ECODE_EMDRV_SPIDRV_TIMEOUT ( ECODE_EMDRV_SPIDRV_BASE | 0x00000006 ) ///< SPI transfer timeout.
00052 #define ECODE_EMDRV_SPIDRV_IDLE ( ECODE_EMDRV_SPIDRV_BASE | 0x00000007 ) ///< No SPI transfer in progress.
00053 #define ECODE_EMDRV_SPIDRV_ABORTED ( ECODE_EMDRV_SPIDRV_BASE | 0x00000008 ) ///< SPI transfer has been aborted.
00054 #define ECODE_EMDRV_SPIDRV_MODE_ERROR ( ECODE_EMDRV_SPIDRV_BASE | 0x00000009 ) ///< SPI master used slave API or vica versa.
00055
00057 typedef enum SPIDRV_Type
00058 {
00059 spidrvMaster = 0,
00060 spidrvSlave = 1
00061 } SPIDRV_Type_t;
00062
00064 typedef enum SPIDRV_BitOrder
00065 {
00066 spidrvBitOrderLsbFirst = 0,
00067 spidrvBitOrderMsbFirst = 1
00068 } SPIDRV_BitOrder_t;
00069
00071 typedef enum SPIDRV_ClockMode
00072 {
00073 spidrvClockMode0 = 0,
00074 spidrvClockMode1 = 1,
00075 spidrvClockMode2 = 2,
00076 spidrvClockMode3 = 3
00077 } SPIDRV_ClockMode_t;
00078
00080 typedef enum SPIDRV_CsControl
00081 {
00082 spidrvCsControlAuto = 0,
00083 spidrvCsControlApplication = 1
00084 } SPIDRV_CsControl_t;
00085
00087 typedef enum SPIDRV_SlaveStart
00088 {
00089 spidrvSlaveStartImmediate = 0,
00090 spidrvSlaveStartDelayed = 1
00091 } SPIDRV_SlaveStart_t;
00092
00093 struct SPIDRV_HandleData;
00094
00095
00116 typedef void (*SPIDRV_Callback_t)( struct SPIDRV_HandleData *handle,
00117 Ecode_t transferStatus,
00118 int itemsTransferred );
00119
00125 typedef struct SPIDRV_Init
00126 {
00127 USART_TypeDef *port;
00128 unsigned int txDMACh;
00129 unsigned int rxDMACh;
00130 uint32_t portLocation;
00131 uint32_t bitRate;
00132 uint32_t frameLength;
00133 uint32_t dummyTxValue;
00134 SPIDRV_Type_t type;
00135 SPIDRV_BitOrder_t bitOrder;
00136 SPIDRV_ClockMode_t clockMode;
00137 SPIDRV_CsControl_t csControl;
00138 SPIDRV_SlaveStart_t slaveStartMode;
00139 } SPIDRV_Init_t;
00140
00145 typedef struct SPIDRV_HandleData
00146 {
00148 SPIDRV_Init_t initData;
00149 DMA_CB_TypeDef rxDmaCbData;
00150 SPIDRV_Callback_t userCallback;
00151 uint32_t dummyRx;
00152 int transferCount;
00153 int remaining;
00154 int csPort;
00155 int csPin;
00156 Ecode_t transferStatus;
00157 volatile enum { spidrvStateIdle = 0, spidrvStateTransferring = 1 } state;
00158 CMU_Clock_TypeDef usartClock;
00159 volatile bool blockingCompleted;
00160
00161 #if defined( EMDRV_SPIDRV_INCLUDE_SLAVE )
00162 RTCDRV_TimerID_t timer;
00163 #endif
00164
00165 } SPIDRV_HandleData_t;
00166
00168 typedef SPIDRV_HandleData_t * SPIDRV_Handle_t;
00169
00171 #define SPIDRV_MASTER_USART0 \
00172 { \
00173 USART0, \
00174 0, \
00175 1, \
00176 _USART_ROUTE_LOCATION_LOC1, \
00177 1000000, \
00178 8, \
00179 0, \
00180 spidrvMaster, \
00181 spidrvBitOrderMsbFirst, \
00182 spidrvClockMode0, \
00183 spidrvCsControlAuto, \
00184 spidrvSlaveStartImmediate \
00185 }
00186
00188 #define SPIDRV_MASTER_USART1 \
00189 { \
00190 USART1, \
00191 2, \
00192 3, \
00193 _USART_ROUTE_LOCATION_LOC1, \
00194 1000000, \
00195 8, \
00196 0, \
00197 spidrvMaster, \
00198 spidrvBitOrderMsbFirst, \
00199 spidrvClockMode0, \
00200 spidrvCsControlAuto, \
00201 spidrvSlaveStartImmediate \
00202 }
00203
00205 #define SPIDRV_MASTER_USART2 \
00206 { \
00207 USART2, \
00208 4, \
00209 5, \
00210 _USART_ROUTE_LOCATION_LOC0, \
00211 1000000, \
00212 8, \
00213 0, \
00214 spidrvMaster, \
00215 spidrvBitOrderMsbFirst, \
00216 spidrvClockMode0, \
00217 spidrvCsControlAuto, \
00218 spidrvSlaveStartImmediate \
00219 }
00220
00222 #define SPIDRV_SLAVE_USART0 \
00223 { \
00224 USART0, \
00225 0, \
00226 1, \
00227 _USART_ROUTE_LOCATION_LOC1, \
00228 0, \
00229 8, \
00230 0, \
00231 spidrvSlave, \
00232 spidrvBitOrderMsbFirst, \
00233 spidrvClockMode0, \
00234 spidrvCsControlAuto, \
00235 spidrvSlaveStartImmediate \
00236 }
00237
00239 #define SPIDRV_SLAVE_USART1 \
00240 { \
00241 USART1, \
00242 2, \
00243 3, \
00244 _USART_ROUTE_LOCATION_LOC1, \
00245 0, \
00246 8, \
00247 0, \
00248 spidrvSlave, \
00249 spidrvBitOrderMsbFirst, \
00250 spidrvClockMode0, \
00251 spidrvCsControlAuto, \
00252 spidrvSlaveStartImmediate \
00253 }
00254
00256 #define SPIDRV_SLAVE_USART2 \
00257 { \
00258 USART2, \
00259 4, \
00260 5, \
00261 _USART_ROUTE_LOCATION_LOC0, \
00262 0, \
00263 8, \
00264 0, \
00265 spidrvSlave, \
00266 spidrvBitOrderMsbFirst, \
00267 spidrvClockMode0, \
00268 spidrvCsControlAuto, \
00269 spidrvSlaveStartImmediate \
00270 }
00271
00272 Ecode_t SPIDRV_AbortTransfer( SPIDRV_Handle_t handle );
00273
00274 Ecode_t SPIDRV_DeInit( SPIDRV_Handle_t handle );
00275
00276 Ecode_t SPIDRV_GetBitrate( SPIDRV_Handle_t handle,
00277 uint32_t *bitRate );
00278
00279 Ecode_t SPIDRV_GetFramelength( SPIDRV_Handle_t handle,
00280 uint32_t *frameLength );
00281
00282 Ecode_t SPIDRV_GetTransferStatus( SPIDRV_Handle_t handle,
00283 int *itemsTransferred,
00284 int *itemsRemaining );
00285
00286 Ecode_t SPIDRV_Init( SPIDRV_Handle_t handle,
00287 SPIDRV_Init_t *initData );
00288
00289 Ecode_t SPIDRV_MReceive( SPIDRV_Handle_t handle,
00290 void *buffer,
00291 int count,
00292 SPIDRV_Callback_t callback );
00293
00294 Ecode_t SPIDRV_MReceiveB( SPIDRV_Handle_t handle,
00295 void *buffer,
00296 int count );
00297
00298 Ecode_t SPIDRV_MTransfer( SPIDRV_Handle_t handle,
00299 const void *txBuffer,
00300 void *rxBuffer,
00301 int count,
00302 SPIDRV_Callback_t callback );
00303
00304 Ecode_t SPIDRV_MTransferB( SPIDRV_Handle_t handle,
00305 const void *txBuffer,
00306 void *rxBuffer,
00307 int count );
00308
00309 Ecode_t SPIDRV_MTransferSingleItemB( SPIDRV_Handle_t handle,
00310 uint32_t txValue,
00311 void *rxValue );
00312
00313 Ecode_t SPIDRV_MTransmit( SPIDRV_Handle_t handle,
00314 const void *buffer,
00315 int count,
00316 SPIDRV_Callback_t callback );
00317
00318 Ecode_t SPIDRV_MTransmitB( SPIDRV_Handle_t handle,
00319 const void *buffer,
00320 int count );
00321
00322 Ecode_t SPIDRV_SetBitrate( SPIDRV_Handle_t handle,
00323 uint32_t bitRate );
00324
00325 Ecode_t SPIDRV_SetFramelength( SPIDRV_Handle_t handle,
00326 uint32_t frameLength );
00327
00328 Ecode_t SPIDRV_SReceive( SPIDRV_Handle_t handle,
00329 void *buffer,
00330 int count,
00331 SPIDRV_Callback_t callback,
00332 int timeoutMs );
00333
00334 Ecode_t SPIDRV_SReceiveB( SPIDRV_Handle_t handle,
00335 void *buffer,
00336 int count,
00337 int timeoutMs );
00338
00339 Ecode_t SPIDRV_STransfer( SPIDRV_Handle_t handle,
00340 const void *txBuffer,
00341 void *rxBuffer,
00342 int count,
00343 SPIDRV_Callback_t callback,
00344 int timeoutMs );
00345
00346 Ecode_t SPIDRV_STransferB( SPIDRV_Handle_t handle,
00347 const void *txBuffer,
00348 void *rxBuffer,
00349 int count,
00350 int timeoutMs );
00351
00352 Ecode_t SPIDRV_STransmit( SPIDRV_Handle_t handle,
00353 const void *buffer,
00354 int count,
00355 SPIDRV_Callback_t callback,
00356 int timeoutMs );
00357
00358 Ecode_t SPIDRV_STransmitB( SPIDRV_Handle_t handle,
00359 const void *buffer,
00360 int count,
00361 int timeoutMs );
00362
00366 #ifdef __cplusplus
00367 }
00368 #endif
00369
00370 #endif