fifo_5410x.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. /*
  2. * @brief LPC5410X System FIFO chip driver
  3. *
  4. * @note
  5. * Copyright(C) NXP Semiconductors, 2014
  6. * All rights reserved.
  7. *
  8. * @par
  9. * Software that is described herein is for illustrative purposes only
  10. * which provides customers with programming information regarding the
  11. * LPC products. This software is supplied "AS IS" without any warranties of
  12. * any kind, and NXP Semiconductors and its licensor disclaim any and
  13. * all warranties, express or implied, including all implied warranties of
  14. * merchantability, fitness for a particular purpose and non-infringement of
  15. * intellectual property rights. NXP Semiconductors assumes no responsibility
  16. * or liability for the use of the software, conveys no license or rights under any
  17. * patent, copyright, mask work right, or any other intellectual property rights in
  18. * or to any products. NXP Semiconductors reserves the right to make changes
  19. * in the software without notification. NXP Semiconductors also makes no
  20. * representation or warranty that such application will be suitable for the
  21. * specified use without further testing or modification.
  22. *
  23. * @par
  24. * Permission to use, copy, modify, and distribute this software and its
  25. * documentation is hereby granted, under NXP Semiconductors' and its
  26. * licensor's relevant copyrights in the software, without fee, provided that it
  27. * is used in conjunction with NXP Semiconductors microcontrollers. This
  28. * copyright, permission, and disclaimer notice must appear in all copies of
  29. * this code.
  30. */
  31. #ifndef __FIFO_5410X_H_
  32. #define __FIFO_5410X_H_
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36. /** @defgroup FIFO_5410X CHIP: LPC5410X System FIFO chip driver
  37. * @ingroup CHIP_5410X_DRIVERS
  38. * This driver provides basic functionality for the system FIFO
  39. * and can be used to increase the amount of FIFO space available
  40. * to the UART and SPI peripherals. If using the system FIFO with the
  41. * UART or SPI drivers, the standard UART and SPI transfer handlers
  42. * cannot be used and buffer/stream management and status checking
  43. * must occur in the user application.
  44. * @{
  45. */
  46. /** Maximum USART peripherals */
  47. #define LPC_FIFO_USART_MAX (4)
  48. /** Maximum SPI peripherals */
  49. #define LPC_FIFO_SPI_MAX (2)
  50. /**
  51. * @brief LPC5410X System FIFO USART register block structure
  52. */
  53. typedef struct {
  54. __IO uint32_t CFG; /*!< USART configuration Register */
  55. __IO uint32_t STAT; /*!< USART status Register */
  56. __IO uint32_t INTSTAT; /*!< USART interrupt status Register */
  57. __IO uint32_t CTLSET; /*!< USART control read and set Register */
  58. __IO uint32_t CTLCLR; /*!< USART control clear Register */
  59. __IO uint32_t RXDAT; /*!< USART received data Register */
  60. __IO uint32_t RXDATSTAT; /*!< USART received data with status Register */
  61. __IO uint32_t TXDAT; /*!< USART transmit data Register */
  62. __I uint32_t RESERVED[0x38];
  63. } LPC_FIFO_USART_T;
  64. /**
  65. * @brief LPC5410X System FIFO SPI register block structure
  66. */
  67. typedef struct {
  68. __IO uint32_t CFG; /*!< SPI configuration Register */
  69. __IO uint32_t STAT; /*!< SPI status Register */
  70. __IO uint32_t INTSTAT; /*!< SPI interrupt status Register */
  71. __IO uint32_t CTLSET; /*!< SPI control read and set Register */
  72. __IO uint32_t CTLCLR; /*!< SPI control clear Register */
  73. __I uint32_t RXDAT; /*!< SPI received data Register */
  74. union {
  75. __O uint32_t TXDATSPI; /*!< SPI transmit data and control Register */
  76. struct {
  77. __O uint16_t TXDATSPI_DATA; /*!< SPI transmit data Register */
  78. __O uint16_t TXDATSPI_CTRL; /*!< SPI transmit control Register */
  79. };
  80. };
  81. __I uint32_t RESERVED[0x39];
  82. } LPC_FIFO_SPI_T;
  83. /**
  84. * @brief LPC5410X System FIFO common register block structure
  85. */
  86. typedef struct {
  87. __I uint32_t reserved0[0x40];
  88. __IO uint32_t FIFOCTLUSART; /*!< USART FIFO global control Register */
  89. __O uint32_t FIFOUPDATEUSART; /*!< USART FIFO global update Register */
  90. __I uint32_t reserved1[0x2];
  91. __IO uint32_t FIFOCFGUSART[LPC_FIFO_USART_MAX]; /*!< USART FIFO configuration Registers */
  92. __I uint32_t reserved2[0x38];
  93. __IO uint32_t FIFOCTLSPI; /*!< SPI FIFO global control Register */
  94. __O uint32_t FIFOUPDATESPI; /*!< SPI FIFO global update Register */
  95. __I uint32_t reserved3[0x2];
  96. __IO uint32_t FIFOCFGSPI[LPC_FIFO_SPI_MAX]; /*!< SPI FIFO configuration Registers */
  97. __I uint32_t reserved4[0x3A];
  98. __I uint32_t reserved5[((0x1000 - 0x300) / sizeof(uint32_t))];
  99. } LPC_FIFO_CMN_T;
  100. /**
  101. * @brief LPC5410X Complete system FIFO register block structure
  102. */
  103. typedef struct {
  104. LPC_FIFO_CMN_T common;
  105. LPC_FIFO_USART_T usart[LPC_FIFO_USART_MAX];
  106. __I uint32_t reserved0[((0x2000 - 0x1400) / sizeof(uint32_t))];
  107. LPC_FIFO_SPI_T spi[LPC_FIFO_SPI_MAX];
  108. } LPC_FIFO_T;
  109. /** @defgroup FIFO_CMN_5410X CHIP: Common FIFO functions
  110. * These functions are for both the USART and SPI configuration and
  111. * status.
  112. * @{
  113. */
  114. /**
  115. * @brief Initializes the system FIFO
  116. * @brief pFIFO : Pointer to system FIFO registers
  117. * @return Nothing
  118. */
  119. void Chip_FIFO_Init(LPC_FIFO_T *pFIFO);
  120. /**
  121. * @brief Deinitializes the system FIFO
  122. * @brief pFIFO : Pointer to system FIFO registers
  123. * @return Nothing
  124. */
  125. void Chip_FIFO_Deinit(LPC_FIFO_T *pFIFO);
  126. /** USART/SPI peripheral identifier */
  127. typedef enum {FIFO_USART, FIFO_SPI} LPC_FIFO_PERIPHID_T;
  128. /** USART/SPI FIFO direction identifier */
  129. typedef enum {FIFO_RX, FIFO_TX} LPC_FIFO_DIR_T;
  130. /**
  131. * @brief Get the FIFO space available for the USART/SPI direction
  132. * @brief pFIFO : Pointer to system FIFO registers
  133. * @brief periphId : Peripheral identifer
  134. * @brief dir : FIFO direction
  135. * @return Amount of FIFO space available for the peripheral
  136. */
  137. uint32_t Chip_FIFO_GetFifoSpace(LPC_FIFO_T *pFIFO, LPC_FIFO_PERIPHID_T periphId, LPC_FIFO_DIR_T dir);
  138. /** USART and SPI FIFO common statuses */
  139. #define LPC_FIFO_STAT_RXPAUSED (1 << 1) /*!< Receive FIFOs paused status */
  140. #define LPC_FIFO_STAT_RXEMPTY (1 << 2) /*!< Receive FIFOs empty status */
  141. #define LPC_FIFO_STAT_TXPAUSED (1 << 9) /*!< Transmit FIFOs paused status */
  142. #define LPC_FIFO_STAT_TXEMPTY (1 << 10) /*!< Transmit FIFOs empty status */
  143. /**
  144. * @brief Get periperhal FIFO status
  145. * @brief pFIFO : Pointer to system FIFO registers
  146. * @return A bitfield of status values, mask with LPC_FIFO_STAT_* values
  147. * @note Mask with one or more LPC_FIFO_STAT_* definitions to get the
  148. * status of the peripherals.
  149. */
  150. STATIC INLINE uint32_t Chip_FIFO_GetFifoStatus(LPC_FIFO_T *pFIFO)
  151. {
  152. return pFIFO->common.FIFOCTLUSART;
  153. }
  154. /**
  155. * @brief Pause a peripheral FIFO
  156. * @brief pFIFO : Pointer to system FIFO registers
  157. * @brief periphId : Peripheral identifer
  158. * @brief dir : FIFO direction
  159. * @return Nothing
  160. */
  161. void Chip_FIFO_PauseFifo(LPC_FIFO_T *pFIFO, LPC_FIFO_PERIPHID_T periphId, LPC_FIFO_DIR_T dir);
  162. /**
  163. * @brief Unpause a peripheral FIFO
  164. * @brief pFIFO : Pointer to system FIFO registers
  165. * @brief periphId : Peripheral identifer
  166. * @brief dir : FIFO direction
  167. * @return Nothing
  168. */
  169. void Chip_FIFO_UnpauseFifo(LPC_FIFO_T *pFIFO, LPC_FIFO_PERIPHID_T periphId, LPC_FIFO_DIR_T dir);
  170. /** Stucture for setting USART or SPI FIFO sizes */
  171. typedef struct {
  172. uint16_t fifoRXSize[4]; /*!< FIFO RX size, 0-3 for USARTS 0-3, or 0-1 for SPIS 0-1 */
  173. uint16_t fifoTXSize[4]; /*!< FIFO TX size, 0-3 for USARTS 0-3, or 0-1 for SPIS 0-1 */
  174. } LPC_FIFO_CFGSIZE_T;
  175. /**
  176. * @brief Configure a peripheral's FIFO sizes
  177. * @brief pFIFO : Pointer to system FIFO registers
  178. * @brief periphId : Peripheral identifer
  179. * @brief pSizes : Pointer to s structure filled out with the peripherla FIFO sizes
  180. * @return Nothing
  181. * @note This function configures all the FIFOs for a supported peripheral
  182. * in a single call. Use 0 to disable the FIFO. This function will pause the FIFO
  183. * and leave it paused after configuration, call Chip_FIFO_UnpauseFifo() after
  184. * calling this function.
  185. */
  186. void Chip_FIFO_ConfigFifoSize(LPC_FIFO_T *pFIFO, LPC_FIFO_PERIPHID_T periphId, LPC_FIFO_CFGSIZE_T *pSizes);
  187. /** Stucture for setting USART and SPI FIFO configuration */
  188. typedef struct {
  189. uint32_t noTimeoutContWrite : 1; /*!< Timeout Continue On Write, set to 0 to reset timeout on each TX FIFO data, or 1 for accumulated timeout */
  190. uint32_t noTimeoutContEmpty : 1; /*!< Timeout Continue On Empty., set to 0 to reset timeout on each RX FIFO data, or 1 for accumulated timeout */
  191. uint32_t timeoutBase : 4; /*!< Specifies the least significant timer bit to compare to TimeoutValue. See User Manual */
  192. uint32_t timeoutValue : 4; /*!< Specifies the maximum time value for timeout at the timer position identified by TimeoutBase. See User Manual */
  193. uint32_t rxThreshold : 8; /*!< Receive FIFO Threshold, number of data to receive prior to interrupt */
  194. uint32_t txThreshold : 8; /*!< Transmit FIFO Threshold, number of free TX data entries available prior to interrupt */
  195. } LPC_FIFO_CFG_T;
  196. /** USART and SPI FIFO statuses */
  197. #define LPC_PERIPFIFO_STAT_RXTH (1 << 0) /*!< When 1, the receive FIFO threshold has been reached */
  198. #define LPC_PERIPFIFO_STAT_TXTH (1 << 1) /*!< When 1, the transmit FIFO threshold has been reached */
  199. #define LPC_PERIPFIFO_STATCLR_RXTIMEOUT (1 << 4) /*!< When 1, the receive FIFO has timed out, based on the timeout configuration in the CFG register */
  200. #define LPC_PERIPFIFO_STATCLR_BUSERR (1 << 7) /*!< Bus Error. When 1, a bus error has occurred while processing data for the peripheral. The bus error flag can be cleared by writing a 1 to this bit. */
  201. #define LPC_PERIPFIFO_STAT_RXEMPTY (1 << 8) /*!< Receive FIFO Empty. When 1, the receive FIFO is currently empty. */
  202. #define LPC_PERIPFIFO_STAT_TXEMPTY (1 << 9) /*!< Transmit FIFO Empty. When 1, the transmit FIFO is currently empty. */
  203. /** USART interrupt enable/disable bits */
  204. #define LPC_PERIPFIFO_INT_RXTH (1 << 0) /*!< Receive FIFO Threshold Interrupt Enable */
  205. #define LPC_PERIPFIFO_INT_TXTH (1 << 1) /*!< Transmit FIFO Threshold Interrupt Enable */
  206. #define LPC_PERIPFIFO_INT_RXTIMEOUT (1 << 4) /*!< Receive FIFO Timeout Interrupt Enable */
  207. #define LPC_PERIPFIFO_INT_RXFLUSH (1 << 8) /*!< Receive FIFO flush */
  208. #define LPC_PERIPFIFO_INT_TXFLUSH (1 << 9) /*!< Transmit FIFO flush */
  209. /**
  210. * @}
  211. */
  212. /** @defgroup FIFO_USART_5410X CHIP: USART FIFO functions
  213. * These functions are for both the USART configuration, control, and status.
  214. * @{
  215. */
  216. /**
  217. * @brief Configure the USART system FIFO
  218. * @brief pFIFO : Pointer to system FIFO registers
  219. * @brief usartIndex : USART system FIFO index, 0 - 3
  220. * @brief pUSARTCfg : Pointer to USART configuration
  221. * @return Nothing
  222. */
  223. void Chip_FIFOUSART_Configure(LPC_FIFO_T *pFIFO, int usartIndex, LPC_FIFO_CFG_T *pUSARTCfg);
  224. /**
  225. * @brief Get USART FIFO statuses
  226. * @brief pFIFO : Pointer to system FIFO registers
  227. * @brief usartIndex : USART system FIFO index, 0 - 3
  228. * @return USART system FIFO statuses (mask with LPC_PERIPFIFO_STAT* values)
  229. */
  230. STATIC INLINE uint32_t Chip_FIFOUSART_GetStatus(LPC_FIFO_T *pFIFO, int usartIndex)
  231. {
  232. return pFIFO->usart[usartIndex].STAT;
  233. }
  234. /**
  235. * @brief Get USART RX FIFO count
  236. * @brief pFIFO : Pointer to system FIFO registers
  237. * @brief usartIndex : USART system FIFO index, 0 - 3
  238. * @return Returns how many entries may be read from the receive FIFO. 0 = FIFO empty.
  239. */
  240. STATIC INLINE uint32_t Chip_FIFOUSART_GetRxCount(LPC_FIFO_T *pFIFO, int usartIndex)
  241. {
  242. return (pFIFO->usart[usartIndex].STAT >> 16) & 0xFF;
  243. }
  244. /**
  245. * @brief Get USART TC FIFO count
  246. * @brief pFIFO : Pointer to system FIFO registers
  247. * @brief usartIndex : USART system FIFO index, 0 - 3
  248. * @return Returns how many entries may be written to the transmit FIFO. 0 = FIFO full.
  249. */
  250. STATIC INLINE uint32_t Chip_FIFOUSART_GetTxCount(LPC_FIFO_T *pFIFO, int usartIndex)
  251. {
  252. return (pFIFO->usart[usartIndex].STAT >> 24) & 0xFF;
  253. }
  254. /**
  255. * @brief Clear USART FIFO statuses
  256. * @brief pFIFO : Pointer to system FIFO registers
  257. * @brief usartIndex : USART system FIFO index, 0 - 3
  258. * @brief clearMask : Mask of latched bits to cleared, Or'ed values of LPC_PERIPFIFO_STATCLR*
  259. * @return Nothing
  260. */
  261. STATIC INLINE void Chip_FIFOUSART_ClearStatus(LPC_FIFO_T *pFIFO, int usartIndex, uint32_t clearMask)
  262. {
  263. pFIFO->usart[usartIndex].STAT = clearMask;
  264. }
  265. /**
  266. * @brief Get USART FIFO pending interrupt statuses
  267. * @brief pFIFO : Pointer to system FIFO registers
  268. * @brief usartIndex : USART system FIFO index, 0 - 3
  269. * @return USART system FIFO pending interrupt statuses (mask with LPC_PERIPFIFO_STAT* values)
  270. */
  271. STATIC INLINE uint32_t Chip_FIFOUSART_GetIntStatus(LPC_FIFO_T *pFIFO, int usartIndex)
  272. {
  273. return pFIFO->usart[usartIndex].INTSTAT;
  274. }
  275. /**
  276. * @brief Enable USART system FIFO interrupts
  277. * @brief pFIFO : Pointer to system FIFO registers
  278. * @brief usartIndex : USART system FIFO index, 0 - 3
  279. * @brief intMask : Interrupts to enable (LPC_PERIPFIFO_INT_RXTH, LPC_PERIPFIFO_INT_TXTH, or LPC_PERIPFIFO_INT_RXTIMEOUT)
  280. * @return Nothing
  281. */
  282. STATIC INLINE void Chip_FIFOUSART_EnableInts(LPC_FIFO_T *pFIFO, int usartIndex, uint32_t intMask)
  283. {
  284. pFIFO->usart[usartIndex].CTLSET = intMask;
  285. }
  286. /**
  287. * @brief Disable USART system FIFO interrupts
  288. * @brief pFIFO : Pointer to system FIFO registers
  289. * @brief usartIndex : USART system FIFO index, 0 - 3
  290. * @brief intMask : Interrupts to disable (LPC_PERIPFIFO_INT_RXTH, LPC_PERIPFIFO_INT_TXTH, or LPC_PERIPFIFO_INT_RXTIMEOUT)
  291. * @return Nothing
  292. */
  293. STATIC INLINE void Chip_FIFOUSART_DisableInts(LPC_FIFO_T *pFIFO, int usartIndex, uint32_t intMask)
  294. {
  295. pFIFO->usart[usartIndex].CTLCLR = intMask;
  296. }
  297. /**
  298. * @brief Flush TX and/or RX USART system FIFOs
  299. * @brief pFIFO : Pointer to system FIFO registers
  300. * @brief usartIndex : USART system FIFO index, 0 - 3
  301. * @brief flushMask : FIFOS to flush (Or'ed LPC_PERIPFIFO_INT_RXFLUSH and/or LPC_PERIPFIFO_INT_TXFLUSH)
  302. * @return Nothing
  303. */
  304. STATIC INLINE void Chip_FIFOUSART_FlushFIFO(LPC_FIFO_T *pFIFO, int usartIndex, uint32_t flushMask)
  305. {
  306. flushMask = flushMask & (LPC_PERIPFIFO_INT_RXFLUSH | LPC_PERIPFIFO_INT_TXFLUSH);
  307. pFIFO->usart[usartIndex].CTLSET = flushMask;
  308. pFIFO->usart[usartIndex].CTLCLR = flushMask;
  309. }
  310. /**
  311. * @brief Write data to a USART system FIFO (non-blocking)
  312. * @brief pFIFO : Pointer to system FIFO registers
  313. * @brief usartIndex : USART system FIFO index, 0 - 3
  314. * @brief sz8 : Set to true for 8-bit or less data, or false for >8-bit
  315. * @brief buff : Pointer to data in buffer to write
  316. * @brief numData : Maximum number of data values to write
  317. * @return The number of data values written to the USART system FIFO
  318. */
  319. int Chip_FIFOUSART_WriteTX(LPC_FIFO_T *pFIFO, int usartIndex, bool sz8, void *buff, int numData);
  320. /**
  321. * @brief Read data from a USART system FIFO (non-blocking)
  322. * @brief pFIFO : Pointer to system FIFO registers
  323. * @brief usartIndex : USART system FIFO index, 0 - 3
  324. * @brief sz8 : Set to true for 8-bit or less data, or false for >8-bit
  325. * @brief buff : Pointer to data buffer to read into
  326. * @brief numData : Maximum number of data values to read
  327. * @return The number of data values read from the USART system FIFO
  328. */
  329. int Chip_FIFOUSART_ReadRX(LPC_FIFO_T *pFIFO, int usartIndex, bool sz8, void *buff, int numData);
  330. /** USART FIFO read FIFO statuses */
  331. #define LPC_USARTRXFIFO_STAT_FRAMERR (1 << 13) /*!< Framing Error status flag */
  332. #define LPC_USARTRXFIFO_STAT_PARITYERR (1 << 14) /*!< Parity Error status flag */
  333. #define LPC_USARTRXFIFO_STAT_RXNOISE (1 << 15) /*!< Received Noise flag */
  334. /**
  335. * @brief Read data from a USART system FIFO with status (non-blocking)
  336. * @brief pFIFO : Pointer to system FIFO registers
  337. * @brief usartIndex : USART system FIFO index, 0 - 3
  338. * @brief buff : Pointer to data buffer to read into
  339. * @brief numData : Maximum number of data values to read
  340. * @return The number of data values with status read from the USART system FIFO. Mask
  341. * the upper bits of each word in the buffer with the LPC_USARTRXFIFO_STAT_* flags to
  342. * determine individual data status.
  343. */
  344. int Chip_FIFOUSART_ReadRXStatus(LPC_FIFO_T *pFIFO, int usartIndex, uint16_t *buff, int numData);
  345. /**
  346. * @}
  347. */
  348. /** @defgroup FIFO_SPI_5410X CHIP: SPI FIFO functions
  349. * These functions are for both the SPI configuration, control, and status.
  350. * @{
  351. */
  352. /**
  353. * @brief Configure the SPI system FIFO
  354. * @brief pFIFO : Pointer to system FIFO registers
  355. * @brief spiIndex : SPI system FIFO index, 0 - 1
  356. * @brief pUSARTCfg : Pointer to SPI configuration
  357. * @return Nothing
  358. */
  359. void Chip_FIFOSPI_Configure(LPC_FIFO_T *pFIFO, int spiIndex, LPC_FIFO_CFG_T *pSPICfg);
  360. /**
  361. * @brief Get SPI FIFO statuses
  362. * @brief pFIFO : Pointer to system FIFO registers
  363. * @brief spiIndex : SPI system FIFO index, 0 - 1
  364. * @return SPI system FIFO statuses (mask with LPC_PERIPFIFO_STAT* values)
  365. */
  366. STATIC INLINE uint32_t Chip_FIFOSPI_GetStatus(LPC_FIFO_T *pFIFO, int spiIndex)
  367. {
  368. return pFIFO->spi[spiIndex].STAT;
  369. }
  370. /**
  371. * @brief Get SPI RX FIFO count
  372. * @brief pFIFO : Pointer to system FIFO registers
  373. * @brief spiIndex : SPI system FIFO index, 0 - 1
  374. * @return Returns how many entries may be read from the receive FIFO. 0 = FIFO empty.
  375. */
  376. STATIC INLINE uint32_t Chip_FIFOSPI_GetRxCount(LPC_FIFO_T *pFIFO, int spiIndex)
  377. {
  378. return (pFIFO->spi[spiIndex].STAT >> 16) & 0xFF;
  379. }
  380. /**
  381. * @brief Get SPI TX FIFO count
  382. * @brief pFIFO : Pointer to system FIFO registers
  383. * @brief spiIndex : SPI system FIFO index, 0 - 1
  384. * @return Returns how many entries may be written to the transmit FIFO. 0 = FIFO full.
  385. */
  386. STATIC INLINE uint32_t Chip_FIFOSPI_GetTxCount(LPC_FIFO_T *pFIFO, int spiIndex)
  387. {
  388. return (pFIFO->spi[spiIndex].STAT >> 24) & 0xFF;
  389. }
  390. /**
  391. * @brief Clear SPI FIFO statuses
  392. * @brief pFIFO : Pointer to system FIFO registers
  393. * @brief spiIndex : SPI system FIFO index, 0 - 1
  394. * @brief clearMask : Mask of latched bits to cleared, Or'ed values of LPC_PERIPFIFO_STATCLR*
  395. * @return Nothing
  396. */
  397. STATIC INLINE void Chip_FIFOSPI_ClearStatus(LPC_FIFO_T *pFIFO, int spiIndex, uint32_t clearMask)
  398. {
  399. pFIFO->spi[spiIndex].STAT = clearMask;
  400. }
  401. /**
  402. * @brief Get SPI FIFO pending interrupt statuses
  403. * @brief pFIFO : Pointer to system FIFO registers
  404. * @brief spiIndex : SPI system FIFO index, 0 - 1
  405. * @return SPI system FIFO pending interrupt statuses (mask with LPC_PERIPFIFO_STAT* values)
  406. */
  407. STATIC INLINE uint32_t Chip_FIFOSPI_GetIntStatus(LPC_FIFO_T *pFIFO, int spiIndex)
  408. {
  409. return pFIFO->spi[spiIndex].INTSTAT;
  410. }
  411. /**
  412. * @brief Enable SPI system FIFO interrupts
  413. * @brief pFIFO : Pointer to system FIFO registers
  414. * @brief spiIndex : SPI system FIFO index, 0 - 1
  415. * @brief intMask : Interrupts to enable (LPC_PERIPFIFO_INT_RXTH, LPC_PERIPFIFO_INT_TXTH, or LPC_PERIPFIFO_INT_RXTIMEOUT)
  416. * @return Nothing
  417. */
  418. STATIC INLINE void Chip_FIFOSPI_EnableInts(LPC_FIFO_T *pFIFO, int spiIndex, uint32_t intMask)
  419. {
  420. pFIFO->spi[spiIndex].CTLSET = intMask;
  421. }
  422. /**
  423. * @brief Disable SPI system FIFO interrupts
  424. * @brief pFIFO : Pointer to system FIFO registers
  425. * @brief spiIndex : SPI system FIFO index, 0 - 1
  426. * @brief intMask : Interrupts to disable (LPC_PERIPFIFO_INT_RXTH, LPC_PERIPFIFO_INT_TXTH, or LPC_PERIPFIFO_INT_RXTIMEOUT)
  427. * @return Nothing
  428. */
  429. STATIC INLINE void Chip_FIFOSPI_DisableInts(LPC_FIFO_T *pFIFO, int spiIndex, uint32_t intMask)
  430. {
  431. pFIFO->spi[spiIndex].CTLCLR = intMask;
  432. }
  433. /**
  434. * @brief Flush TX and/or RX SPI system FIFOs
  435. * @brief pFIFO : Pointer to system FIFO registers
  436. * @brief spiIndex : SPI system FIFO index, 0 - 1
  437. * @brief flushMask : FIFOS to flush (Or'ed LPC_PERIPFIFO_INT_RXFLUSH and/or LPC_PERIPFIFO_INT_TXFLUSH)
  438. * @return Nothing
  439. */
  440. STATIC INLINE void Chip_FIFOSPI_FlushFIFO(LPC_FIFO_T *pFIFO, int spiIndex, uint32_t flushMask)
  441. {
  442. flushMask = flushMask & (LPC_PERIPFIFO_INT_RXFLUSH | LPC_PERIPFIFO_INT_TXFLUSH);
  443. pFIFO->spi[spiIndex].CTLSET = flushMask;
  444. pFIFO->spi[spiIndex].CTLCLR = flushMask;
  445. }
  446. /** SPI transfer flags */
  447. #define LPC_SPIFIFO_FLAG_EOF (1 << 21) /*!< Add a delay between frames */
  448. #define LPC_SPIFIFO_FLAG_RXIGNORE (1 << 22) /*!< Ignore RX data */
  449. /** SPI transfer error statuses */
  450. #define LPC_SPIFIFO_STAT_BUSY (0x0) /*!< SPI transfer busy/in progress */
  451. #define LPC_SPIFIFO_STAT_BADPARAM (0x1) /*!< SPI paramaters for transfer are invalid */
  452. #define LPC_SPIFIFO_STAT_TXUNDERRUN (0x2) /*!< Slave mode only, transmit FIFO underrun */
  453. #define LPC_SPIFIFO_STAT_RXOVERRUN (0x3) /*!< Slave mode only, receive FIFO overrun */
  454. #define LPC_SPIFIFO_STAT_COMPLETE (0xF) /*!< SPI transfer completed successfully */
  455. #if 0 /* Sorry, not yet support */
  456. /** Stucture for SPI control */
  457. typedef struct {
  458. uint32_t start : 1; /*!< Indicates transfer start, 0 = transfer resume, 1 = transfer start (automatically set by Chip_FIFOSPI_StartTransfer()) */
  459. uint32_t end : 1; /*!< Transfer wil end once buffers are empty */
  460. uint32_t sz8 : 1; /*!< Specifies the in and out buffer sizes, 0 = 16-bit, 1 = 8-bit */
  461. uint32_t sselNum : 2; /*!< SPI chip select number, 0 - 3 */
  462. void *inBuff; /*!< SPI transfer in data buffer pointer */
  463. uint32_t inIndex; /*!< SPI transfer in buffer index */
  464. void *outBuff; /*!< SPI transfer out data buffer pointer */
  465. uint32_t outIndex; /*!< SPI transfer out buffer index */
  466. uint32_t numData; /*!< Size of data both the receive and transfer buffers */
  467. int spiIndex; /*!< SPI system FIFO index, 0 - 1 */
  468. } LPC_FIFO_SPICTL_T;
  469. /**
  470. * @brief Start a SPI data transfer (non-blocking)
  471. * @brief pFIFO : Pointer to system FIFO registers
  472. * @brief pSetupData : Pointer to SPI transfer setup structure
  473. * @return Nothing
  474. * @note Simply calls Chip_FIFOSPI_Transfer() with pSetupData->start = 1.
  475. */
  476. void Chip_FIFOSPI_StartTransfer(LPC_FIFO_T *pFIFO, LPC_FIFO_SPICTL_T *pSetupData);
  477. /**
  478. * @brief Feed a SPI data transfer (non-blocking)
  479. * @brief pFIFO : Pointer to system FIFO registers
  480. * @brief pSetupData : Pointer to SPI transfer setup structure
  481. * @return Nothing
  482. * @note Continues SPI transfer usng the system FIFO.
  483. */
  484. void Chip_FIFOSPI_Transfer(LPC_FIFO_T *pFIFO, LPC_FIFO_SPICTL_T *pSetupData);
  485. #endif
  486. /**
  487. * @}
  488. */
  489. /**
  490. * @}
  491. */
  492. #ifdef __cplusplus
  493. }
  494. #endif
  495. #endif /* __FIFO_5410X_H_ */