stm32f10x_sdio.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:38k
源码类别:

uCOS

开发平台:

C/C++

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