]> git.sur5r.net Git - freertos/blob
c236296ed47bca9a173890d761d90f00d0d3c38c
[freertos] /
1 /*\r
2  * @brief LPC18xx/43xx SSP driver\r
3  *\r
4  * @note\r
5  * Copyright(C) NXP Semiconductors, 2012\r
6  * All rights reserved.\r
7  *\r
8  * @par\r
9  * Software that is described herein is for illustrative purposes only\r
10  * which provides customers with programming information regarding the\r
11  * LPC products.  This software is supplied "AS IS" without any warranties of\r
12  * any kind, and NXP Semiconductors and its licensor disclaim any and\r
13  * all warranties, express or implied, including all implied warranties of\r
14  * merchantability, fitness for a particular purpose and non-infringement of\r
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility\r
16  * or liability for the use of the software, conveys no license or rights under any\r
17  * patent, copyright, mask work right, or any other intellectual property rights in\r
18  * or to any products. NXP Semiconductors reserves the right to make changes\r
19  * in the software without notification. NXP Semiconductors also makes no\r
20  * representation or warranty that such application will be suitable for the\r
21  * specified use without further testing or modification.\r
22  *\r
23  * @par\r
24  * Permission to use, copy, modify, and distribute this software and its\r
25  * documentation is hereby granted, under NXP Semiconductors' and its\r
26  * licensor's relevant copyrights in the software, without fee, provided that it\r
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This\r
28  * copyright, permission, and disclaimer notice must appear in all copies of\r
29  * this code.\r
30  */\r
31 \r
32 #ifndef __SSP_18XX_43XX_H_\r
33 #define __SSP_18XX_43XX_H_\r
34 \r
35 #ifdef __cplusplus\r
36 extern "C" {\r
37 #endif\r
38 \r
39 /** @defgroup SSP_18XX_43XX CHIP: LPC18xx/43xx SSP driver\r
40  * @ingroup CHIP_18XX_43XX_Drivers\r
41  * @{\r
42  */\r
43 \r
44 /*\r
45  * @brief SSP clock format\r
46  */\r
47 typedef enum CHIP_SSP_CLOCK_FORMAT {\r
48         SSP_CLOCK_CPHA0_CPOL0 = (0 << 6),               /**< CPHA = 0, CPOL = 0 */\r
49         SSP_CLOCK_CPHA0_CPOL1 = (1u << 6),              /**< CPHA = 0, CPOL = 1 */\r
50         SSP_CLOCK_CPHA1_CPOL0 = (2u << 6),              /**< CPHA = 1, CPOL = 0 */\r
51         SSP_CLOCK_CPHA1_CPOL1 = (3u << 6),              /**< CPHA = 1, CPOL = 1 */\r
52         SSP_CLOCK_MODE0 = SSP_CLOCK_CPHA0_CPOL0,/**< alias */\r
53         SSP_CLOCK_MODE1 = SSP_CLOCK_CPHA1_CPOL0,/**< alias */\r
54         SSP_CLOCK_MODE2 = SSP_CLOCK_CPHA0_CPOL1,/**< alias */\r
55         SSP_CLOCK_MODE3 = SSP_CLOCK_CPHA1_CPOL1,/**< alias */\r
56 } CHIP_SSP_CLOCK_MODE_T;\r
57 \r
58 /*\r
59  * @brief SSP frame format\r
60  */\r
61 typedef enum CHIP_SSP_FRAME_FORMAT {\r
62         SSP_FRAMEFORMAT_SPI = (0 << 4),                 /**< Frame format: SPI */\r
63         CHIP_SSP_FRAME_FORMAT_TI = (1u << 4),                   /**< Frame format: TI SSI */\r
64         SSP_FRAMEFORMAT_MICROWIRE = (2u << 4),  /**< Frame format: Microwire */\r
65 } CHIP_SSP_FRAME_FORMAT_T;\r
66 \r
67 /*\r
68  * @brief Number of bits per frame\r
69  */\r
70 typedef enum CHIP_SSP_BITS {\r
71         SSP_BITS_4 = (3u << 0),         /**< 4 bits/frame */\r
72         SSP_BITS_5 = (4u << 0),         /**< 5 bits/frame */\r
73         SSP_BITS_6 = (5u << 0),         /**< 6 bits/frame */\r
74         SSP_BITS_7 = (6u << 0),         /**< 7 bits/frame */\r
75         SSP_BITS_8 = (7u << 0),         /**< 8 bits/frame */\r
76         SSP_BITS_9 = (8u << 0),         /**< 9 bits/frame */\r
77         SSP_BITS_10 = (9u << 0),        /**< 10 bits/frame */\r
78         SSP_BITS_11 = (10u << 0),       /**< 11 bits/frame */\r
79         SSP_BITS_12 = (11u << 0),       /**< 12 bits/frame */\r
80         SSP_BITS_13 = (12u << 0),       /**< 13 bits/frame */\r
81         SSP_BITS_14 = (13u << 0),       /**< 14 bits/frame */\r
82         SSP_BITS_15 = (14u << 0),       /**< 15 bits/frame */\r
83         SSP_BITS_16 = (15u << 0),       /**< 16 bits/frame */\r
84 } CHIP_SSP_BITS_T;\r
85 \r
86 /*\r
87  * @brief SSP config format\r
88  */\r
89 typedef struct SSP_ConfigFormat {\r
90         CHIP_SSP_BITS_T bits;                           /**< Format config: bits/frame */\r
91         CHIP_SSP_CLOCK_MODE_T clockMode;/**< Format config: clock phase/polarity */\r
92         CHIP_SSP_FRAME_FORMAT_T frameFormat;/**< Format config: SPI/TI/Microwire */\r
93 } SSP_ConfigFormat;\r
94 \r
95 /*\r
96  * @brief SSP mode\r
97  */\r
98 typedef enum CHIP_SSP_MODE {\r
99         SSP_MODE_MASTER = (0 << 2),     /**< Master mode */\r
100         SSP_MODE_SLAVE = (1u << 2),     /**< Slave mode */\r
101 } CHIP_SSP_MODE_T;\r
102 \r
103 /*\r
104  * @brief SPI address\r
105  */\r
106 typedef struct {\r
107         uint8_t port;\r
108         uint8_t pin;\r
109 } SPI_Address_t;\r
110 \r
111 /*\r
112  * @brief SSP data setup structure\r
113  */\r
114 typedef struct {\r
115         void      *tx_data;     /**< Pointer to transmit data */\r
116         uint32_t  tx_cnt;       /**< Transmit counter */\r
117         void      *rx_data;     /**< Pointer to transmit data */\r
118         uint32_t  rx_cnt;       /**< Receive counter */\r
119         uint32_t  length;       /**< Length of transfer data */\r
120 } Chip_SSP_DATA_SETUP_T;\r
121 \r
122 /** SSP configuration parameter defines */\r
123 /** Clock phase control bit */\r
124 #define SSP_CPHA_FIRST          SSP_CR0_CPHA_FIRST\r
125 #define SSP_CPHA_SECOND         SSP_CR0_CPHA_SECOND\r
126 \r
127 /** Clock polarity control bit */\r
128 /* There's no bug here!!!\r
129  * - If bit[6] in SSPnCR0 is 0: SSP controller maintains the bus clock low between frames.\r
130  * That means the active clock is in HI state.\r
131  * - If bit[6] in SSPnCR0 is 1 (SSP_CR0_CPOL_HI): SSP controller maintains the bus clock\r
132  * high between frames. That means the active clock is in LO state.\r
133  */\r
134 #define SSP_CPOL_HI             SSP_CR0_CPOL_LO\r
135 #define SSP_CPOL_LO             SSP_CR0_CPOL_HI\r
136 \r
137 /** SSP master mode enable */\r
138 #define SSP_SLAVE_MODE          SSP_CR1_SLAVE_EN\r
139 #define SSP_MASTER_MODE         SSP_CR1_MASTER_EN\r
140 \r
141 /**\r
142  * @brief       Get the current status of SSP controller\r
143  * @param       pSSP    : The base of SSP peripheral on the chip\r
144  * @param       Stat    : Type of status, should be :\r
145  *                                              - SSP_STAT_TFE\r
146  *                                              - SSP_STAT_TNF\r
147  *                                              - SSP_STAT_RNE\r
148  *                                              - SSP_STAT_RFF\r
149  *                                              - SSP_STAT_BSY\r
150  * @return      SSP controller status, SET or RESET\r
151  */\r
152 STATIC INLINE FlagStatus Chip_SSP_GetStatus(LPC_SSP_T *pSSP, IP_SSP_STATUS_T Stat)\r
153 {\r
154         return IP_SSP_GetStatus(pSSP, Stat);\r
155 }\r
156 \r
157 /**\r
158  * @brief       Enable SSP operation\r
159  * @param       pSSP            : The base of SSP peripheral on the chip\r
160  * @return      Nothing\r
161  */\r
162 STATIC INLINE void Chip_SSP_Enable(LPC_SSP_T *pSSP)\r
163 {\r
164         IP_SSP_Enable(pSSP);\r
165 }\r
166 \r
167 /**\r
168  * @brief       Disable SSP operation\r
169  * @param       pSSP            : The base of SSP peripheral on the chip\r
170  * @return      Nothing\r
171  */\r
172 STATIC INLINE void Chip_SSP_Disable(LPC_SSP_T *pSSP)\r
173 {\r
174         IP_SSP_Disable(pSSP);\r
175 }\r
176 \r
177 /**\r
178  * @brief       Enable SSP DMA\r
179  * @param       pSSP            : The base of SSP peripheral on the chip\r
180  * @return      Nothing\r
181  */\r
182 STATIC INLINE void Chip_SSP_DMA_Enable(LPC_SSP_T *pSSP)\r
183 {\r
184         IP_SSP_DMA_Enable(pSSP, SSP_DMA_BITMASK);\r
185 }\r
186 \r
187 /**\r
188  * @brief       Disable SSP DMA\r
189  * @param       pSSP            : The base of SSP peripheral on the chip\r
190  * @return      Nothing\r
191  */\r
192 STATIC INLINE void Chip_SSP_DMA_Disable(LPC_SSP_T *pSSP)\r
193 {\r
194         IP_SSP_DMA_Disable(pSSP, SSP_DMA_BITMASK);\r
195 }\r
196 \r
197 /**\r
198  * @brief       Enable loopback mode\r
199  * @param       pSSP            : The base of SSP peripheral on the chip\r
200  * @return      Nothing\r
201  * @note        Serial input is taken from the serial output (MOSI or MISO) rather\r
202  * than the serial input pin\r
203  */\r
204 STATIC INLINE void Chip_SSP_EnableLoopBack(LPC_SSP_T *pSSP)\r
205 {\r
206         IP_SSP_EnableLoopBack(pSSP);\r
207 }\r
208 \r
209 /**\r
210  * @brief       Disable loopback mode\r
211  * @param       pSSP            : The base of SSP peripheral on the chip\r
212  * @return      Nothing\r
213  * @note        Serial input is taken from the serial output (MOSI or MISO) rather\r
214  * than the serial input pin\r
215  */\r
216 STATIC INLINE void Chip_SSP_DisableLoopBack(LPC_SSP_T *pSSP)\r
217 {\r
218         IP_SSP_DisableLoopBack(pSSP);\r
219 }\r
220 \r
221 /**\r
222  * @brief   Clean all data in RX FIFO of SSP\r
223  * @param       pSSP                    : The base SSP peripheral on the chip\r
224  * @return      Nothing\r
225  */\r
226 void Chip_SSP_Int_FlushData(LPC_SSP_T *pSSP);\r
227 \r
228 /**\r
229  * @brief   SSP Interrupt Read/Write with 8-bit frame width\r
230  * @param       pSSP                    : The base SSP peripheral on the chip\r
231  * @param       xf_setup                : Pointer to a SSP_DATA_SETUP_T structure that contains specified\r
232  *                          information about transmit/receive data     configuration\r
233  * @return      SUCCESS or ERROR\r
234  */\r
235 Status Chip_SSP_Int_RWFrames8Bits(LPC_SSP_T *pSSP, Chip_SSP_DATA_SETUP_T *xf_setup);\r
236 \r
237 /**\r
238  * @brief   SSP Interrupt Read/Write with 16-bit frame width\r
239  * @param       pSSP                    : The base SSP peripheral on the chip\r
240  * @param       xf_setup                : Pointer to a SSP_DATA_SETUP_T structure that contains specified\r
241  *                          information about transmit/receive data     configuration\r
242  * @return      SUCCESS or ERROR\r
243  */\r
244 Status Chip_SSP_Int_RWFrames16Bits(LPC_SSP_T *pSSP, Chip_SSP_DATA_SETUP_T *xf_setup);\r
245 \r
246 /**\r
247  * @brief   SSP Polling Read/Write in blocking mode\r
248  * @param       pSSP                    : The base SSP peripheral on the chip\r
249  * @param       xf_setup                : Pointer to a SSP_DATA_SETUP_T structure that contains specified\r
250  *                          information about transmit/receive data     configuration\r
251  * @return      Actual data length has been transferred\r
252  *\r
253  * This function can be used in both master and slave mode. It starts with writing phase and after that,\r
254  * a reading phase is generated to read any data available in RX_FIFO. All needed information is prepared\r
255  * through xf_setup param.\r
256  */\r
257 uint32_t Chip_SSP_RWFrames_Blocking(LPC_SSP_T *pSSP, Chip_SSP_DATA_SETUP_T *xf_setup);\r
258 \r
259 /**\r
260  * @brief   SSP Polling Write in blocking mode\r
261  * @param       pSSP                    : The base SSP peripheral on the chip\r
262  * @param       buffer                  : Buffer address\r
263  * @param       buffer_len              : Buffer length\r
264  * @return      Actual data length has been transferred\r
265  *\r
266  * This function can be used in both master and slave mode. First, a writing operation will send\r
267  * the needed data. After that, a dummy reading operation is generated to clear data buffer\r
268  */\r
269 uint32_t Chip_SSP_WriteFrames_Blocking(LPC_SSP_T *pSSP, uint8_t *buffer, uint32_t buffer_len);\r
270 \r
271 /**\r
272  * @brief   Note here\r
273  * @param       pSSP                    : The base SSP peripheral on the chip\r
274  * @param       buffer                  : Buffer address\r
275  * @param       buffer_len              : The length of buffer\r
276  * @return      Actual data length has been transferred\r
277  *\r
278  * This function can be used in both master and slave mode. First, a dummy writing operation is generated\r
279  * to clear data buffer. After that, a reading operation will receive the needed data\r
280  */\r
281 uint32_t Chip_SSP_ReadFrames_Blocking(LPC_SSP_T *pSSP, uint8_t *buffer, uint32_t buffer_len);\r
282 \r
283 /**\r
284  * @brief   Initialize the SSP\r
285  * @param       pSSP                    : The base SSP peripheral on the chip\r
286  * @return      Nothing\r
287  */\r
288 void Chip_SSP_Init(LPC_SSP_T *pSSP);\r
289 \r
290 /**\r
291  * @brief   Shutdown the SSP\r
292  * @param       pSSP    : The base SSP peripheral on the chip\r
293  * @return      Nothing\r
294  */\r
295 void Chip_SSP_DeInit(LPC_SSP_T *pSSP);\r
296 \r
297 /**\r
298  * @brief   Set the SSP operating modes, master or slave\r
299  * @param       pSSP                    : The base SSP peripheral on the chip\r
300  * @param       master                  : 1 to set master, 0 to set slave\r
301  * @return      Nothing\r
302  */\r
303 void Chip_SSP_SetMaster(LPC_SSP_T *pSSP, bool master);\r
304 \r
305 /**\r
306  * @brief   Set the clock frequency for SSP interface\r
307  * @param       pSSP                    : The base SSP peripheral on the chip\r
308  * @param       bitRate         : The SSP bit rate\r
309  * @return      Nothing\r
310  */\r
311 void Chip_SSP_SetBitRate(LPC_SSP_T *pSSP, uint32_t bitRate);\r
312 \r
313 /**\r
314  * @brief   Set up the SSP frame format\r
315  * @param       pSSP                    : The base SSP peripheral on the chip\r
316  * @param       format                  : Structure used to format frame\r
317  * @return      Nothing\r
318  */\r
319 STATIC INLINE void Chip_SSP_SetFormat(LPC_SSP_T *pSSP, SSP_ConfigFormat *format)\r
320 {\r
321         IP_SSP_SetFormat(pSSP, format->bits, format->frameFormat, format->clockMode);\r
322 }\r
323 \r
324 /**\r
325  * @brief   Enable SSP interrupt\r
326  * @param       pSSP                    : The base SSP peripheral on the chip\r
327  * @return      Nothing\r
328  */\r
329 STATIC INLINE void Chip_SSP_Int_Enable(LPC_SSP_T *pSSP)\r
330 {\r
331         IP_SSP_Int_Enable(pSSP, SSP_TXIM);\r
332 }\r
333 \r
334 /**\r
335  * @brief   Disable SSP interrupt\r
336  * @param       pSSP                    : The base SSP peripheral on the chip\r
337  * @return      Nothing\r
338  */\r
339 STATIC INLINE void Chip_SSP_Int_Disable(LPC_SSP_T *pSSP)\r
340 {\r
341         IP_SSP_Int_Disable(pSSP, SSP_TXIM);\r
342 }\r
343 \r
344 /**\r
345  * @}\r
346  */\r
347 \r
348 #ifdef __cplusplus\r
349 }\r
350 #endif\r
351 \r
352 #endif /* __SSP_18XX_43XX_H_ */\r