Driver_SPI.h 13 KB

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