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

uCOS

开发平台:

C/C++

  1. /**------------------------------------------------------------------------------------------------------
  2. ** Created by: gan peng
  3. ** Created date: 2005-1-6
  4. ** Version: V1.0
  5. ** Descriptions: The original version
  6. **
  7. **------------------------------------------------------------------------------------------------------
  8. ** Modified by:
  9. ** Modified date:
  10. ** Version:
  11. ** Descriptions:
  12. **
  13. **------------------------------------------------------------------------------------------------------
  14. ** Modified by: 
  15. ** Modified date:
  16. ** Version:
  17. ** Descriptions: 
  18. **
  19. ********************************************************************************************************/
  20. /*
  21.  *******************************************************
  22. SD 卡的相关命令与响应宏定义
  23.  *******************************************************
  24. */
  25. /* 命令响应定义 define command's response */
  26. #define R1 1
  27. #define R1B 2
  28. #define R2 3
  29. #define R3 4
  30. /* R1和R2高字节错误码 R1 and upper byte of R2 error code */
  31. #define MSK_IDLE             0x01
  32. #define MSK_ERASE_RST        0x02
  33. #define MSK_ILL_CMD          0x04
  34. #define MSK_CRC_ERR          0x08
  35. #define MSK_ERASE_SEQ_ERR    0x10
  36. #define MSK_ADDR_ERR         0x20
  37. #define MSK_PARAM_ERR        0x40
  38. /* R2低字节错误码 lower byte of R2 error code */
  39. #define MSK_TOK_ERROR             0x01
  40. #define MSK_TOK_CC_ERROR          0x02
  41. #define MSK_TOK_ECC_FAILED        0x04
  42. #define MSK_TOK_CC_OUTOFRANGE     0x08
  43. #define MSK_TOK_CC_LOCKED         0x10
  44. /* 数据令牌 Data Tokens */
  45. #define SD_TOK_READ_STARTBLOCK    0xFE
  46. #define SD_TOK_WRITE_STARTBLOCK   0xFE
  47. #define SD_TOK_READ_STARTBLOCK_M  0xFE
  48. #define SD_TOK_WRITE_STARTBLOCK_M 0xFC
  49. #define SD_TOK_STOP_MULTI         0xFD
  50. /* 数据响应令牌 Data Response Tokens */
  51. #define SD_RESP_DATA_MSK   0x0F //数据响应掩码
  52. #define SD_RESP_DATA_ACCETPTED   0x05 //数据被接受
  53. #define SD_RESP_DATA_REJECT_CRC   0x0B      //由于CRC错误而被拒绝
  54. #define SD_RESP_DATA_REJECT_WRITE 0x0D //由于写错误而被拒绝
  55. /* 等待类型 Wait Type */
  56. #define SD_WAIT_READ   0x00 //读等待
  57. #define SD_WAIT_WRITE   0x01 //写等待
  58. #define SD_WAIT_ERASE     0x02 //擦除等待
  59. #define SD_READREG_TIMEOUT   8
  60. /*
  61. *********************************************
  62.      SD卡SPI模式下命令集
  63. *********************************************
  64. */
  65. /******************************** 基本命令集 Basic command set **************************/
  66. /* 复位SD 卡 Reset cards to idle state */
  67. #define CMD0 0
  68. #define CMD0_R R1
  69. /* 读OCR寄存器 Read the OCR (MMC mode, do not use for SD cards) */
  70. #define CMD1 1
  71. #define CMD1_R R1
  72. /* 读CSD寄存器 Card sends the CSD */
  73. #define CMD9 9
  74. #define CMD9_R R1
  75. /* 读CID寄存器 Card sends CID */
  76. #define CMD10 10
  77. #define CMD10_R R1
  78. /* 停止读多块时的数据传输 Stop a multiple block (stream) read/write operation */
  79. #define CMD12 12
  80. #define CMD12_R R1B
  81. /* 读 Card_Status 寄存器 Get the addressed card's status register */
  82. #define CMD13 13
  83. #define CMD13_R R2
  84. /***************************** 块读命令集 Block read commands **************************/
  85. /* 设置块的长度 Set the block length */
  86. #define CMD16 16
  87. #define CMD16_R R1
  88. /* 读单块 Read a single block */
  89. #define CMD17 17
  90. #define CMD17_R R1
  91. /* 读多块,直至主机发送CMD12为止 Read multiple blocks until a CMD12 */
  92. #define CMD18 18
  93. #define CMD18_R R1
  94. /***************************** 块写命令集 Block write commands *************************/
  95. /* 写单块 Write a block of the size selected with CMD16 */
  96. #define CMD24 24
  97. #define CMD24_R R1
  98. /* 写多块 Multiple block write until a CMD12 */
  99. #define CMD25 25
  100. #define CMD25_R R1
  101. /* 写CSD寄存器 Program the programmable bits of the CSD */
  102. #define CMD27 27
  103. #define CMD27_R R1
  104. /***************************** 写保护 Write protection *****************************/
  105. /* Set the write protection bit of the addressed group */
  106. #define CMD28 28
  107. #define CMD28_R R1B
  108. /* Clear the write protection bit of the addressed group */
  109. #define CMD29 29
  110. #define CMD29_R R1B
  111. /* Ask the card for the status of the write protection bits */
  112. #define CMD30 30
  113. #define CMD30_R R1
  114. /***************************** 擦除命令 Erase commands *******************************/
  115. /* 设置擦除块的起始地址 Set the address of the first write block to be erased */
  116. #define CMD32 32
  117. #define CMD32_R R1
  118. /* 设置擦除块的终止地址 Set the address of the last write block to be erased */
  119. #define CMD33 33
  120. #define CMD33_R R1
  121. /* 擦除所选择的块 Erase the selected write blocks */
  122. #define CMD38 38
  123. #define CMD38_R R1B
  124. /***************************** 锁卡命令 Lock Card commands ***************************/
  125. /* 设置/复位密码或上锁/解锁卡 Set/reset the password or lock/unlock the card */
  126. #define CMD42 42
  127. #define CMD42_R R1B
  128. /* Commands from 42 to 54, not defined here */
  129. /***************************** 应用命令 Application-specific commands ****************/
  130. /* 禁止下一个命令为应用命令  Flag that the next command is application-specific */
  131. #define CMD55 55
  132. #define CMD55_R R1
  133. /* 应用命令的通用I/O  General purpose I/O for application-specific commands */
  134. #define CMD56 56
  135. #define CMD56_R R1
  136. /* 读OCR寄存器  Read the OCR (SPI mode only) */
  137. #define CMD58 58
  138. #define CMD58_R R3
  139. /* 使能或禁止 CRC Turn CRC on or off */
  140. #define CMD59 59
  141. #define CMD59_R R1
  142. /***************************** 应用命令 Application-specific commands ***************/
  143. /* 获取 SD Status寄存器 Get the SD card's status */
  144. #define ACMD13 13
  145. #define ACMD13_R R2
  146. /* 得到已写入卡中的块的个数 Get the number of written write blocks (Minus errors ) */
  147. #define ACMD22 22
  148. #define ACMD22_R R1
  149. /* 在写之前,设置预先擦除的块的个数 Set the number of write blocks to be pre-erased before writing */
  150. #define ACMD23 23
  151. #define ACMD23_R R1
  152. /* 读取OCR寄存器 Get the card's OCR (SD mode) */
  153. #define ACMD41 41
  154. #define ACMD41_R R1
  155. /* 连接/断开CD/DATA[3]引脚上的上拉电阻 Connect or disconnect the 50kOhm internal pull-up on CD/DAT[3] */
  156. #define ACMD42 42
  157. #define ACMD42_R R1
  158. /* 读取SCR寄存器 Get the SD configuration register */
  159. #define ACMD51 51
  160. #define ACMD51_R R1
  161. INT8U SD_SendCmd(INT8U cmd, INT8U *param, INT8U resptype, INT8U *resp);  // 一个SPI命令 
  162. void SD_PackParam(INT8U *parameter, INT32U value);  // 封装参数
  163. INT8U SD_BlockCommand(INT8U cmd, INT8U resptype, INT32U parameter);  // 块命令 
  164. INT8U SD_ResetSD(void); // 复位SD卡
  165. INT8U SD_ReadCSD(INT8U csdlen, INT8U *recbuf); // 读CSD  read CSD register
  166. INT8U SD_ReadCID(INT8U cidlen, INT8U *recbuf); // 读CID read CID register
  167. INT8U SD_StopTransmission(void); // 停止传输
  168. INT8U SD_ReadCard_Status(INT8U len, INT8U *buffer); // 读Card Status read Card Status register
  169. INT8U SD_SetBlockLen(INT32U length); // 设置块长度
  170. INT8U SD_ReadSingleBlock(INT32U blockaddr); // 读单块
  171. INT8U SD_ReadMultipleBlock(INT32U blockaddr); // 读多块
  172. INT8U SD_WriteSingleBlock(INT32U blockaddr); // 写单块
  173. INT8U SD_WriteMultipleBlock(INT32U blockaddr); // 写多块 
  174. INT8U SD_ProgramCSD(INT8U len, INT8U *buff); // 写CSD寄存器   write CSD register 
  175. INT8U SD_EraseStartBlock(INT32U startblock); // 擦块起始地址
  176. INT8U SD_EraseEndBlock(INT32U endblock); // 擦块终止地址
  177. INT8U SD_EraseSelectedBlock(void); // 擦除所选的块
  178. INT8U SD_ReadOCR(INT8U ocrlen,INT8U *recbuf); // 读OCR read OCR register
  179. INT8U SD_EnableCRC(INT8U bEnable); // 使能CRC校验 enable CRC
  180. // 特殊应用命令
  181. INT8U SD_ReadSD_Status(INT8U sdslen, INT8U *recbuf); // 读SD_Status  read SD_Status 
  182. INT8U SD_GetNumWRBlcoks(INT32U *blocknum); // 得到正确写入块数
  183. INT8U SD_ReadSCR(INT8U scrlen, INT8U *recbuf); // 读SCR  read SCR register
  184. // 数据流函数
  185. INT8U SD_ReadRegister(INT32U len, INT8U *recbuf); // 读数据
  186. INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf); // 读块数据
  187. INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf); // 写块数据
  188. // 其它函数
  189. void SD_StopMultiToken(void); // 停止多块写令牌
  190. INT8U SD_WaitBusy(INT8U waittype); // 忙
  191. void SD_SPIDelay(INT8U value); // 发生SPI时钟