📄 sdcmd.c
字号:
/*********************************************************************************************************** Function name: SD_WriteSingleBlock** Descriptions: write single block command** 写单块命令** Input: INT32U blockaddr: block address 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_WriteSingleBlock(INT32U blockaddr){ return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */}/*********************************************************************************************************** Function name: SD_ReadOCR** Descriptions: read OCR register of card** 读操作条件寄存器OCR** Input: INT8U ocrlen : 寄存器长度(固定为4) INT8U ocrlen : len of register (fixed,is 4) INT8U *recbuf : 接收缓冲区 INT8U *recbuf : receive buffer ** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadOCR(INT8U ocrlen, INT8U *recbuf){ INT32U param = 0; INT8U response[6],tmp; tmp = SD_SendCommand(CMD55, param, CMD55_R, response); if (tmp != SD_NO_ERR) return tmp; param = 0xF00000; /* 没有忙条件的OCR */ tmp = SD_SendCommand(ACMD41, param, ACMD41_R, response); /* 读 OCR 寄存器命令 read OCR register command */ if (tmp != SD_NO_ERR) return tmp; for (tmp = 0; tmp < 4; tmp++) /* 从响应中取得OCR get OCR from response */ recbuf[tmp] = response[tmp + 1]; return SD_NO_ERR;}/*********************************************************************************************************** Function name: MMC_ReadOCR** Descriptions: Read OCR register** Input: INT8U ocrlen : the length of the OCR register INT8U *recbuf : the content buffer of OCR register ** Output: NULL** Created by: Ming Yuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U MMC_ReadOCR(INT8U ocrlen, INT8U *recbuf){ INT32U param = 0xF00000; /* 没有忙条件的OCR */ INT8U response[6],tmp; tmp = SD_SendCommand(CMD1, param, CMD1_R, response); /* 读 OCR 寄存器命令 read OCR register command */ if (tmp != SD_NO_ERR) return tmp; for (tmp = 0; tmp < 4; tmp++) recbuf[tmp] = response[tmp + 1]; /* 复制OCR寄存器内容到接收缓冲区 */ return SD_NO_ERR;}/*********************************************************************************************************** Function name: SD_SetBusWidth** Descriptions: set Bus SD/MMC data bus Width(SD card is D0 ~ D3, MMC card is D0) ** Input: INT16U RCA : the RCA of SD/MMC INT32U bwidth : 1: D0 ~ D3 is valid 0: only D0 is valid ** Output: 0: right >0: error code** Created by: Ming Yuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_SetBusWidth(INT16U RCA, INT32U bwidth){ INT32U param; INT8U response[6], ret; param = (INT32U)RCA << 16; ret = SD_SendCommand(CMD55, param, CMD55_R, response); if (ret != SD_NO_ERR) return ret; param = 0; if (bwidth == 1) param = 0x02; ret = SD_SendCommand(ACMD6, param, ACMD6_R, response); /* 发送写CSD寄存器命令 send command that write CSD */ if (ret != SD_NO_ERR) return ret; ret = SD_JudgeResult(&response[1]); /* 判断命令是否正确执行 */ if (ret != SD_NO_ERR) return ret; return SD_NO_ERR;} /********************************************************* 下面为一些数据传输函数 data transfer function **********************************************************//*********************************************************************************************************** Function name: SD_ReadBlockData** Descriptions: read block data from card** 从卡中读取数据块** Input: INT32U len : 长度 INT32U len : length INT8U *recbuf : 接收缓冲区 INT8U *recbuf : the buffer of receive INT32U timeout: 超时时间 INT32U timeout: time out** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf, INT32U timeout){ int i = 0; int cnt; INT32U tmp; INT32U stat = 0; /* recycle to receive data */ /* 循环接收数据 */ while (i < len) { stat = SDIDSTA; /* read data status register */ if (!card_insert) { SDIDSTA = stat; return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */ } /* 超时 timeout */ if (stat & SDIDSTA_TOUT) { SDIDSTA = stat; /* clear */ return SD_ERR_TIMEOUT_READ; } stat = SDIFSTA; /* 读FIFO状态寄存器 read FIFO status register */ if (stat & SDIFSTA_RX) { cnt = (stat & SDIFSTA_CNT); /* 读FIFO 计数器 read FIFO counter */ while (cnt) { tmp = SDIDAT; /* 从FIFO中读出数据 read data from FIFO */ recbuf[i] = (INT8U)(tmp); recbuf[i + 1] = (INT8U)(tmp >> 8); recbuf[i + 2] = (INT8U)(tmp >> 16); recbuf[i + 3] = (INT8U)(tmp >> 24); i += sizeof(INT32U); cnt -= sizeof(INT32U); } } } do { stat = SDIDSTA; if (!card_insert) { SDIDSTA = stat; return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */ } } while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN)); //不“超时”而且“数据未传输完成“时一直循环 SDIDSTA = stat; /* clear data status register */ return SD_NO_ERR; }/*********************************************************************************************************** Function name: SD_WriteBlockData** Descriptions: write block data to SD/MMC card** 向SD/MMC卡写数据块** Input: INT8U bmulti : 是否为多块操作1:是0:否 INT8U bmulti : multi blocks operate 1:Y 0:N INT32U len : 长度 INT32U len : length INT8U *sendbuf: 发送缓冲区 INT8U *sendbuf : the buffer of send INT32U timeout: 超时时间 INT32U timeout : time out** Output: 0: 正确 >0: 错误码 0: right >0: error code** Created by: MingYuan Zheng 郑明远 ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf, INT32U timeout){ int i = 0; int cnt; INT32U stat; /* recycle to write data to SD/MMC */ /* 下面的循环地往FIFO写入数据 */ while (i < len) { stat = SDIDSTA; /* 读数据状态寄存器 read data status register */ if (!card_insert) { SDIDSTA = stat; return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */ } stat = SDIFSTA; /* 读FIFO状态寄存器 read FIFO status register */ if (stat & SDIFSTA_TX) { /* 如果TX FIFO有效 if TX FIFO is valid */ cnt = SDI_MAX_TX_FIFO - (stat & SDIFSTA_CNT); /* 64 - FIFO中的字节数 */ while (cnt) { SDIDAT = (sendbuf[i + 3] << 24) + (sendbuf[i + 2] << 16) + (sendbuf[i + 1] << 8) + sendbuf[i]; i += sizeof(INT32U); cnt -= sizeof(INT32U); } } } do { stat = SDIDSTA; if (!card_insert) { SDIDSTA = stat; return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */ } }while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN)); SDIDSTA = stat; /* clear data status register */ return SD_NO_ERR;}/*********************************************************************************************************** End Of File**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -