spidrv.h

Go to the documentation of this file.
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,                       /* USART port                       */    \
00174   0,                            /* Tx DMA channel number            */    \
00175   1,                            /* Rx DMA channel number            */    \
00176   _USART_ROUTE_LOCATION_LOC1,   /* USART pins location number       */    \
00177   1000000,                      /* Bitrate                          */    \
00178   8,                            /* Frame length                     */    \
00179   0,                            /* Dummy tx value for rx only funcs */    \
00180   spidrvMaster,                 /* SPI mode                         */    \
00181   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00182   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00183   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00184   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
00185 }
00186 
00188 #define SPIDRV_MASTER_USART1                                              \
00189 {                                                                         \
00190   USART1,                       /* USART port                       */    \
00191   2,                            /* Tx DMA channel number            */    \
00192   3,                            /* Rx DMA channel number            */    \
00193   _USART_ROUTE_LOCATION_LOC1,   /* USART pins location number       */    \
00194   1000000,                      /* Bitrate                          */    \
00195   8,                            /* Frame length                     */    \
00196   0,                            /* Dummy tx value for rx only funcs */    \
00197   spidrvMaster,                 /* SPI mode                         */    \
00198   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00199   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00200   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00201   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
00202 }
00203 
00205 #define SPIDRV_MASTER_USART2                                              \
00206 {                                                                         \
00207   USART2,                       /* USART port                       */    \
00208   4,                            /* Tx DMA channel number            */    \
00209   5,                            /* Rx DMA channel number            */    \
00210   _USART_ROUTE_LOCATION_LOC0,   /* USART pins location number       */    \
00211   1000000,                      /* Bitrate                          */    \
00212   8,                            /* Frame length                     */    \
00213   0,                            /* Dummy tx value for rx only funcs */    \
00214   spidrvMaster,                 /* SPI mode                         */    \
00215   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00216   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00217   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00218   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
00219 }
00220 
00222 #define SPIDRV_SLAVE_USART0                                               \
00223 {                                                                         \
00224   USART0,                       /* USART port                       */    \
00225   0,                            /* Tx DMA channel number            */    \
00226   1,                            /* Rx DMA channel number            */    \
00227   _USART_ROUTE_LOCATION_LOC1,   /* USART pins location number       */    \
00228   0,                            /* Bitrate                          */    \
00229   8,                            /* Frame length                     */    \
00230   0,                            /* Dummy tx value for rx only funcs */    \
00231   spidrvSlave,                  /* SPI mode                         */    \
00232   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00233   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00234   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00235   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
00236 }
00237 
00239 #define SPIDRV_SLAVE_USART1                                               \
00240 {                                                                         \
00241   USART1,                       /* USART port                       */    \
00242   2,                            /* Tx DMA channel number            */    \
00243   3,                            /* Rx DMA channel number            */    \
00244   _USART_ROUTE_LOCATION_LOC1,   /* USART pins location number       */    \
00245   0,                            /* Bitrate                          */    \
00246   8,                            /* Frame length                     */    \
00247   0,                            /* Dummy tx value for rx only funcs */    \
00248   spidrvSlave,                  /* SPI mode                         */    \
00249   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00250   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00251   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00252   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
00253 }
00254 
00256 #define SPIDRV_SLAVE_USART2                                               \
00257 {                                                                         \
00258   USART2,                       /* USART port                       */    \
00259   4,                            /* Tx DMA channel number            */    \
00260   5,                            /* Rx DMA channel number            */    \
00261   _USART_ROUTE_LOCATION_LOC0,   /* USART pins location number       */    \
00262   0,                            /* Bitrate                          */    \
00263   8,                            /* Frame length                     */    \
00264   0,                            /* Dummy tx value for rx only funcs */    \
00265   spidrvSlave,                  /* SPI mode                         */    \
00266   spidrvBitOrderMsbFirst,       /* Bit order on bus                 */    \
00267   spidrvClockMode0,             /* SPI clock/phase mode             */    \
00268   spidrvCsControlAuto,          /* CS controlled by the driver      */    \
00269   spidrvSlaveStartImmediate     /* Slave start transfers immediately*/    \
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 /* __SILICON_LABS_SPIDRV_H__ */