]> jspc29.x-matter.uni-frankfurt.de Git - mvd_firmware.git/blob
d1870cef153ff7cfcdb3ad7d9d5dd19481153c8b
[mvd_firmware.git] /
1 /**\r
2   ******************************************************************************\r
3   * @file    stm32f10x_sdio.c\r
4   * @author  MCD Application Team\r
5   * @version V3.5.0\r
6   * @date    11-March-2011\r
7   * @brief   This file provides all the SDIO firmware functions.\r
8   ******************************************************************************\r
9   * @attention\r
10   *\r
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
17   *\r
18   * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>\r
19   ******************************************************************************\r
20   */\r
21 \r
22 /* Includes ------------------------------------------------------------------*/\r
23 #include "stm32f10x_sdio.h"\r
24 #include "stm32f10x_rcc.h"\r
25 \r
26 /** @addtogroup STM32F10x_StdPeriph_Driver\r
27   * @{\r
28   */\r
29 \r
30 /** @defgroup SDIO \r
31   * @brief SDIO driver modules\r
32   * @{\r
33   */ \r
34 \r
35 /** @defgroup SDIO_Private_TypesDefinitions\r
36   * @{\r
37   */ \r
38 \r
39 /* ------------ SDIO registers bit address in the alias region ----------- */\r
40 #define SDIO_OFFSET                (SDIO_BASE - PERIPH_BASE)\r
41 \r
42 /* --- CLKCR Register ---*/\r
43 \r
44 /* Alias word address of CLKEN bit */\r
45 #define CLKCR_OFFSET              (SDIO_OFFSET + 0x04)\r
46 #define CLKEN_BitNumber           0x08\r
47 #define CLKCR_CLKEN_BB            (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4))\r
48 \r
49 /* --- CMD Register ---*/\r
50 \r
51 /* Alias word address of SDIOSUSPEND bit */\r
52 #define CMD_OFFSET                (SDIO_OFFSET + 0x0C)\r
53 #define SDIOSUSPEND_BitNumber     0x0B\r
54 #define CMD_SDIOSUSPEND_BB        (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4))\r
55 \r
56 /* Alias word address of ENCMDCOMPL bit */\r
57 #define ENCMDCOMPL_BitNumber      0x0C\r
58 #define CMD_ENCMDCOMPL_BB         (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4))\r
59 \r
60 /* Alias word address of NIEN bit */\r
61 #define NIEN_BitNumber            0x0D\r
62 #define CMD_NIEN_BB               (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4))\r
63 \r
64 /* Alias word address of ATACMD bit */\r
65 #define ATACMD_BitNumber          0x0E\r
66 #define CMD_ATACMD_BB             (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))\r
67 \r
68 /* --- DCTRL Register ---*/\r
69 \r
70 /* Alias word address of DMAEN bit */\r
71 #define DCTRL_OFFSET              (SDIO_OFFSET + 0x2C)\r
72 #define DMAEN_BitNumber           0x03\r
73 #define DCTRL_DMAEN_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))\r
74 \r
75 /* Alias word address of RWSTART bit */\r
76 #define RWSTART_BitNumber         0x08\r
77 #define DCTRL_RWSTART_BB          (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4))\r
78 \r
79 /* Alias word address of RWSTOP bit */\r
80 #define RWSTOP_BitNumber          0x09\r
81 #define DCTRL_RWSTOP_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))\r
82 \r
83 /* Alias word address of RWMOD bit */\r
84 #define RWMOD_BitNumber           0x0A\r
85 #define DCTRL_RWMOD_BB            (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4))\r
86 \r
87 /* Alias word address of SDIOEN bit */\r
88 #define SDIOEN_BitNumber          0x0B\r
89 #define DCTRL_SDIOEN_BB           (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4))\r
90 \r
91 /* ---------------------- SDIO registers bit mask ------------------------ */\r
92 \r
93 /* --- CLKCR Register ---*/\r
94 \r
95 /* CLKCR register clear mask */\r
96 #define CLKCR_CLEAR_MASK         ((uint32_t)0xFFFF8100) \r
97 \r
98 /* --- PWRCTRL Register ---*/\r
99 \r
100 /* SDIO PWRCTRL Mask */\r
101 #define PWR_PWRCTRL_MASK         ((uint32_t)0xFFFFFFFC)\r
102 \r
103 /* --- DCTRL Register ---*/\r
104 \r
105 /* SDIO DCTRL Clear Mask */\r
106 #define DCTRL_CLEAR_MASK         ((uint32_t)0xFFFFFF08)\r
107 \r
108 /* --- CMD Register ---*/\r
109 \r
110 /* CMD Register clear mask */\r
111 #define CMD_CLEAR_MASK           ((uint32_t)0xFFFFF800)\r
112 \r
113 /* SDIO RESP Registers Address */\r
114 #define SDIO_RESP_ADDR           ((uint32_t)(SDIO_BASE + 0x14))\r
115 \r
116 /**\r
117   * @}\r
118   */\r
119 \r
120 /** @defgroup SDIO_Private_Defines\r
121   * @{\r
122   */\r
123 \r
124 /**\r
125   * @}\r
126   */\r
127 \r
128 /** @defgroup SDIO_Private_Macros\r
129   * @{\r
130   */\r
131 \r
132 /**\r
133   * @}\r
134   */\r
135 \r
136 /** @defgroup SDIO_Private_Variables\r
137   * @{\r
138   */\r
139 \r
140 /**\r
141   * @}\r
142   */\r
143 \r
144 /** @defgroup SDIO_Private_FunctionPrototypes\r
145   * @{\r
146   */\r
147 \r
148 /**\r
149   * @}\r
150   */\r
151 \r
152 /** @defgroup SDIO_Private_Functions\r
153   * @{\r
154   */\r
155 \r
156 /**\r
157   * @brief  Deinitializes the SDIO peripheral registers to their default reset values.\r
158   * @param  None\r
159   * @retval None\r
160   */\r
161 void SDIO_DeInit(void)\r
162 {\r
163   SDIO->POWER = 0x00000000;\r
164   SDIO->CLKCR = 0x00000000;\r
165   SDIO->ARG = 0x00000000;\r
166   SDIO->CMD = 0x00000000;\r
167   SDIO->DTIMER = 0x00000000;\r
168   SDIO->DLEN = 0x00000000;\r
169   SDIO->DCTRL = 0x00000000;\r
170   SDIO->ICR = 0x00C007FF;\r
171   SDIO->MASK = 0x00000000;\r
172 }\r
173 \r
174 /**\r
175   * @brief  Initializes the SDIO peripheral according to the specified \r
176   *         parameters in the SDIO_InitStruct.\r
177   * @param  SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure \r
178   *         that contains the configuration information for the SDIO peripheral.\r
179   * @retval None\r
180   */\r
181 void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)\r
182 {\r
183   uint32_t tmpreg = 0;\r
184     \r
185   /* Check the parameters */\r
186   assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));\r
187   assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));\r
188   assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));\r
189   assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));\r
190   assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); \r
191    \r
192 /*---------------------------- SDIO CLKCR Configuration ------------------------*/  \r
193   /* Get the SDIO CLKCR value */\r
194   tmpreg = SDIO->CLKCR;\r
195   \r
196   /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */\r
197   tmpreg &= CLKCR_CLEAR_MASK;\r
198   \r
199   /* Set CLKDIV bits according to SDIO_ClockDiv value */\r
200   /* Set PWRSAV bit according to SDIO_ClockPowerSave value */\r
201   /* Set BYPASS bit according to SDIO_ClockBypass value */\r
202   /* Set WIDBUS bits according to SDIO_BusWide value */\r
203   /* Set NEGEDGE bits according to SDIO_ClockEdge value */\r
204   /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */\r
205   tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv  | SDIO_InitStruct->SDIO_ClockPowerSave |\r
206              SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |\r
207              SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); \r
208   \r
209   /* Write to SDIO CLKCR */\r
210   SDIO->CLKCR = tmpreg;\r
211 }\r
212 \r
213 /**\r
214   * @brief  Fills each SDIO_InitStruct member with its default value.\r
215   * @param  SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which \r
216   *   will be initialized.\r
217   * @retval None\r
218   */\r
219 void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)\r
220 {\r
221   /* SDIO_InitStruct members default value */\r
222   SDIO_InitStruct->SDIO_ClockDiv = 0x00;\r
223   SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising;\r
224   SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable;\r
225   SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;\r
226   SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b;\r
227   SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;\r
228 }\r
229 \r
230 /**\r
231   * @brief  Enables or disables the SDIO Clock.\r
232   * @param  NewState: new state of the SDIO Clock. This parameter can be: ENABLE or DISABLE.\r
233   * @retval None\r
234   */\r
235 void SDIO_ClockCmd(FunctionalState NewState)\r
236 {\r
237   /* Check the parameters */\r
238   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
239   \r
240   *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState;\r
241 }\r
242 \r
243 /**\r
244   * @brief  Sets the power status of the controller.\r
245   * @param  SDIO_PowerState: new state of the Power state. \r
246   *   This parameter can be one of the following values:\r
247   *     @arg SDIO_PowerState_OFF\r
248   *     @arg SDIO_PowerState_ON\r
249   * @retval None\r
250   */\r
251 void SDIO_SetPowerState(uint32_t SDIO_PowerState)\r
252 {\r
253   /* Check the parameters */\r
254   assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));\r
255   \r
256   SDIO->POWER &= PWR_PWRCTRL_MASK;\r
257   SDIO->POWER |= SDIO_PowerState;\r
258 }\r
259 \r
260 /**\r
261   * @brief  Gets the power status of the controller.\r
262   * @param  None\r
263   * @retval Power status of the controller. The returned value can\r
264   *   be one of the following:\r
265   * - 0x00: Power OFF\r
266   * - 0x02: Power UP\r
267   * - 0x03: Power ON \r
268   */\r
269 uint32_t SDIO_GetPowerState(void)\r
270 {\r
271   return (SDIO->POWER & (~PWR_PWRCTRL_MASK));\r
272 }\r
273 \r
274 /**\r
275   * @brief  Enables or disables the SDIO interrupts.\r
276   * @param  SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled.\r
277   *   This parameter can be one or a combination of the following values:\r
278   *     @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
279   *     @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
280   *     @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
281   *     @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
282   *     @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
283   *     @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
284   *     @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
285   *     @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
286   *     @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
287   *     @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
288   *                            bus mode interrupt\r
289   *     @arg SDIO_IT_DBCKEND:  Data block sent/received (CRC check passed) interrupt\r
290   *     @arg SDIO_IT_CMDACT:   Command transfer in progress interrupt\r
291   *     @arg SDIO_IT_TXACT:    Data transmit in progress interrupt\r
292   *     @arg SDIO_IT_RXACT:    Data receive in progress interrupt\r
293   *     @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt\r
294   *     @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt\r
295   *     @arg SDIO_IT_TXFIFOF:  Transmit FIFO full interrupt\r
296   *     @arg SDIO_IT_RXFIFOF:  Receive FIFO full interrupt\r
297   *     @arg SDIO_IT_TXFIFOE:  Transmit FIFO empty interrupt\r
298   *     @arg SDIO_IT_RXFIFOE:  Receive FIFO empty interrupt\r
299   *     @arg SDIO_IT_TXDAVL:   Data available in transmit FIFO interrupt\r
300   *     @arg SDIO_IT_RXDAVL:   Data available in receive FIFO interrupt\r
301   *     @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
302   *     @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt\r
303   * @param  NewState: new state of the specified SDIO interrupts.\r
304   *   This parameter can be: ENABLE or DISABLE.\r
305   * @retval None \r
306   */\r
307 void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState)\r
308 {\r
309   /* Check the parameters */\r
310   assert_param(IS_SDIO_IT(SDIO_IT));\r
311   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
312   \r
313   if (NewState != DISABLE)\r
314   {\r
315     /* Enable the SDIO interrupts */\r
316     SDIO->MASK |= SDIO_IT;\r
317   }\r
318   else\r
319   {\r
320     /* Disable the SDIO interrupts */\r
321     SDIO->MASK &= ~SDIO_IT;\r
322   } \r
323 }\r
324 \r
325 /**\r
326   * @brief  Enables or disables the SDIO DMA request.\r
327   * @param  NewState: new state of the selected SDIO DMA request.\r
328   *   This parameter can be: ENABLE or DISABLE.\r
329   * @retval None\r
330   */\r
331 void SDIO_DMACmd(FunctionalState NewState)\r
332 {\r
333   /* Check the parameters */\r
334   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
335   \r
336   *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState;\r
337 }\r
338 \r
339 /**\r
340   * @brief  Initializes the SDIO Command according to the specified \r
341   *         parameters in the SDIO_CmdInitStruct and send the command.\r
342   * @param  SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef \r
343   *         structure that contains the configuration information for the SDIO command.\r
344   * @retval None\r
345   */\r
346 void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)\r
347 {\r
348   uint32_t tmpreg = 0;\r
349   \r
350   /* Check the parameters */\r
351   assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex));\r
352   assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response));\r
353   assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));\r
354   assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));\r
355   \r
356 /*---------------------------- SDIO ARG Configuration ------------------------*/\r
357   /* Set the SDIO Argument value */\r
358   SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;\r
359   \r
360 /*---------------------------- SDIO CMD Configuration ------------------------*/  \r
361   /* Get the SDIO CMD value */\r
362   tmpreg = SDIO->CMD;\r
363   /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */\r
364   tmpreg &= CMD_CLEAR_MASK;\r
365   /* Set CMDINDEX bits according to SDIO_CmdIndex value */\r
366   /* Set WAITRESP bits according to SDIO_Response value */\r
367   /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */\r
368   /* Set CPSMEN bits according to SDIO_CPSM value */\r
369   tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response\r
370            | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;\r
371   \r
372   /* Write to SDIO CMD */\r
373   SDIO->CMD = tmpreg;\r
374 }\r
375 \r
376 /**\r
377   * @brief  Fills each SDIO_CmdInitStruct member with its default value.\r
378   * @param  SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef \r
379   *         structure which will be initialized.\r
380   * @retval None\r
381   */\r
382 void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)\r
383 {\r
384   /* SDIO_CmdInitStruct members default value */\r
385   SDIO_CmdInitStruct->SDIO_Argument = 0x00;\r
386   SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00;\r
387   SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No;\r
388   SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No;\r
389   SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable;\r
390 }\r
391 \r
392 /**\r
393   * @brief  Returns command index of last command for which response received.\r
394   * @param  None\r
395   * @retval Returns the command index of the last command response received.\r
396   */\r
397 uint8_t SDIO_GetCommandResponse(void)\r
398 {\r
399   return (uint8_t)(SDIO->RESPCMD);\r
400 }\r
401 \r
402 /**\r
403   * @brief  Returns response received from the card for the last command.\r
404   * @param  SDIO_RESP: Specifies the SDIO response register. \r
405   *   This parameter can be one of the following values:\r
406   *     @arg SDIO_RESP1: Response Register 1\r
407   *     @arg SDIO_RESP2: Response Register 2\r
408   *     @arg SDIO_RESP3: Response Register 3\r
409   *     @arg SDIO_RESP4: Response Register 4\r
410   * @retval The Corresponding response register value.\r
411   */\r
412 uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)\r
413 {\r
414   __IO uint32_t tmp = 0;\r
415 \r
416   /* Check the parameters */\r
417   assert_param(IS_SDIO_RESP(SDIO_RESP));\r
418 \r
419   tmp = SDIO_RESP_ADDR + SDIO_RESP;\r
420   \r
421   return (*(__IO uint32_t *) tmp); \r
422 }\r
423 \r
424 /**\r
425   * @brief  Initializes the SDIO data path according to the specified \r
426   *   parameters in the SDIO_DataInitStruct.\r
427   * @param  SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure that\r
428   *   contains the configuration information for the SDIO command.\r
429   * @retval None\r
430   */\r
431 void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)\r
432 {\r
433   uint32_t tmpreg = 0;\r
434   \r
435   /* Check the parameters */\r
436   assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength));\r
437   assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize));\r
438   assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir));\r
439   assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode));\r
440   assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));\r
441 \r
442 /*---------------------------- SDIO DTIMER Configuration ---------------------*/\r
443   /* Set the SDIO Data TimeOut value */\r
444   SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;\r
445 \r
446 /*---------------------------- SDIO DLEN Configuration -----------------------*/\r
447   /* Set the SDIO DataLength value */\r
448   SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;\r
449 \r
450 /*---------------------------- SDIO DCTRL Configuration ----------------------*/  \r
451   /* Get the SDIO DCTRL value */\r
452   tmpreg = SDIO->DCTRL;\r
453   /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */\r
454   tmpreg &= DCTRL_CLEAR_MASK;\r
455   /* Set DEN bit according to SDIO_DPSM value */\r
456   /* Set DTMODE bit according to SDIO_TransferMode value */\r
457   /* Set DTDIR bit according to SDIO_TransferDir value */\r
458   /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */\r
459   tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir\r
460            | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;\r
461 \r
462   /* Write to SDIO DCTRL */\r
463   SDIO->DCTRL = tmpreg;\r
464 }\r
465 \r
466 /**\r
467   * @brief  Fills each SDIO_DataInitStruct member with its default value.\r
468   * @param  SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure which\r
469   *         will be initialized.\r
470   * @retval None\r
471   */\r
472 void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)\r
473 {\r
474   /* SDIO_DataInitStruct members default value */\r
475   SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF;\r
476   SDIO_DataInitStruct->SDIO_DataLength = 0x00;\r
477   SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b;\r
478   SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard;\r
479   SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block;  \r
480   SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable;\r
481 }\r
482 \r
483 /**\r
484   * @brief  Returns number of remaining data bytes to be transferred.\r
485   * @param  None\r
486   * @retval Number of remaining data bytes to be transferred\r
487   */\r
488 uint32_t SDIO_GetDataCounter(void)\r
489\r
490   return SDIO->DCOUNT;\r
491 }\r
492 \r
493 /**\r
494   * @brief  Read one data word from Rx FIFO.\r
495   * @param  None\r
496   * @retval Data received\r
497   */\r
498 uint32_t SDIO_ReadData(void)\r
499\r
500   return SDIO->FIFO;\r
501 }\r
502 \r
503 /**\r
504   * @brief  Write one data word to Tx FIFO.\r
505   * @param  Data: 32-bit data word to write.\r
506   * @retval None\r
507   */\r
508 void SDIO_WriteData(uint32_t Data)\r
509\r
510   SDIO->FIFO = Data;\r
511 }\r
512 \r
513 /**\r
514   * @brief  Returns the number of words left to be written to or read from FIFO.        \r
515   * @param  None\r
516   * @retval Remaining number of words.\r
517   */\r
518 uint32_t SDIO_GetFIFOCount(void)\r
519\r
520   return SDIO->FIFOCNT;\r
521 }\r
522 \r
523 /**\r
524   * @brief  Starts the SD I/O Read Wait operation.      \r
525   * @param  NewState: new state of the Start SDIO Read Wait operation. \r
526   *   This parameter can be: ENABLE or DISABLE.\r
527   * @retval None\r
528   */\r
529 void SDIO_StartSDIOReadWait(FunctionalState NewState)\r
530\r
531   /* Check the parameters */\r
532   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
533   \r
534   *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState;\r
535 }\r
536 \r
537 /**\r
538   * @brief  Stops the SD I/O Read Wait operation.       \r
539   * @param  NewState: new state of the Stop SDIO Read Wait operation. \r
540   *   This parameter can be: ENABLE or DISABLE.\r
541   * @retval None\r
542   */\r
543 void SDIO_StopSDIOReadWait(FunctionalState NewState)\r
544\r
545   /* Check the parameters */\r
546   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
547   \r
548   *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState;\r
549 }\r
550 \r
551 /**\r
552   * @brief  Sets one of the two options of inserting read wait interval.\r
553   * @param  SDIO_ReadWaitMode: SD I/O Read Wait operation mode.\r
554   *   This parameter can be:\r
555   *     @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK\r
556   *     @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2\r
557   * @retval None\r
558   */\r
559 void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)\r
560 {\r
561   /* Check the parameters */\r
562   assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode));\r
563   \r
564   *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode;\r
565 }\r
566 \r
567 /**\r
568   * @brief  Enables or disables the SD I/O Mode Operation.\r
569   * @param  NewState: new state of SDIO specific operation. \r
570   *   This parameter can be: ENABLE or DISABLE.\r
571   * @retval None\r
572   */\r
573 void SDIO_SetSDIOOperation(FunctionalState NewState)\r
574\r
575   /* Check the parameters */\r
576   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
577   \r
578   *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState;\r
579 }\r
580 \r
581 /**\r
582   * @brief  Enables or disables the SD I/O Mode suspend command sending.\r
583   * @param  NewState: new state of the SD I/O Mode suspend command.\r
584   *   This parameter can be: ENABLE or DISABLE.\r
585   * @retval None\r
586   */\r
587 void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)\r
588\r
589   /* Check the parameters */\r
590   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
591   \r
592   *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState;\r
593 }\r
594 \r
595 /**\r
596   * @brief  Enables or disables the command completion signal.\r
597   * @param  NewState: new state of command completion signal. \r
598   *   This parameter can be: ENABLE or DISABLE.\r
599   * @retval None\r
600   */\r
601 void SDIO_CommandCompletionCmd(FunctionalState NewState)\r
602\r
603   /* Check the parameters */\r
604   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
605   \r
606   *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState;\r
607 }\r
608 \r
609 /**\r
610   * @brief  Enables or disables the CE-ATA interrupt.\r
611   * @param  NewState: new state of CE-ATA interrupt. This parameter can be: ENABLE or DISABLE.\r
612   * @retval None\r
613   */\r
614 void SDIO_CEATAITCmd(FunctionalState NewState)\r
615\r
616   /* Check the parameters */\r
617   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
618   \r
619   *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1));\r
620 }\r
621 \r
622 /**\r
623   * @brief  Sends CE-ATA command (CMD61).\r
624   * @param  NewState: new state of CE-ATA command. This parameter can be: ENABLE or DISABLE.\r
625   * @retval None\r
626   */\r
627 void SDIO_SendCEATACmd(FunctionalState NewState)\r
628\r
629   /* Check the parameters */\r
630   assert_param(IS_FUNCTIONAL_STATE(NewState));\r
631   \r
632   *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState;\r
633 }\r
634 \r
635 /**\r
636   * @brief  Checks whether the specified SDIO flag is set or not.\r
637   * @param  SDIO_FLAG: specifies the flag to check. \r
638   *   This parameter can be one of the following values:\r
639   *     @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)\r
640   *     @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)\r
641   *     @arg SDIO_FLAG_CTIMEOUT: Command response timeout\r
642   *     @arg SDIO_FLAG_DTIMEOUT: Data timeout\r
643   *     @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error\r
644   *     @arg SDIO_FLAG_RXOVERR:  Received FIFO overrun error\r
645   *     @arg SDIO_FLAG_CMDREND:  Command response received (CRC check passed)\r
646   *     @arg SDIO_FLAG_CMDSENT:  Command sent (no response required)\r
647   *     @arg SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)\r
648   *     @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide \r
649   *                              bus mode.\r
650   *     @arg SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)\r
651   *     @arg SDIO_FLAG_CMDACT:   Command transfer in progress\r
652   *     @arg SDIO_FLAG_TXACT:    Data transmit in progress\r
653   *     @arg SDIO_FLAG_RXACT:    Data receive in progress\r
654   *     @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty\r
655   *     @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full\r
656   *     @arg SDIO_FLAG_TXFIFOF:  Transmit FIFO full\r
657   *     @arg SDIO_FLAG_RXFIFOF:  Receive FIFO full\r
658   *     @arg SDIO_FLAG_TXFIFOE:  Transmit FIFO empty\r
659   *     @arg SDIO_FLAG_RXFIFOE:  Receive FIFO empty\r
660   *     @arg SDIO_FLAG_TXDAVL:   Data available in transmit FIFO\r
661   *     @arg SDIO_FLAG_RXDAVL:   Data available in receive FIFO\r
662   *     @arg SDIO_FLAG_SDIOIT:   SD I/O interrupt received\r
663   *     @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61\r
664   * @retval The new state of SDIO_FLAG (SET or RESET).\r
665   */\r
666 FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG)\r
667\r
668   FlagStatus bitstatus = RESET;\r
669   \r
670   /* Check the parameters */\r
671   assert_param(IS_SDIO_FLAG(SDIO_FLAG));\r
672   \r
673   if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET)\r
674   {\r
675     bitstatus = SET;\r
676   }\r
677   else\r
678   {\r
679     bitstatus = RESET;\r
680   }\r
681   return bitstatus;\r
682 }\r
683 \r
684 /**\r
685   * @brief  Clears the SDIO's pending flags.\r
686   * @param  SDIO_FLAG: specifies the flag to clear.  \r
687   *   This parameter can be one or a combination of the following values:\r
688   *     @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed)\r
689   *     @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed)\r
690   *     @arg SDIO_FLAG_CTIMEOUT: Command response timeout\r
691   *     @arg SDIO_FLAG_DTIMEOUT: Data timeout\r
692   *     @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error\r
693   *     @arg SDIO_FLAG_RXOVERR:  Received FIFO overrun error\r
694   *     @arg SDIO_FLAG_CMDREND:  Command response received (CRC check passed)\r
695   *     @arg SDIO_FLAG_CMDSENT:  Command sent (no response required)\r
696   *     @arg SDIO_FLAG_DATAEND:  Data end (data counter, SDIDCOUNT, is zero)\r
697   *     @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide \r
698   *                              bus mode\r
699   *     @arg SDIO_FLAG_DBCKEND:  Data block sent/received (CRC check passed)\r
700   *     @arg SDIO_FLAG_SDIOIT:   SD I/O interrupt received\r
701   *     @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61\r
702   * @retval None\r
703   */\r
704 void SDIO_ClearFlag(uint32_t SDIO_FLAG)\r
705\r
706   /* Check the parameters */\r
707   assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));\r
708    \r
709   SDIO->ICR = SDIO_FLAG;\r
710 }\r
711 \r
712 /**\r
713   * @brief  Checks whether the specified SDIO interrupt has occurred or not.\r
714   * @param  SDIO_IT: specifies the SDIO interrupt source to check. \r
715   *   This parameter can be one of the following values:\r
716   *     @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
717   *     @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
718   *     @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
719   *     @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
720   *     @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
721   *     @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
722   *     @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
723   *     @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
724   *     @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
725   *     @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
726   *                            bus mode interrupt\r
727   *     @arg SDIO_IT_DBCKEND:  Data block sent/received (CRC check passed) interrupt\r
728   *     @arg SDIO_IT_CMDACT:   Command transfer in progress interrupt\r
729   *     @arg SDIO_IT_TXACT:    Data transmit in progress interrupt\r
730   *     @arg SDIO_IT_RXACT:    Data receive in progress interrupt\r
731   *     @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt\r
732   *     @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt\r
733   *     @arg SDIO_IT_TXFIFOF:  Transmit FIFO full interrupt\r
734   *     @arg SDIO_IT_RXFIFOF:  Receive FIFO full interrupt\r
735   *     @arg SDIO_IT_TXFIFOE:  Transmit FIFO empty interrupt\r
736   *     @arg SDIO_IT_RXFIFOE:  Receive FIFO empty interrupt\r
737   *     @arg SDIO_IT_TXDAVL:   Data available in transmit FIFO interrupt\r
738   *     @arg SDIO_IT_RXDAVL:   Data available in receive FIFO interrupt\r
739   *     @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
740   *     @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt\r
741   * @retval The new state of SDIO_IT (SET or RESET).\r
742   */\r
743 ITStatus SDIO_GetITStatus(uint32_t SDIO_IT)\r
744\r
745   ITStatus bitstatus = RESET;\r
746   \r
747   /* Check the parameters */\r
748   assert_param(IS_SDIO_GET_IT(SDIO_IT));\r
749   if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET)  \r
750   {\r
751     bitstatus = SET;\r
752   }\r
753   else\r
754   {\r
755     bitstatus = RESET;\r
756   }\r
757   return bitstatus;\r
758 }\r
759 \r
760 /**\r
761   * @brief  Clears the SDIO's interrupt pending bits.\r
762   * @param  SDIO_IT: specifies the interrupt pending bit to clear. \r
763   *   This parameter can be one or a combination of the following values:\r
764   *     @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt\r
765   *     @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt\r
766   *     @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt\r
767   *     @arg SDIO_IT_DTIMEOUT: Data timeout interrupt\r
768   *     @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt\r
769   *     @arg SDIO_IT_RXOVERR:  Received FIFO overrun error interrupt\r
770   *     @arg SDIO_IT_CMDREND:  Command response received (CRC check passed) interrupt\r
771   *     @arg SDIO_IT_CMDSENT:  Command sent (no response required) interrupt\r
772   *     @arg SDIO_IT_DATAEND:  Data end (data counter, SDIDCOUNT, is zero) interrupt\r
773   *     @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide \r
774   *                            bus mode interrupt\r
775   *     @arg SDIO_IT_SDIOIT:   SD I/O interrupt received interrupt\r
776   *     @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61\r
777   * @retval None\r
778   */\r
779 void SDIO_ClearITPendingBit(uint32_t SDIO_IT)\r
780\r
781   /* Check the parameters */\r
782   assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));\r
783    \r
784   SDIO->ICR = SDIO_IT;\r
785 }\r
786 \r
787 /**\r
788   * @}\r
789   */\r
790 \r
791 /**\r
792   * @}\r
793   */\r
794 \r
795 /**\r
796   * @}\r
797   */\r
798 \r
799 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/\r