sdhal.c
上传用户:tsengnan
上传日期:2010-03-31
资源大小:22k
文件大小:9k
源码类别:

uCOS

开发平台:

C/C++

  1. /**--------------File Info-------------------------------------------------------------------------------
  2. ** File name: sdhal.c
  3. ** Last modified Date: 2005-1-6
  4. ** Last Version: V1.0
  5. ** Descriptions: sd 卡驱动软件包: 硬件抽象层 ---- SPI操作函数
  6. ** Soft Packet of SD Card Driver: hard abstrast layer ---- function of SPI operation
  7. **
  8. **------------------------------------------------------------------------------------------------------
  9. ** Created by: gan peng
  10. ** Created date: 2005-1-6
  11. ** Version: V1.0
  12. ** Descriptions: The original version
  13. **
  14. **------------------------------------------------------------------------------------------------------
  15. ** Modified by:
  16. ** Modified date:
  17. ** Version:
  18. ** Descriptions:
  19. **
  20. **------------------------------------------------------------------------------------------------------
  21. ** Modified by: 
  22. ** Modified date:
  23. ** Version:
  24. ** Descriptions: 
  25. **
  26. ********************************************************************************************************/
  27. #include "config.h"
  28. #include "sdconfig.h"
  29. #include "sdhal.h"
  30. /**************************************************************
  31. 读写SD卡的SPI接口函数: SPI接口设置,发送/接收字节函数
  32. **************************************************************/
  33. /*******************************************************************************************************************
  34. ** 函数名称: void SD_Power() Name:   void SD_Power()
  35. ** 功能描述: 对卡先下电,再上电 Function: turn off the card's power, and turn on
  36. ** 输   入: 无 Input:   NULL
  37. ** 输   出: 无 Output:   NULL
  38. ********************************************************************************************************************/
  39. void SD_Power(void)
  40. {
  41. INT32U i;
  42. SD_POWER_GPIO();
  43. SD_POWER_OUT();
  44. SD_POWER_OFF(); /* 关闭 SD 卡电源  turn off power of sd card */
  45. SPI_SCK_GPIO();
  46. SPI_SCK_OUT();
  47. SPI_SCK_CLR(); /* SCK  引脚置低   set SCK to zero */
  48. SPI_MISO_GPIO();
  49. SPI_MISO_OUT();
  50. SPI_MISO_CLR(); /* MISO 引脚置低   set MISO to zero */
  51. SPI_MOSI_GPIO();
  52. SPI_MOSI_OUT();
  53. SPI_MOSI_CLR(); /* MOSI 引脚置低   set MOSI to zero */
  54. SPI_CS_GPIO();
  55.     SPI_CS_OUT();
  56. SPI_CS_CLR(); /* CS 引脚置低    set CS to zero */
  57. for(i = 0; i < 0x9000; i++); /* 关闭电源延时    delay after turn off power of sd card */
  58. SD_POWER_ON(); /* 打开 SD 卡电源  turn on power of sd card */
  59. }
  60. /*******************************************************************************************************************
  61. ** 函数名称: void SD_HardWareInit() Name:   void SD_HardWareInit()
  62. ** 功能描述: 初始化访问SD卡的硬件条件 Function: initialize the hardware condiction that access sd card
  63. ** 输   入: 无 Input:   NULL
  64. ** 输   出: 无 Output:   NULL
  65. ********************************************************************************************************************/
  66. void SD_HardWareInit(void)
  67. SD_Power(); /* 对卡先下电,再上电  turn off power of card, and turn on it */
  68. SPI_INIT(); /* 初始化SPI接口      initialize SPI interface */
  69. SD_INSERT_GPIO();
  70. SD_INSERT_IN(); /* 检测卡完全插入口为输入口   the port checking card is input */
  71. SD_WP_GPIO();
  72. SD_WP_IN(); /* 写保护检测口为输入口     the port written protect is input */
  73.    
  74.     SPI_CS_SET(); /* CS置高      set CS to high voltage */
  75.   SPI_Clk400k(); /* 设置SPI频率小于等于400kHZ  set frequency of SPI below 400kHZ */
  76.    
  77.   SPI_SPCR = (0x01 << 4) + (0x01 << 5); /* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
  78. } /* configure SPI interface */
  79. /*******************************************************************************************************************
  80. ** 函数名称: void SPI_Clk400k() Name:   void SPI_Clk400k()
  81. ** 功能描述: 设置SPI的时钟小于400kHZ Function: set the clock of SPI less than 400kHZ
  82. ** 输   入: 无 Input:   NULL
  83. ** 输   出: 无 Output:   NULL
  84. ********************************************************************************************************************/
  85. void SPI_Clk400k(void)
  86. {
  87. SPI_SPCCR = 128;     /* 设置SPI时钟分频值为128  Set the value of dividing frequency to 128 */
  88. }
  89. /*******************************************************************************************************************
  90. ** 函数名称: void SPI_ClkToMax() Name:   void SPI_ClkToMax()
  91. ** 功能描述: 设置SPI的clock到最大值 Function: set the clock of SPI to maximum
  92. ** 输   入: 无 Input:   NULL
  93. ** 输   出: 无 Output:   NULL
  94. ********************************************************************************************************************/
  95. void SPI_ClkToMax(void)
  96. {
  97. SPI_SPCCR = 8; /* 设置SPI时钟分频值为8  Set the value of dividing frequency to 8 */
  98. }
  99. /*******************************************************************************************************************
  100. ** 函数名称: void SPI_SendByte() Name:   void SPI_SendByte()
  101. ** 功能描述: 通过SPI接口发送一个字节 Function: send a byte by SPI interface
  102. ** 输   入: INT8U byte: 发送的字节 Input:   INT8U byte: the byte that will be send
  103. ** 输   出: 无 Output:   NULL
  104. ********************************************************************************************************************/
  105. void SPI_SendByte(INT8U byte)
  106. {
  107. INT8U temp;
  108. SPI_SPDR = byte; /* 发送数据放入SPI数据寄存器 */
  109.    
  110. while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待数据发送完毕 */
  111. /* wait for SPIF being set, that is, wait for finishing of data being send */
  112.   temp = SPI_SPDR;
  113. }
  114. /*******************************************************************************************************************
  115. ** 函数名称: INT8U SPI_RecByte() Name:   INT8U SPI_RecByte()
  116. ** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
  117. ** 输   入: 无 Input:   NULL
  118. ** 输   出: 收到的字节 Output:   the byte that be received
  119. ********************************************************************************************************************/
  120. INT8U SPI_RecByte(void)
  121. {
  122. SPI_SPDR = 0xFF;
  123.    
  124.   while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待收到数据 */
  125. /* wait for SPIF being set, that is, wait for being received data */
  126. return(SPI_SPDR);  /* 读取收到的字节 read the byte received */
  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. SPI_CS_CLR();     /* 片选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. SPI_CS_SET();      /* 不片选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. }