SD.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. /*******************************************************************************
  2. * File Name: SD.h
  3. * Version 2.40
  4. *
  5. * Description:
  6. * Contains the function prototypes, constants and register definition
  7. * of the SPI Master Component.
  8. *
  9. * Note:
  10. * None
  11. *
  12. ********************************************************************************
  13. * Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved.
  14. * You may use this file only in accordance with the license, terms, conditions,
  15. * disclaimers, and limitations in the end user license agreement accompanying
  16. * the software package with which this file was provided.
  17. *******************************************************************************/
  18. #if !defined(CY_SPIM_SD_H)
  19. #define CY_SPIM_SD_H
  20. #include "cytypes.h"
  21. #include "cyfitter.h"
  22. #include "CyLib.h"
  23. /* Check to see if required defines such as CY_PSOC5A are available */
  24. /* They are defined starting with cy_boot v3.0 */
  25. #if !defined (CY_PSOC5A)
  26. #error Component SPI_Master_v2_40 requires cy_boot v3.0 or later
  27. #endif /* (CY_PSOC5A) */
  28. /***************************************
  29. * Conditional Compilation Parameters
  30. ***************************************/
  31. #define SD_INTERNAL_CLOCK (0u)
  32. #if(0u != SD_INTERNAL_CLOCK)
  33. #include "SD_IntClock.h"
  34. #endif /* (0u != SD_INTERNAL_CLOCK) */
  35. #define SD_MODE (1u)
  36. #define SD_DATA_WIDTH (8u)
  37. #define SD_MODE_USE_ZERO (1u)
  38. #define SD_BIDIRECTIONAL_MODE (0u)
  39. /* Internal interrupt handling */
  40. #define SD_TX_BUFFER_SIZE (4u)
  41. #define SD_RX_BUFFER_SIZE (4u)
  42. #define SD_INTERNAL_TX_INT_ENABLED (0u)
  43. #define SD_INTERNAL_RX_INT_ENABLED (0u)
  44. #define SD_SINGLE_REG_SIZE (8u)
  45. #define SD_USE_SECOND_DATAPATH (SD_DATA_WIDTH > SD_SINGLE_REG_SIZE)
  46. #define SD_FIFO_SIZE (4u)
  47. #define SD_TX_SOFTWARE_BUF_ENABLED ((0u != SD_INTERNAL_TX_INT_ENABLED) && \
  48. (SD_TX_BUFFER_SIZE > SD_FIFO_SIZE))
  49. #define SD_RX_SOFTWARE_BUF_ENABLED ((0u != SD_INTERNAL_RX_INT_ENABLED) && \
  50. (SD_RX_BUFFER_SIZE > SD_FIFO_SIZE))
  51. /***************************************
  52. * Data Struct Definition
  53. ***************************************/
  54. /* Sleep Mode API Support */
  55. typedef struct
  56. {
  57. uint8 enableState;
  58. uint8 cntrPeriod;
  59. #if(CY_UDB_V0)
  60. uint8 saveSrTxIntMask;
  61. uint8 saveSrRxIntMask;
  62. #endif /* (CY_UDB_V0) */
  63. } SD_BACKUP_STRUCT;
  64. /***************************************
  65. * Function Prototypes
  66. ***************************************/
  67. void SD_Init(void) ;
  68. void SD_Enable(void) ;
  69. void SD_Start(void) ;
  70. void SD_Stop(void) ;
  71. void SD_EnableTxInt(void) ;
  72. void SD_EnableRxInt(void) ;
  73. void SD_DisableTxInt(void) ;
  74. void SD_DisableRxInt(void) ;
  75. void SD_Sleep(void) ;
  76. void SD_Wakeup(void) ;
  77. void SD_SaveConfig(void) ;
  78. void SD_RestoreConfig(void) ;
  79. void SD_SetTxInterruptMode(uint8 intSrc) ;
  80. void SD_SetRxInterruptMode(uint8 intSrc) ;
  81. uint8 SD_ReadTxStatus(void) ;
  82. uint8 SD_ReadRxStatus(void) ;
  83. void SD_WriteTxData(uint8 txData) \
  84. ;
  85. uint8 SD_ReadRxData(void) \
  86. ;
  87. uint8 SD_GetRxBufferSize(void) ;
  88. uint8 SD_GetTxBufferSize(void) ;
  89. void SD_ClearRxBuffer(void) ;
  90. void SD_ClearTxBuffer(void) ;
  91. void SD_ClearFIFO(void) ;
  92. void SD_PutArray(const uint8 buffer[], uint8 byteCount) \
  93. ;
  94. #if(0u != SD_BIDIRECTIONAL_MODE)
  95. void SD_TxEnable(void) ;
  96. void SD_TxDisable(void) ;
  97. #endif /* (0u != SD_BIDIRECTIONAL_MODE) */
  98. CY_ISR_PROTO(SD_TX_ISR);
  99. CY_ISR_PROTO(SD_RX_ISR);
  100. /**********************************
  101. * Variable with external linkage
  102. **********************************/
  103. extern uint8 SD_initVar;
  104. /***************************************
  105. * API Constants
  106. ***************************************/
  107. #define SD_TX_ISR_NUMBER ((uint8) (SD_TxInternalInterrupt__INTC_NUMBER))
  108. #define SD_RX_ISR_NUMBER ((uint8) (SD_RxInternalInterrupt__INTC_NUMBER))
  109. #define SD_TX_ISR_PRIORITY ((uint8) (SD_TxInternalInterrupt__INTC_PRIOR_NUM))
  110. #define SD_RX_ISR_PRIORITY ((uint8) (SD_RxInternalInterrupt__INTC_PRIOR_NUM))
  111. /***************************************
  112. * Initial Parameter Constants
  113. ***************************************/
  114. #define SD_INT_ON_SPI_DONE ((uint8) (0u << SD_STS_SPI_DONE_SHIFT))
  115. #define SD_INT_ON_TX_EMPTY ((uint8) (0u << SD_STS_TX_FIFO_EMPTY_SHIFT))
  116. #define SD_INT_ON_TX_NOT_FULL ((uint8) (0u << \
  117. SD_STS_TX_FIFO_NOT_FULL_SHIFT))
  118. #define SD_INT_ON_BYTE_COMP ((uint8) (0u << SD_STS_BYTE_COMPLETE_SHIFT))
  119. #define SD_INT_ON_SPI_IDLE ((uint8) (0u << SD_STS_SPI_IDLE_SHIFT))
  120. /* Disable TX_NOT_FULL if software buffer is used */
  121. #define SD_INT_ON_TX_NOT_FULL_DEF ((SD_TX_SOFTWARE_BUF_ENABLED) ? \
  122. (0u) : (SD_INT_ON_TX_NOT_FULL))
  123. /* TX interrupt mask */
  124. #define SD_TX_INIT_INTERRUPTS_MASK (SD_INT_ON_SPI_DONE | \
  125. SD_INT_ON_TX_EMPTY | \
  126. SD_INT_ON_TX_NOT_FULL_DEF | \
  127. SD_INT_ON_BYTE_COMP | \
  128. SD_INT_ON_SPI_IDLE)
  129. #define SD_INT_ON_RX_FULL ((uint8) (0u << \
  130. SD_STS_RX_FIFO_FULL_SHIFT))
  131. #define SD_INT_ON_RX_NOT_EMPTY ((uint8) (0u << \
  132. SD_STS_RX_FIFO_NOT_EMPTY_SHIFT))
  133. #define SD_INT_ON_RX_OVER ((uint8) (0u << \
  134. SD_STS_RX_FIFO_OVERRUN_SHIFT))
  135. /* RX interrupt mask */
  136. #define SD_RX_INIT_INTERRUPTS_MASK (SD_INT_ON_RX_FULL | \
  137. SD_INT_ON_RX_NOT_EMPTY | \
  138. SD_INT_ON_RX_OVER)
  139. /* Nubmer of bits to receive/transmit */
  140. #define SD_BITCTR_INIT (((uint8) (SD_DATA_WIDTH << 1u)) - 1u)
  141. /***************************************
  142. * Registers
  143. ***************************************/
  144. #if(CY_PSOC3 || CY_PSOC5)
  145. #define SD_TXDATA_REG (* (reg8 *) \
  146. SD_BSPIM_sR8_Dp_u0__F0_REG)
  147. #define SD_TXDATA_PTR ( (reg8 *) \
  148. SD_BSPIM_sR8_Dp_u0__F0_REG)
  149. #define SD_RXDATA_REG (* (reg8 *) \
  150. SD_BSPIM_sR8_Dp_u0__F1_REG)
  151. #define SD_RXDATA_PTR ( (reg8 *) \
  152. SD_BSPIM_sR8_Dp_u0__F1_REG)
  153. #else /* PSOC4 */
  154. #if(SD_USE_SECOND_DATAPATH)
  155. #define SD_TXDATA_REG (* (reg16 *) \
  156. SD_BSPIM_sR8_Dp_u0__16BIT_F0_REG)
  157. #define SD_TXDATA_PTR ( (reg16 *) \
  158. SD_BSPIM_sR8_Dp_u0__16BIT_F0_REG)
  159. #define SD_RXDATA_REG (* (reg16 *) \
  160. SD_BSPIM_sR8_Dp_u0__16BIT_F1_REG)
  161. #define SD_RXDATA_PTR ( (reg16 *) \
  162. SD_BSPIM_sR8_Dp_u0__16BIT_F1_REG)
  163. #else
  164. #define SD_TXDATA_REG (* (reg8 *) \
  165. SD_BSPIM_sR8_Dp_u0__F0_REG)
  166. #define SD_TXDATA_PTR ( (reg8 *) \
  167. SD_BSPIM_sR8_Dp_u0__F0_REG)
  168. #define SD_RXDATA_REG (* (reg8 *) \
  169. SD_BSPIM_sR8_Dp_u0__F1_REG)
  170. #define SD_RXDATA_PTR ( (reg8 *) \
  171. SD_BSPIM_sR8_Dp_u0__F1_REG)
  172. #endif /* (SD_USE_SECOND_DATAPATH) */
  173. #endif /* (CY_PSOC3 || CY_PSOC5) */
  174. #define SD_AUX_CONTROL_DP0_REG (* (reg8 *) \
  175. SD_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG)
  176. #define SD_AUX_CONTROL_DP0_PTR ( (reg8 *) \
  177. SD_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG)
  178. #if(SD_USE_SECOND_DATAPATH)
  179. #define SD_AUX_CONTROL_DP1_REG (* (reg8 *) \
  180. SD_BSPIM_sR8_Dp_u1__DP_AUX_CTL_REG)
  181. #define SD_AUX_CONTROL_DP1_PTR ( (reg8 *) \
  182. SD_BSPIM_sR8_Dp_u1__DP_AUX_CTL_REG)
  183. #endif /* (SD_USE_SECOND_DATAPATH) */
  184. #define SD_COUNTER_PERIOD_REG (* (reg8 *) SD_BSPIM_BitCounter__PERIOD_REG)
  185. #define SD_COUNTER_PERIOD_PTR ( (reg8 *) SD_BSPIM_BitCounter__PERIOD_REG)
  186. #define SD_COUNTER_CONTROL_REG (* (reg8 *) SD_BSPIM_BitCounter__CONTROL_AUX_CTL_REG)
  187. #define SD_COUNTER_CONTROL_PTR ( (reg8 *) SD_BSPIM_BitCounter__CONTROL_AUX_CTL_REG)
  188. #define SD_TX_STATUS_REG (* (reg8 *) SD_BSPIM_TxStsReg__STATUS_REG)
  189. #define SD_TX_STATUS_PTR ( (reg8 *) SD_BSPIM_TxStsReg__STATUS_REG)
  190. #define SD_RX_STATUS_REG (* (reg8 *) SD_BSPIM_RxStsReg__STATUS_REG)
  191. #define SD_RX_STATUS_PTR ( (reg8 *) SD_BSPIM_RxStsReg__STATUS_REG)
  192. #define SD_CONTROL_REG (* (reg8 *) \
  193. SD_BSPIM_BidirMode_SyncCtl_CtrlReg__CONTROL_REG)
  194. #define SD_CONTROL_PTR ( (reg8 *) \
  195. SD_BSPIM_BidirMode_SyncCtl_CtrlReg__CONTROL_REG)
  196. #define SD_TX_STATUS_MASK_REG (* (reg8 *) SD_BSPIM_TxStsReg__MASK_REG)
  197. #define SD_TX_STATUS_MASK_PTR ( (reg8 *) SD_BSPIM_TxStsReg__MASK_REG)
  198. #define SD_RX_STATUS_MASK_REG (* (reg8 *) SD_BSPIM_RxStsReg__MASK_REG)
  199. #define SD_RX_STATUS_MASK_PTR ( (reg8 *) SD_BSPIM_RxStsReg__MASK_REG)
  200. #define SD_TX_STATUS_ACTL_REG (* (reg8 *) SD_BSPIM_TxStsReg__STATUS_AUX_CTL_REG)
  201. #define SD_TX_STATUS_ACTL_PTR ( (reg8 *) SD_BSPIM_TxStsReg__STATUS_AUX_CTL_REG)
  202. #define SD_RX_STATUS_ACTL_REG (* (reg8 *) SD_BSPIM_RxStsReg__STATUS_AUX_CTL_REG)
  203. #define SD_RX_STATUS_ACTL_PTR ( (reg8 *) SD_BSPIM_RxStsReg__STATUS_AUX_CTL_REG)
  204. #if(SD_USE_SECOND_DATAPATH)
  205. #define SD_AUX_CONTROLDP1 (SD_AUX_CONTROL_DP1_REG)
  206. #endif /* (SD_USE_SECOND_DATAPATH) */
  207. /***************************************
  208. * Register Constants
  209. ***************************************/
  210. /* Status Register Definitions */
  211. #define SD_STS_SPI_DONE_SHIFT (0x00u)
  212. #define SD_STS_TX_FIFO_EMPTY_SHIFT (0x01u)
  213. #define SD_STS_TX_FIFO_NOT_FULL_SHIFT (0x02u)
  214. #define SD_STS_BYTE_COMPLETE_SHIFT (0x03u)
  215. #define SD_STS_SPI_IDLE_SHIFT (0x04u)
  216. #define SD_STS_RX_FIFO_FULL_SHIFT (0x04u)
  217. #define SD_STS_RX_FIFO_NOT_EMPTY_SHIFT (0x05u)
  218. #define SD_STS_RX_FIFO_OVERRUN_SHIFT (0x06u)
  219. #define SD_STS_SPI_DONE ((uint8) (0x01u << SD_STS_SPI_DONE_SHIFT))
  220. #define SD_STS_TX_FIFO_EMPTY ((uint8) (0x01u << SD_STS_TX_FIFO_EMPTY_SHIFT))
  221. #define SD_STS_TX_FIFO_NOT_FULL ((uint8) (0x01u << SD_STS_TX_FIFO_NOT_FULL_SHIFT))
  222. #define SD_STS_BYTE_COMPLETE ((uint8) (0x01u << SD_STS_BYTE_COMPLETE_SHIFT))
  223. #define SD_STS_SPI_IDLE ((uint8) (0x01u << SD_STS_SPI_IDLE_SHIFT))
  224. #define SD_STS_RX_FIFO_FULL ((uint8) (0x01u << SD_STS_RX_FIFO_FULL_SHIFT))
  225. #define SD_STS_RX_FIFO_NOT_EMPTY ((uint8) (0x01u << SD_STS_RX_FIFO_NOT_EMPTY_SHIFT))
  226. #define SD_STS_RX_FIFO_OVERRUN ((uint8) (0x01u << SD_STS_RX_FIFO_OVERRUN_SHIFT))
  227. /* TX and RX masks for clear on read bits */
  228. #define SD_TX_STS_CLR_ON_RD_BYTES_MASK (0x09u)
  229. #define SD_RX_STS_CLR_ON_RD_BYTES_MASK (0x40u)
  230. /* StatusI Register Interrupt Enable Control Bits */
  231. /* As defined by the Register map for the AUX Control Register */
  232. #define SD_INT_ENABLE (0x10u) /* Enable interrupt from statusi */
  233. #define SD_TX_FIFO_CLR (0x01u) /* F0 - TX FIFO */
  234. #define SD_RX_FIFO_CLR (0x02u) /* F1 - RX FIFO */
  235. #define SD_FIFO_CLR (SD_TX_FIFO_CLR | SD_RX_FIFO_CLR)
  236. /* Bit Counter (7-bit) Control Register Bit Definitions */
  237. /* As defined by the Register map for the AUX Control Register */
  238. #define SD_CNTR_ENABLE (0x20u) /* Enable CNT7 */
  239. /* Bi-Directional mode control bit */
  240. #define SD_CTRL_TX_SIGNAL_EN (0x01u)
  241. /* Datapath Auxillary Control Register definitions */
  242. #define SD_AUX_CTRL_FIFO0_CLR (0x01u)
  243. #define SD_AUX_CTRL_FIFO1_CLR (0x02u)
  244. #define SD_AUX_CTRL_FIFO0_LVL (0x04u)
  245. #define SD_AUX_CTRL_FIFO1_LVL (0x08u)
  246. #define SD_STATUS_ACTL_INT_EN_MASK (0x10u)
  247. /* Component disabled */
  248. #define SD_DISABLED (0u)
  249. /***************************************
  250. * Macros
  251. ***************************************/
  252. /* Returns true if componentn enabled */
  253. #define SD_IS_ENABLED (0u != (SD_TX_STATUS_ACTL_REG & SD_INT_ENABLE))
  254. /* Retuns TX status register */
  255. #define SD_GET_STATUS_TX(swTxSts) ( (uint8)(SD_TX_STATUS_REG | \
  256. ((swTxSts) & SD_TX_STS_CLR_ON_RD_BYTES_MASK)) )
  257. /* Retuns RX status register */
  258. #define SD_GET_STATUS_RX(swRxSts) ( (uint8)(SD_RX_STATUS_REG | \
  259. ((swRxSts) & SD_RX_STS_CLR_ON_RD_BYTES_MASK)) )
  260. /***************************************
  261. * Obsolete definitions
  262. ***************************************/
  263. /* Following definitions are for version compatibility.
  264. * They are obsolete in SPIM v2_30.
  265. * Please do not use it in new projects
  266. */
  267. #define SD_WriteByte SD_WriteTxData
  268. #define SD_ReadByte SD_ReadRxData
  269. void SD_SetInterruptMode(uint8 intSrc) ;
  270. uint8 SD_ReadStatus(void) ;
  271. void SD_EnableInt(void) ;
  272. void SD_DisableInt(void) ;
  273. /* Obsolete register names. Not to be used in new designs */
  274. #define SD_TXDATA (SD_TXDATA_REG)
  275. #define SD_RXDATA (SD_RXDATA_REG)
  276. #define SD_AUX_CONTROLDP0 (SD_AUX_CONTROL_DP0_REG)
  277. #define SD_TXBUFFERREAD (SD_txBufferRead)
  278. #define SD_TXBUFFERWRITE (SD_txBufferWrite)
  279. #define SD_RXBUFFERREAD (SD_rxBufferRead)
  280. #define SD_RXBUFFERWRITE (SD_rxBufferWrite)
  281. #define SD_COUNTER_PERIOD (SD_COUNTER_PERIOD_REG)
  282. #define SD_COUNTER_CONTROL (SD_COUNTER_CONTROL_REG)
  283. #define SD_STATUS (SD_TX_STATUS_REG)
  284. #define SD_CONTROL (SD_CONTROL_REG)
  285. #define SD_STATUS_MASK (SD_TX_STATUS_MASK_REG)
  286. #define SD_STATUS_ACTL (SD_TX_STATUS_ACTL_REG)
  287. #define SD_INIT_INTERRUPTS_MASK (SD_INT_ON_SPI_DONE | \
  288. SD_INT_ON_TX_EMPTY | \
  289. SD_INT_ON_TX_NOT_FULL_DEF | \
  290. SD_INT_ON_RX_FULL | \
  291. SD_INT_ON_RX_NOT_EMPTY | \
  292. SD_INT_ON_RX_OVER | \
  293. SD_INT_ON_BYTE_COMP)
  294. /* Following definitions are for version Compatibility.
  295. * They are obsolete in SPIM v2_40.
  296. * Please do not use it in new projects
  297. */
  298. #define SD_DataWidth (SD_DATA_WIDTH)
  299. #define SD_InternalClockUsed (SD_INTERNAL_CLOCK)
  300. #define SD_InternalTxInterruptEnabled (SD_INTERNAL_TX_INT_ENABLED)
  301. #define SD_InternalRxInterruptEnabled (SD_INTERNAL_RX_INT_ENABLED)
  302. #define SD_ModeUseZero (SD_MODE_USE_ZERO)
  303. #define SD_BidirectionalMode (SD_BIDIRECTIONAL_MODE)
  304. #define SD_Mode (SD_MODE)
  305. #define SD_DATAWIDHT (SD_DATA_WIDTH)
  306. #define SD_InternalInterruptEnabled (0u)
  307. #define SD_TXBUFFERSIZE (SD_TX_BUFFER_SIZE)
  308. #define SD_RXBUFFERSIZE (SD_RX_BUFFER_SIZE)
  309. #define SD_TXBUFFER SD_txBuffer
  310. #define SD_RXBUFFER SD_rxBuffer
  311. #endif /* (CY_SPIM_SD_H) */
  312. /* [] END OF FILE */