📄 sdcmd.c
字号:
** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_GetRCA(INT8U card_type, INT16U *RCA){ INT32U param = *RCA << 16; INT8U response[6],tmp; tmp = SD_SendCommand(CMD3, param, CMD3_R, response); /* 向卡获取RCA命令 command that get RCA from card */ if (tmp != SD_NO_ERR) return tmp; if (card_type == 0) /* SD card */ *RCA = ((response[4] << 8) + response[3]); /* 取得响应中的RCA域 get RCA fields from response */ return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_SelectCard** Descriptions: select card** 选择卡** Input: INT16U RCA : 卡的RCA INPUT: INT16U RCA : the RCA of card** Output: 0: 正确 >0: 错误码 Output: 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_SelectCard(INT16U RCA){ INT32U param; INT8U response[6], tmp; param = (INT32U)RCA << 16; tmp = SD_SendCommand(CMD7, param, CMD7_R, response); /* 选择卡命令 command that select card */ if (tmp != SD_NO_ERR) return tmp; return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_DeSelectCard** Descriptions: deselect card** 不选择卡** Input: NULL** Output: 0: 正确 >0: 错误码 Output: 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_DeSelectCard(void){ INT32U param = 0; INT8U response[6], tmp; tmp = SD_SendCommand(CMD7, param, CMD0_R, response); /* 不选择卡命令 command that deselect card */ if (tmp != SD_NO_ERR) return tmp; return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_ReadCSD** Descriptions: read CSD register of card ** 读卡的CSD寄存器** Input: INT8U csdlen : 寄存器长度(固定为16) INT8U csdlen : len of register (fixed,is 16) INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadCSD(INT16U RCA, INT8U csdlen, INT8U *recbuf){ INT32U param; INT8U response[17], tmp; param = (INT32U)RCA << 16; tmp = SD_SendCommand(CMD9, param, CMD9_R, response); /* 读CSD寄存器命令 command that read CSD register */ if (tmp != SD_NO_ERR) return tmp; for (tmp = 0; tmp < csdlen; tmp++) /* 从响应中取得CSD get CSD from response */ recbuf[tmp] = response[tmp]; return SD_NO_ERR; }/*********************************************************************************************************** Function name: SD_ReadCID** Descriptions: read CID register of card** 读卡的CID寄存器** Input: INT16U RCA : 卡RCA地址 INT16U RCA : the card RCA INT8U cidlen : 寄存器长度(固定为16) INT8U cidlen : len of register (fixed,is 16) INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer ** Output: 0: 正确 >0: 错误码 Output: 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadCID(INT16U RCA, INT8U cidlen, INT8U *recbuf){ INT32U param; INT8U response[17], tmp; param = (INT32U)RCA << 16; tmp = SD_SendCommand(CMD10, param, CMD10_R, response); /* 读CID寄存器命令 command that read CID register */ if (tmp != SD_NO_ERR) return tmp; for (tmp = 0; tmp < 16; tmp++) recbuf[tmp] = response[tmp]; /* 从响应中取得CID get CID from response */ return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_StopTransmission** Descriptions: stop data transmission** 停止数据传输** Input: NULL** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_StopTransmission(void){ INT32U param = 0; INT8U response[6]; return (SD_SendCommand(CMD12, param, CMD12_R, response)); /* 结束数据传输命令失败 stop transmission command fail */}/*********************************************************************************************************** Function name: SD_ReadCard_Status** Descriptions: read Card Status register of sd card** 读SD卡的 Card Status 寄存器** Input: INT16U RCA : 卡RCA地址 INT16U RCA : the card RCA INT8U len : 寄存器长度(固定为4) INT8U len : len of register (fixed,is 4) INT8U *recbuf : 接收缓冲区 INT8U *recbuf : recbuffer ** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadCard_Status(INT16U RCA, INT8U len, INT8U *buffer){ INT32U param; INT8U response[6],tmp; param = (INT32U)RCA << 16; tmp = SD_SendCommand(CMD13, param, CMD13_R, response); /* 读 Card_Status 寄存器 read register of Card Status */ if (tmp != SD_NO_ERR) return tmp; for (tmp = 0; tmp < 4; tmp++) /* 从响应中取得Card_Status read Card_Status from response */ buffer[tmp] = response[tmp + 1]; return SD_NO_ERR; }/*********************************************************************************************************** Function name: SD_GoInactive** Descriptions: forbid card into inactive state** 使卡进入停止状态** Input: INT16U RCA : 卡RCA地址 INT16U RCA : the card RCA** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: Ming Yuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_GoInactive(INT16U RCA){ INT32U param; INT8U response[6], tmp; param = (INT32U)RCA << 16; tmp = SD_SendCommand(CMD15, param, CMD15_R, response); /* 使卡进入停止状态 forbid card into inactive state */ return tmp; }/*********************************************************************************************************** Function name: SD_SetBlockLen** Descriptions: set a block len of card** 设置卡一个块的长度** Input: INT32U length : 块的长度值 INT32U length : the length of a block** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: Ming Yuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_SetBlockLen(INT16U RCA, INT32U length){ INT8U response[6],ret; ret = SD_SelectCard(RCA); /* CMD7, 进入传输状态 */
if (ret != SD_NO_ERR)
return ret; ret = SD_SendCommand(CMD16, length, CMD16_R, response); if (ret != SD_NO_ERR) return ret; /* 设置块的长度为length失败 set the length of block to length fail */ ret = SD_JudgeResult(&response[1]); /* 返回执行结果 return perform result */
if (ret != SD_NO_ERR)
return ret;
return (SD_DeSelectCard()); //return (SD_JudgeResult(&response[1])); /* 返回执行结果 return perform result */ }/*********************************************************************************************************** Function name: SD_ReadSingleBlock** Descriptions: read single block command** 读单块命令** Input: INT32U blockaddr: 块地址 INT32U blockaddr: block address** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadSingleBlock(INT32U blockaddr){ return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -