Driver_SPI.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*
  2. * Copyright (c) 2013-2016 ARM Limited. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the License); you may
  7. * not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  14. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. * $Date: 17. Apr 2014
  19. * $Revision: V2.01
  20. *
  21. * Project: SPI (Serial Peripheral Interface) Driver definitions
  22. */
  23. /* History:
  24. * Version 2.01
  25. * Renamed status flag "tx_rx_busy" to "busy"
  26. * Version 2.00
  27. * New simplified driver:
  28. * complexity moved to upper layer (especially data handling)
  29. * more unified API for different communication interfaces
  30. * Added:
  31. * Slave Mode
  32. * Half-duplex Modes
  33. * Configurable number of data bits
  34. * Support for TI Mode and Microwire
  35. * Changed prefix ARM_DRV -> ARM_DRIVER
  36. * Version 1.10
  37. * Namespace prefix ARM_ added
  38. * Version 1.01
  39. * Added "send_done_event" to Capabilities
  40. * Version 1.00
  41. * Initial release
  42. */
  43. #ifndef __DRIVER_SPI_H
  44. #define __DRIVER_SPI_H
  45. #include "Driver_Common.h"
  46. #define ARM_SPI_API_VERSION ARM_DRIVER_VERSION_MAJOR_MINOR(2,01) /* API version */
  47. /****** SPI Control Codes *****/
  48. #define ARM_SPI_CONTROL_Pos 0
  49. #define ARM_SPI_CONTROL_Msk (0xFFUL << ARM_SPI_CONTROL_Pos)
  50. /*----- SPI Control Codes: Mode -----*/
  51. #define ARM_SPI_MODE_INACTIVE (0x00UL << ARM_SPI_CONTROL_Pos) ///< SPI Inactive
  52. #define ARM_SPI_MODE_MASTER (0x01UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output on MOSI, Input on MISO); arg = Bus Speed in bps
  53. #define ARM_SPI_MODE_SLAVE (0x02UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output on MISO, Input on MOSI)
  54. #define ARM_SPI_MODE_MASTER_SIMPLEX (0x03UL << ARM_SPI_CONTROL_Pos) ///< SPI Master (Output/Input on MOSI); arg = Bus Speed in bps
  55. #define ARM_SPI_MODE_SLAVE_SIMPLEX (0x04UL << ARM_SPI_CONTROL_Pos) ///< SPI Slave (Output/Input on MISO)
  56. /*----- SPI Control Codes: Mode Parameters: Frame Format -----*/
  57. #define ARM_SPI_FRAME_FORMAT_Pos 8
  58. #define ARM_SPI_FRAME_FORMAT_Msk (7UL << ARM_SPI_FRAME_FORMAT_Pos)
  59. #define ARM_SPI_CPOL0_CPHA0 (0UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 0 (default)
  60. #define ARM_SPI_CPOL0_CPHA1 (1UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 0, Clock Phase 1
  61. #define ARM_SPI_CPOL1_CPHA0 (2UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 0
  62. #define ARM_SPI_CPOL1_CPHA1 (3UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Clock Polarity 1, Clock Phase 1
  63. #define ARM_SPI_TI_SSI (4UL << ARM_SPI_FRAME_FORMAT_Pos) ///< Texas Instruments Frame Format
  64. #define ARM_SPI_MICROWIRE (5UL << ARM_SPI_FRAME_FORMAT_Pos) ///< National Microwire Frame Format
  65. /*----- SPI Control Codes: Mode Parameters: Data Bits -----*/
  66. #define ARM_SPI_DATA_BITS_Pos 12
  67. #define ARM_SPI_DATA_BITS_Msk (0x3FUL << ARM_SPI_DATA_BITS_Pos)
  68. #define ARM_SPI_DATA_BITS(n) (((n) & 0x3F) << ARM_SPI_DATA_BITS_Pos) ///< Number of Data bits
  69. /*----- SPI Control Codes: Mode Parameters: Bit Order -----*/
  70. #define ARM_SPI_BIT_ORDER_Pos 18
  71. #define ARM_SPI_BIT_ORDER_Msk (1UL << ARM_SPI_BIT_ORDER_Pos)
  72. #define ARM_SPI_MSB_LSB (0UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from MSB to LSB (default)
  73. #define ARM_SPI_LSB_MSB (1UL << ARM_SPI_BIT_ORDER_Pos) ///< SPI Bit order from LSB to MSB
  74. /*----- SPI Control Codes: Mode Parameters: Slave Select Mode -----*/
  75. #define ARM_SPI_SS_MASTER_MODE_Pos 19
  76. #define ARM_SPI_SS_MASTER_MODE_Msk (3UL << ARM_SPI_SS_MASTER_MODE_Pos)
  77. #define ARM_SPI_SS_MASTER_UNUSED (0UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Not used (default)
  78. #define ARM_SPI_SS_MASTER_SW (1UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Software controlled
  79. #define ARM_SPI_SS_MASTER_HW_OUTPUT (2UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware controlled Output
  80. #define ARM_SPI_SS_MASTER_HW_INPUT (3UL << ARM_SPI_SS_MASTER_MODE_Pos) ///< SPI Slave Select when Master: Hardware monitored Input
  81. #define ARM_SPI_SS_SLAVE_MODE_Pos 21
  82. #define ARM_SPI_SS_SLAVE_MODE_Msk (1UL << ARM_SPI_SS_SLAVE_MODE_Pos)
  83. #define ARM_SPI_SS_SLAVE_HW (0UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Hardware monitored (default)
  84. #define ARM_SPI_SS_SLAVE_SW (1UL << ARM_SPI_SS_SLAVE_MODE_Pos) ///< SPI Slave Select when Slave: Software controlled
  85. /*----- SPI Control Codes: Miscellaneous Controls -----*/
  86. #define ARM_SPI_SET_BUS_SPEED (0x10UL << ARM_SPI_CONTROL_Pos) ///< Set Bus Speed in bps; arg = value
  87. #define ARM_SPI_GET_BUS_SPEED (0x11UL << ARM_SPI_CONTROL_Pos) ///< Get Bus Speed in bps
  88. #define ARM_SPI_SET_DEFAULT_TX_VALUE (0x12UL << ARM_SPI_CONTROL_Pos) ///< Set default Transmit value; arg = value
  89. #define ARM_SPI_CONTROL_SS (0x13UL << ARM_SPI_CONTROL_Pos) ///< Control Slave Select; arg: 0=inactive, 1=active
  90. #define ARM_SPI_ABORT_TRANSFER (0x14UL << ARM_SPI_CONTROL_Pos) ///< Abort current data transfer
  91. /****** SPI Slave Select Signal definitions *****/
  92. #define ARM_SPI_SS_INACTIVE 0 ///< SPI Slave Select Signal Inactive
  93. #define ARM_SPI_SS_ACTIVE 1 ///< SPI Slave Select Signal Active
  94. /****** SPI specific error codes *****/
  95. #define ARM_SPI_ERROR_MODE (ARM_DRIVER_ERROR_SPECIFIC - 1) ///< Specified Mode not supported
  96. #define ARM_SPI_ERROR_FRAME_FORMAT (ARM_DRIVER_ERROR_SPECIFIC - 2) ///< Specified Frame Format not supported
  97. #define ARM_SPI_ERROR_DATA_BITS (ARM_DRIVER_ERROR_SPECIFIC - 3) ///< Specified number of Data bits not supported
  98. #define ARM_SPI_ERROR_BIT_ORDER (ARM_DRIVER_ERROR_SPECIFIC - 4) ///< Specified Bit order not supported
  99. #define ARM_SPI_ERROR_SS_MODE (ARM_DRIVER_ERROR_SPECIFIC - 5) ///< Specified Slave Select Mode not supported
  100. /**
  101. \brief SPI Status
  102. */
  103. typedef struct _ARM_SPI_STATUS {
  104. uint32_t busy : 1; ///< Transmitter/Receiver busy flag
  105. uint32_t data_lost : 1; ///< Data lost: Receive overflow / Transmit underflow (cleared on start of transfer operation)
  106. uint32_t mode_fault : 1; ///< Mode fault detected; optional (cleared on start of transfer operation)
  107. } ARM_SPI_STATUS;
  108. /****** SPI Event *****/
  109. #define ARM_SPI_EVENT_TRANSFER_COMPLETE (1UL << 0) ///< Data Transfer completed
  110. #define ARM_SPI_EVENT_DATA_LOST (1UL << 1) ///< Data lost: Receive overflow / Transmit underflow
  111. #define ARM_SPI_EVENT_MODE_FAULT (1UL << 2) ///< Master Mode Fault (SS deactivated when Master)
  112. // Function documentation
  113. /**
  114. \fn ARM_DRIVER_VERSION ARM_SPI_GetVersion (void)
  115. \brief Get driver version.
  116. \return \ref ARM_DRIVER_VERSION
  117. \fn ARM_SPI_CAPABILITIES ARM_SPI_GetCapabilities (void)
  118. \brief Get driver capabilities.
  119. \return \ref ARM_SPI_CAPABILITIES
  120. \fn int32_t ARM_SPI_Initialize (ARM_SPI_SignalEvent_t cb_event)
  121. \brief Initialize SPI Interface.
  122. \param[in] cb_event Pointer to \ref ARM_SPI_SignalEvent
  123. \return \ref execution_status
  124. \fn int32_t ARM_SPI_Uninitialize (void)
  125. \brief De-initialize SPI Interface.
  126. \return \ref execution_status
  127. \fn int32_t ARM_SPI_PowerControl (ARM_POWER_STATE state)
  128. \brief Control SPI Interface Power.
  129. \param[in] state Power state
  130. \return \ref execution_status
  131. \fn int32_t ARM_SPI_Send (const void *data, uint32_t num)
  132. \brief Start sending data to SPI transmitter.
  133. \param[in] data Pointer to buffer with data to send to SPI transmitter
  134. \param[in] num Number of data items to send
  135. \return \ref execution_status
  136. \fn int32_t ARM_SPI_Receive (void *data, uint32_t num)
  137. \brief Start receiving data from SPI receiver.
  138. \param[out] data Pointer to buffer for data to receive from SPI receiver
  139. \param[in] num Number of data items to receive
  140. \return \ref execution_status
  141. \fn int32_t ARM_SPI_Transfer (const void *data_out,
  142. void *data_in,
  143. uint32_t num)
  144. \brief Start sending/receiving data to/from SPI transmitter/receiver.
  145. \param[in] data_out Pointer to buffer with data to send to SPI transmitter
  146. \param[out] data_in Pointer to buffer for data to receive from SPI receiver
  147. \param[in] num Number of data items to transfer
  148. \return \ref execution_status
  149. \fn uint32_t ARM_SPI_GetDataCount (void)
  150. \brief Get transferred data count.
  151. \return number of data items transferred
  152. \fn int32_t ARM_SPI_Control (uint32_t control, uint32_t arg)
  153. \brief Control SPI Interface.
  154. \param[in] control Operation
  155. \param[in] arg Argument of operation (optional)
  156. \return common \ref execution_status and driver specific \ref spi_execution_status
  157. \fn ARM_SPI_STATUS ARM_SPI_GetStatus (void)
  158. \brief Get SPI status.
  159. \return SPI status \ref ARM_SPI_STATUS
  160. \fn void ARM_SPI_SignalEvent (uint32_t event)
  161. \brief Signal SPI Events.
  162. \param[in] event \ref SPI_events notification mask
  163. \return none
  164. */
  165. typedef void (*ARM_SPI_SignalEvent_t) (uint32_t event); ///< Pointer to \ref ARM_SPI_SignalEvent : Signal SPI Event.
  166. /**
  167. \brief SPI Driver Capabilities.
  168. */
  169. typedef struct _ARM_SPI_CAPABILITIES {
  170. uint32_t simplex : 1; ///< supports Simplex Mode (Master and Slave)
  171. uint32_t ti_ssi : 1; ///< supports TI Synchronous Serial Interface
  172. uint32_t microwire : 1; ///< supports Microwire Interface
  173. uint32_t event_mode_fault : 1; ///< Signal Mode Fault event: \ref ARM_SPI_EVENT_MODE_FAULT
  174. } ARM_SPI_CAPABILITIES;
  175. /**
  176. \brief Access structure of the SPI Driver.
  177. */
  178. typedef struct _ARM_DRIVER_SPI {
  179. ARM_DRIVER_VERSION (*GetVersion) (void); ///< Pointer to \ref ARM_SPI_GetVersion : Get driver version.
  180. ARM_SPI_CAPABILITIES (*GetCapabilities) (void); ///< Pointer to \ref ARM_SPI_GetCapabilities : Get driver capabilities.
  181. int32_t (*Initialize) (ARM_SPI_SignalEvent_t cb_event); ///< Pointer to \ref ARM_SPI_Initialize : Initialize SPI Interface.
  182. int32_t (*Uninitialize) (void); ///< Pointer to \ref ARM_SPI_Uninitialize : De-initialize SPI Interface.
  183. int32_t (*PowerControl) (ARM_POWER_STATE state); ///< Pointer to \ref ARM_SPI_PowerControl : Control SPI Interface Power.
  184. int32_t (*Send) (const void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Send : Start sending data to SPI Interface.
  185. int32_t (*Receive) ( void *data, uint32_t num); ///< Pointer to \ref ARM_SPI_Receive : Start receiving data from SPI Interface.
  186. int32_t (*Transfer) (const void *data_out,
  187. void *data_in,
  188. uint32_t num); ///< Pointer to \ref ARM_SPI_Transfer : Start sending/receiving data to/from SPI.
  189. uint32_t (*GetDataCount) (void); ///< Pointer to \ref ARM_SPI_GetDataCount : Get transferred data count.
  190. int32_t (*Control) (uint32_t control, uint32_t arg); ///< Pointer to \ref ARM_SPI_Control : Control SPI Interface.
  191. ARM_SPI_STATUS (*GetStatus) (void); ///< Pointer to \ref ARM_SPI_GetStatus : Get SPI status.
  192. } const ARM_DRIVER_SPI;
  193. #endif /* __DRIVER_SPI_H */