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

uCOS

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                                 Co.,LTD.
  3. **                                     
  4. **                                 http://
  5. **
  6. **--------------File Info-------------------------------------------------------------------------------
  7. ** File name: sdhal.c
  8. ** Last modified Date: 2007-10-15
  9. ** Last Version: V2.0
  10. ** Descriptions: SD/MMC卡读写模块: 硬件抽象层 ---- SPI操作函数
  11. ** Soft Packet of SD/MMC Card: hard abstrast layer ---- function of SPI operation
  12. **
  13. **------------------------------------------------------------------------------------------------------
  14. ** Created by: lhlzjut@hotmail.com
  15. ** Created date: 2007-10-15
  16. ** Version: V1.0
  17. ** Descriptions: The original version
  18. **
  19. **------------------------------------------------------------------------------------------------------
  20. ********************************************************************************************************/
  21. #include  "stm32f10x_lib.h"
  22. #include "sdhal.h"
  23. #if SD_UCOSII_EN    
  24. #include  "ucos_ii.h"
  25. #endif
  26. /* Select MSD Card: ChipSelect pin low  */
  27. #define MSD_CS_LOW()     GPIO_ResetBits(GPIOC, GPIO_Pin_4)
  28. /* Deselect MSD Card: ChipSelect pin high */
  29. #define MSD_CS_HIGH()    GPIO_SetBits(GPIOC, GPIO_Pin_4)
  30. /* Private function prototypes -----------------------------------------------*/
  31. static void SPI_Config(void);
  32. /**************************************************************
  33. 读写SD卡的SPI接口函数: SPI接口设置,发送/接收字节函数
  34. **************************************************************/
  35. /*******************************************************************************************************************
  36. ** 函数名称: void SD_HardWareInit() Name:   void SD_HardWareInit()
  37. ** 功能描述: 初始化访问SD卡的硬件条件 Function: initialize the hardware condiction that access sd card
  38. ** 输   入: 无 Input:   NULL
  39. ** 输   出: 无 Output:   NULL
  40. ********************************************************************************************************************/
  41. void SD_HardWareInit(void)
  42. SPI_Config(); /* 配置,初始化,SPI接口和SD片选        */
  43.     
  44. MSD_CS_HIGH();
  45. SPI_Clk400k(); /* 配置BSPI波特率为400k        */
  46. }
  47. /*******************************************************************************************************************
  48. ** 函数名称: void SPI_Clk400k() Name:   void SPI_Clk400k()
  49. ** 功能描述: 设置SPI的时钟小于400kHZ Function: set the clock of SPI less than 400kHZ
  50. ** 输   入: 无 Input:   NULL
  51. ** 输   出: 无 Output:   NULL
  52. ********************************************************************************************************************/
  53. void SPI_Clk400k(void)
  54. {
  55. SPI_InitTypeDef   SPI_InitStructure;
  56.    /* SPI1 Config */
  57.    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  58.    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  59.    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  60.    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  61.    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  62.    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  63.    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  64.    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  65.    SPI_InitStructure.SPI_CRCPolynomial = 7;
  66.    SPI_Init(SPI1, &SPI_InitStructure);
  67. SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE | SPI_I2S_IT_RXNE | SPI_I2S_IT_ERR, DISABLE);
  68.    /* SPI1 enable */
  69.    SPI_Cmd(SPI1, ENABLE);
  70. }
  71. /*******************************************************************************************************************
  72. ** 函数名称: void SPI_ClkToMax() Name:   void SPI_ClkToMax()
  73. ** 功能描述: 设置SPI的clock到最大值 Function: set the clock of SPI to maximum
  74. ** 输   入: 无 Input:   NULL
  75. ** 输   出: 无 Output:   NULL
  76. ********************************************************************************************************************/
  77. void SPI_ClkToMax(void)
  78. {
  79. SPI_InitTypeDef   SPI_InitStructure;
  80.    /* SPI1 Config */
  81.    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  82.    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  83.    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  84.    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  85.    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  86.    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  87.    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  88.    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  89.    SPI_InitStructure.SPI_CRCPolynomial = 7;
  90.    SPI_Init(SPI1, &SPI_InitStructure);
  91. SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE | SPI_I2S_IT_RXNE | SPI_I2S_IT_ERR, DISABLE);
  92.    /* SPI1 enable */
  93.    SPI_Cmd(SPI1, ENABLE);
  94. }
  95. /*******************************************************************************************************************
  96. ** 函数名称: void SPI_SendByte() Name:   void SPI_SendByte()
  97. ** 功能描述: 通过SPI接口发送一个字节 Function: send a byte by SPI interface
  98. ** 输   入: INT8U byte: 发送的字节 Input:   INT8U byte: the byte that will be send
  99. ** 输   出: 无 Output:   NULL
  100. ********************************************************************************************************************/
  101. void SPI_SendByte(INT8U byte)
  102. {
  103. /* Wait until the transmit buffer is empty */
  104. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  105. /* Send the byte */
  106. SPI_I2S_SendData(SPI1, byte);
  107. }
  108. /*******************************************************************************************************************
  109. ** 函数名称: INT8U SPI_RecByte() Name:   INT8U SPI_RecByte()
  110. ** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
  111. ** 输   入: 无 Input:   NULL
  112. ** 输   出: 收到的字节 Output:   the byte that be received
  113. ********************************************************************************************************************/
  114. INT8U SPI_RecByte(void)
  115. {
  116. INT8U Data = 0;
  117. /* Wait until the transmit buffer is empty */
  118. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  119. /* Send the byte */
  120. SPI_I2S_SendData(SPI1, 0xFF);
  121. /* Wait until a data is received */
  122. while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  123. /* Get the received data */
  124. Data = SPI_I2S_ReceiveData(SPI1);
  125. /* Return the shifted data */
  126. return Data;
  127. }
  128. /*******************************************************************************************************************
  129. ** 函数名称: void SPI_CS_Assert() Name:   void SPI_CS_Assert()
  130. ** 功能描述: 片选SPI从机 Function: select the SPI slave 
  131. ** 输   入: 无 Input:   NULL
  132. ** 输   出: 无 Output:   NULL
  133. ********************************************************************************************************************/
  134. void SPI_CS_Assert(void)
  135. {
  136. MSD_CS_LOW();     /* 片选SPI从机  select the SPI slave */ 
  137. }
  138. /*******************************************************************************************************************
  139. ** 函数名称: void SPI_CS_Deassert() Name:   void SPI_CS_Deassert()
  140. ** 功能描述: 不片选SPI从机 Function: not select the SPI slave 
  141. ** 输   入: 无 Input:   NULL
  142. ** 输   出: 无 Output:   NULL
  143. ********************************************************************************************************************/
  144. void SPI_CS_Deassert(void)
  145. {
  146. MSD_CS_HIGH();      /* 不片选SPI从机  not select the SPI slave */
  147. }
  148. /*******************************************************************************************************************
  149. ** 函数名称: void SD_ChkCard() Name:   void SD_ChkCard()
  150. ** 功能描述: 检测卡是否完全插入 Function: check weather card is insert entirely
  151. ** 输   入: 无 Input:   NULL
  152. ** 输   出: 1: 卡完全插入 0: 卡没有完全插入   Output:   1: insert entirely 0: not insert entirely
  153. ********************************************************************************************************************/
  154. INT8U SD_ChkCard(void)
  155. {
  156. if (SD_INSERT_STATUS() != 0)
  157. return 0; /* 未完全插入 not insert entirely */
  158. else
  159. return 1; /* 完全插入 insert entirely */
  160. }
  161. /*******************************************************************************************************************
  162. ** 函数名称: void SD_ChkCardWP() Name:   void SD_ChkCardWP()
  163. ** 功能描述: 检测卡写保护 Function: check weather card is write protect
  164. ** 输   入: 无 Input:   NULL
  165. ** 输   出: 1: 卡已写保护 0: 卡未写保护     Output:   1: insert write protect 0: not write protect
  166. ********************************************************************************************************************/
  167. INT8U SD_ChkCardWP(void)
  168. {
  169. if (SD_WP_STATUS() != 0)
  170. return 1; /* 卡写保护 */
  171. else
  172. return 0; /* 卡未写保护 */
  173. }
  174. /*******************************************************************************
  175. * Function Name  : SPI_Config
  176. * Description    : Initializes the SPI1 and CS pins.
  177. * Input          : None
  178. * Output         : None
  179. * Return         : None
  180. *******************************************************************************/
  181. void SPI_Config(void)
  182. {
  183.   GPIO_InitTypeDef  GPIO_InitStructure;
  184.   /* GPIOA and GPIOC Periph clock enable */
  185.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
  186.   /* SPI1 Periph clock enable */
  187.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  188.   /* Configure SPI1 pins: SCK, MISO and MOSI */
  189.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  190.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  191.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  192.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  193.   /* Configure PC12 pin: CS pin */
  194.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  195.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  196.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  197.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  198. }