sdhal.c
上传用户:pudewen666
上传日期:2007-06-08
资源大小:75k
文件大小:9k
源码类别:

微处理器开发

开发平台:

Windows_Unix

  1. /****************************************Copyright (c)**************************************************
  2. **                               Guangzhou ZLG-MCU Development Co.,LTD.
  3. **                                      graduate school
  4. **                                 http://www.zlgmcu.com
  5. **
  6. **--------------File Info-------------------------------------------------------------------------------
  7. ** File name: sdhal.c
  8. ** Last modified Date: 2005-1-6
  9. ** Last Version: V1.0
  10. ** Descriptions: sd 卡驱动软件包: 硬件抽象层 ---- SPI操作函数
  11. ** Soft Packet of SD Card Driver: hard abstrast layer ---- function of SPI operation
  12. **
  13. **------------------------------------------------------------------------------------------------------
  14. ** Created by: Ming Yuan Zheng
  15. ** Created date: 2005-1-6
  16. ** Version: V1.0
  17. ** Descriptions: The original version
  18. **
  19. **------------------------------------------------------------------------------------------------------
  20. ** Modified by:
  21. ** Modified date:
  22. ** Version:
  23. ** Descriptions:
  24. **
  25. **------------------------------------------------------------------------------------------------------
  26. ** Modified by: 
  27. ** Modified date:
  28. ** Version:
  29. ** Descriptions: 
  30. **
  31. ********************************************************************************************************/
  32. #include "config.h"
  33. #include "sdconfig.h"
  34. #include "sdhal.h"
  35. /**************************************************************
  36. 读写SD卡的SPI接口函数: SPI接口设置,发送/接收字节函数
  37. **************************************************************/
  38. /*******************************************************************************************************************
  39. ** 函数名称: void SD_Power() Name:   void SD_Power()
  40. ** 功能描述: 对卡先下电,再上电 Function: turn off the card's power, and turn on
  41. ** 输   入: 无 Input:   NULL
  42. ** 输   出: 无 Output:   NULL
  43. ********************************************************************************************************************/
  44. void SD_Power(void)
  45. {
  46. INT32U i;
  47. SD_POWER_GPIO();
  48. SD_POWER_OUT();
  49. SD_POWER_OFF(); /* 关闭 SD 卡电源  turn off power of sd card */
  50. SPI_SCK_GPIO();
  51. SPI_SCK_OUT();
  52. SPI_SCK_CLR(); /* SCK  引脚置低   set SCK to zero */
  53. SPI_MISO_GPIO();
  54. SPI_MISO_OUT();
  55. SPI_MISO_CLR(); /* MISO 引脚置低   set MISO to zero */
  56. SPI_MOSI_GPIO();
  57. SPI_MOSI_OUT();
  58. SPI_MOSI_CLR(); /* MOSI 引脚置低   set MOSI to zero */
  59. SPI_CS_GPIO();
  60.     SPI_CS_OUT();
  61. SPI_CS_CLR(); /* CS 引脚置低    set CS to zero */
  62. for(i = 0; i < 0x9000; i++); /* 关闭电源延时    delay after turn off power of sd card */
  63. SD_POWER_ON(); /* 打开 SD 卡电源  turn on power of sd card */
  64. }
  65. /*******************************************************************************************************************
  66. ** 函数名称: void SD_HardWareInit() Name:   void SD_HardWareInit()
  67. ** 功能描述: 初始化访问SD卡的硬件条件 Function: initialize the hardware condiction that access sd card
  68. ** 输   入: 无 Input:   NULL
  69. ** 输   出: 无 Output:   NULL
  70. ********************************************************************************************************************/
  71. void SD_HardWareInit(void)
  72. SD_Power(); /* 对卡先下电,再上电  turn off power of card, and turn on it */
  73. SPI_INIT(); /* 初始化SPI接口      initialize SPI interface */
  74. SD_INSERT_GPIO();
  75. SD_INSERT_IN(); /* 检测卡完全插入口为输入口   the port checking card is input */
  76. SD_WP_GPIO();
  77. SD_WP_IN(); /* 写保护检测口为输入口     the port written protect is input */
  78.    
  79.     SPI_CS_SET(); /* CS置高      set CS to high voltage */
  80.   SPI_Clk400k(); /* 设置SPI频率小于等于400kHZ  set frequency of SPI below 400kHZ */
  81.    
  82.   SPI_SPCR = (0x01 << 4) + (0x01 << 5); /* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
  83. } /* configure SPI interface */
  84. /*******************************************************************************************************************
  85. ** 函数名称: void SPI_Clk400k() Name:   void SPI_Clk400k()
  86. ** 功能描述: 设置SPI的时钟小于400kHZ Function: set the clock of SPI less than 400kHZ
  87. ** 输   入: 无 Input:   NULL
  88. ** 输   出: 无 Output:   NULL
  89. ********************************************************************************************************************/
  90. void SPI_Clk400k(void)
  91. {
  92. SPI_SPCCR = 128;     /* 设置SPI时钟分频值为128  Set the value of dividing frequency to 128 */
  93. }
  94. /*******************************************************************************************************************
  95. ** 函数名称: void SPI_ClkToMax() Name:   void SPI_ClkToMax()
  96. ** 功能描述: 设置SPI的clock到最大值 Function: set the clock of SPI to maximum
  97. ** 输   入: 无 Input:   NULL
  98. ** 输   出: 无 Output:   NULL
  99. ********************************************************************************************************************/
  100. void SPI_ClkToMax(void)
  101. {
  102. SPI_SPCCR = 8; /* 设置SPI时钟分频值为8  Set the value of dividing frequency to 8 */
  103. }
  104. /*******************************************************************************************************************
  105. ** 函数名称: void SPI_SendByte() Name:   void SPI_SendByte()
  106. ** 功能描述: 通过SPI接口发送一个字节 Function: send a byte by SPI interface
  107. ** 输   入: INT8U byte: 发送的字节 Input:   INT8U byte: the byte that will be send
  108. ** 输   出: 无 Output:   NULL
  109. ********************************************************************************************************************/
  110. void SPI_SendByte(INT8U byte)
  111. {
  112. INT8U temp;
  113. SPI_SPDR = byte; /* 发送数据放入SPI数据寄存器 */
  114.    
  115. while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待数据发送完毕 */
  116. /* wait for SPIF being set, that is, wait for finishing of data being send */
  117.   temp = SPI_SPDR;
  118. }
  119. /*******************************************************************************************************************
  120. ** 函数名称: INT8U SPI_RecByte() Name:   INT8U SPI_RecByte()
  121. ** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
  122. ** 输   入: 无 Input:   NULL
  123. ** 输   出: 收到的字节 Output:   the byte that be received
  124. ********************************************************************************************************************/
  125. INT8U SPI_RecByte(void)
  126. {
  127. SPI_SPDR = 0xFF;
  128.    
  129.   while(0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待收到数据 */
  130. /* wait for SPIF being set, that is, wait for being received data */
  131. return(SPI_SPDR);  /* 读取收到的字节 read the byte received */
  132. }
  133. /*******************************************************************************************************************
  134. ** 函数名称: void SPI_CS_Assert() Name:   void SPI_CS_Assert()
  135. ** 功能描述: 片选SPI从机 Function: select the SPI slave 
  136. ** 输   入: 无 Input:   NULL
  137. ** 输   出: 无 Output:   NULL
  138. ********************************************************************************************************************/
  139. void SPI_CS_Assert(void)
  140. {
  141. SPI_CS_CLR();     /* 片选SPI从机  select the SPI slave */  
  142. }
  143. /*******************************************************************************************************************
  144. ** 函数名称: void SPI_CS_Deassert() Name:   void SPI_CS_Deassert()
  145. ** 功能描述: 不片选SPI从机 Function: not select the SPI slave 
  146. ** 输   入: 无 Input:   NULL
  147. ** 输   出: 无 Output:   NULL
  148. ********************************************************************************************************************/
  149. void SPI_CS_Deassert(void)
  150. {
  151. SPI_CS_SET();      /* 不片选SPI从机  not select the SPI slave */
  152. }
  153. /*******************************************************************************************************************
  154. ** 函数名称: void SD_ChkCard() Name:   void SD_ChkCard()
  155. ** 功能描述: 检测卡是否完全插入 Function: check weather card is insert entirely
  156. ** 输   入: 无 Input:   NULL
  157. ** 输   出: 1: 卡完全插入 0: 卡没有完全插入   Output:   1: insert entirely 0: not insert entirely
  158. ********************************************************************************************************************/
  159. INT8U SD_ChkCard(void)
  160. {
  161. if (SD_INSERT_STATUS() != 0)
  162. return 0; /* 未完全插入 not insert entirely */
  163. else
  164. return 1; /* 完全插入 insert entirely */
  165. }
  166. /*******************************************************************************************************************
  167. ** 函数名称: void SD_ChkCardWP() Name:   void SD_ChkCardWP()
  168. ** 功能描述: 检测卡写保护 Function: check weather card is write protect
  169. ** 输   入: 无 Input:   NULL
  170. ** 输   出: 1: 卡已写保护 0: 卡未写保护     Output:   1: insert write protect 0: not write protect
  171. ********************************************************************************************************************/
  172. INT8U SD_ChkCardWP(void)
  173. {
  174. if (SD_WP_STATUS() != 0)
  175. return 1; /* 卡写保护 */
  176. else
  177. return 0; /* 卡未写保护 */
  178. }