sdio.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. ******************************************************************************
  3. * File Name : SDIO.c
  4. * Description : This file provides code for the configuration
  5. * of the SDIO instances.
  6. ******************************************************************************
  7. *
  8. * COPYRIGHT(c) 2016 STMicroelectronics
  9. *
  10. * Redistribution and use in source and binary forms, with or without modification,
  11. * are permitted provided that the following conditions are met:
  12. * 1. Redistributions of source code must retain the above copyright notice,
  13. * this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright notice,
  15. * this list of conditions and the following disclaimer in the documentation
  16. * and/or other materials provided with the distribution.
  17. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  24. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  27. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  29. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. ******************************************************************************
  33. */
  34. /* Includes ------------------------------------------------------------------*/
  35. #include "sdio.h"
  36. #include "gpio.h"
  37. /* USER CODE BEGIN 0 */
  38. /* USER CODE END 0 */
  39. SD_HandleTypeDef hsd;
  40. HAL_SD_CardInfoTypedef SDCardInfo;
  41. DMA_HandleTypeDef hdma_sdio_tx;
  42. DMA_HandleTypeDef hdma_sdio_rx;
  43. /* SDIO init function */
  44. void MX_SDIO_SD_Init(void)
  45. {
  46. hsd.Instance = SDIO;
  47. hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  48. hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  49. hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  50. hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  51. hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  52. hsd.Init.ClockDiv = 0;
  53. }
  54. void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
  55. {
  56. GPIO_InitTypeDef GPIO_InitStruct;
  57. if(hsd->Instance==SDIO)
  58. {
  59. /* USER CODE BEGIN SDIO_MspInit 0 */
  60. /* USER CODE END SDIO_MspInit 0 */
  61. /* Peripheral clock enable */
  62. __SDIO_CLK_ENABLE();
  63. /**SDIO GPIO Configuration
  64. PC8 ------> SDIO_D0
  65. PC9 ------> SDIO_D1
  66. PC10 ------> SDIO_D2
  67. PC11 ------> SDIO_D3
  68. PC12 ------> SDIO_CK
  69. PD2 ------> SDIO_CMD
  70. */
  71. GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
  72. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  73. GPIO_InitStruct.Pull = GPIO_PULLUP; // MM
  74. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  75. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  76. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  77. // No pullup on CLK
  78. GPIO_InitStruct.Pin = GPIO_PIN_12;
  79. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  80. GPIO_InitStruct.Pull = GPIO_NOPULL;
  81. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  82. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  83. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  84. GPIO_InitStruct.Pin = GPIO_PIN_2;
  85. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  86. GPIO_InitStruct.Pull = GPIO_PULLUP; // MM
  87. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  88. GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
  89. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  90. /* Peripheral DMA init*/
  91. hdma_sdio_tx.Instance = DMA2_Stream3;
  92. hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;
  93. hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  94. hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  95. hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;
  96. hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  97. hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  98. hdma_sdio_tx.Init.Mode = DMA_PFCTRL; // TODO MM. This is necessary or SDIO doesn't work
  99. hdma_sdio_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH; // TODO MM Prevent underruns
  100. hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  101. hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  102. hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;
  103. hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  104. HAL_DMA_Init(&hdma_sdio_tx);
  105. __HAL_LINKDMA(hsd,hdmatx,hdma_sdio_tx);
  106. hdma_sdio_rx.Instance = DMA2_Stream6;
  107. hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;
  108. hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  109. hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  110. hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;
  111. hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  112. hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  113. hdma_sdio_rx.Init.Mode = DMA_PFCTRL; // TODO MM. This is necessary or SDIO doesn't work
  114. hdma_sdio_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; // TODO MM Prevent underruns
  115. hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  116. hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  117. hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;
  118. hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;
  119. HAL_DMA_Init(&hdma_sdio_rx);
  120. __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
  121. /* Peripheral interrupt init*/
  122. HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
  123. HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
  124. HAL_NVIC_EnableIRQ(SDIO_IRQn);
  125. /* USER CODE BEGIN SDIO_MspInit 1 */
  126. /* USER CODE END SDIO_MspInit 1 */
  127. }
  128. }
  129. void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd)
  130. {
  131. if(hsd->Instance==SDIO)
  132. {
  133. /* USER CODE BEGIN SDIO_MspDeInit 0 */
  134. /* USER CODE END SDIO_MspDeInit 0 */
  135. /* Peripheral clock disable */
  136. __SDIO_CLK_DISABLE();
  137. /**SDIO GPIO Configuration
  138. PC8 ------> SDIO_D0
  139. PC9 ------> SDIO_D1
  140. PC10 ------> SDIO_D2
  141. PC11 ------> SDIO_D3
  142. PC12 ------> SDIO_CK
  143. PD2 ------> SDIO_CMD
  144. */
  145. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
  146. |GPIO_PIN_12);
  147. HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
  148. /* Peripheral DMA DeInit*/
  149. HAL_DMA_DeInit(hsd->hdmatx);
  150. HAL_DMA_DeInit(hsd->hdmarx);
  151. /* Peripheral interrupt Deinit*/
  152. HAL_NVIC_DisableIRQ(SDIO_IRQn);
  153. }
  154. /* USER CODE BEGIN SDIO_MspDeInit 1 */
  155. /* USER CODE END SDIO_MspDeInit 1 */
  156. }
  157. /* USER CODE BEGIN 1 */
  158. /* USER CODE END 1 */
  159. /**
  160. * @}
  161. */
  162. /**
  163. * @}
  164. */
  165. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/