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

uCOS

开发平台:

C/C++

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