?? sdcmd.c
字號:
/***********************************
CMD12: 停止傳輸Stop Transmission
************************************/
/*******************************************************************************************************************
** 函數名稱: SdCmd_Send_Stop()
**
** 功能描述: CMD12, 停止數據傳輸命令
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: 該命令的argument域不必關心, 當主機需要停止讀多個數據塊或停止寫多個數據塊時調用該函數
********************************************************************************************************************/
INT8U SpiCmd_Stop_Transmission(sd_struct *sds)
{
INT8U param[4] = {0,0,0,0},resp;
return (SdSpi_SendCmd(sds, CMD12, param, CMD12_R, &resp)); /* 結束數據傳輸命令失敗 stop transmission command fail */
}
/*********
CMD13
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Send_Status()
**
** 功能描述: 讀SD/MMC卡的 Card Status 寄存器
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT8U len : 寄存器長度(固定為2)
**
** 輸 出: INT8U *recbuf : 接收緩沖區
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意:
********************************************************************************************************************/
INT8U SpiCmd_Send_Status(sd_struct *sds, INT8U len, INT8U *buffer)
{
INT8U param[4] = {0,0,0,0};
return (SdSpi_SendCmd(sds, CMD13, param, CMD13_R, buffer)); /* 讀 Card Status 寄存器 */
}
/*********
CMD16
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Set_BlockLen()
**
** 功能描述: 設置卡的數據塊長度
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U length : 數據塊的長度值
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: 通常卡的一個讀數據塊長度與一個寫數據塊長度一樣
********************************************************************************************************************/
INT8U SpiCmd_Set_BlockLen(sd_struct *sds, INT32U length)
{
INT8U param[4],resp,ret;
SdSpi_PackParam(param, length); /* 將參數轉化為字節形式 change the parameter to bytes form */
ret = SdSpi_SendCmd(sds, CMD16, param, CMD16_R, &resp);
if (ret != SD_NO_ERR)
return ret; /* 設置塊的長度為length失敗 set the length of block to length fail */
if (resp != 0)
return SD_ERR_CMD_RESP; /* 響應錯誤 response is error */
return SD_NO_ERR; /* 返回執行成功 return perform sucessfully */
}
/*********
CMD17
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Read_Single_Block()
**
** 功能描述: 讀單塊命令
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U blockaddr: 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: blockaddr是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SpiCmd_Read_Single_Block(sd_struct *sds, INT32U blockaddr)
{
return (SdSpi_BlockCommand(sds, CMD17, CMD17_R, blockaddr)); /* 讀單塊命令 command that read single block */
}
/*********
CMD18
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Read_Single_Block()
**
** 功能描述: 讀多塊命令
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U blockaddr: 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: blockaddr是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SpiCmd_Read_Multiple_Block(sd_struct *sds, INT32U blockaddr)
{
return (SdSpi_BlockCommand(sds, CMD18, CMD18_R, blockaddr)); /* 讀多塊命令 command that read multiple block */
}
/*********
CMD24
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Write_Single_Block()
**
** 功能描述: 寫單塊命令
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U blockaddr: 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: blockaddr是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SpiCmd_Write_Single_Block(sd_struct *sds, INT32U blockaddr)
{
return (SdSpi_BlockCommand(sds, CMD24, CMD24_R, blockaddr)); /* 寫單塊命令 command that write single block */
}
/*********
CMD25
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Write_Multiple_Block()
**
** 功能描述: 寫多塊命令
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U blockaddr: 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: blockaddr是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SpiCmd_Write_Multiple_Block(sd_struct *sds, INT32U blockaddr)
{
return (SdSpi_BlockCommand(sds, CMD25, CMD25_R, blockaddr)); /* 寫多塊命令 command that write multiple block */
}
/*********
CMD25
**********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_Program_CSD()
**
** 功能描述: 寫CSD寄存器
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT8U *buff : CSD寄存器內容
** INT8U len : CSD寄存器長度
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意:
********************************************************************************************************************/
INT8U SpiCmd_Program_CSD(sd_struct *sds, INT8U len, INT8U *buff)
{
INT8U param[4] = {0,0,0,0},resp,ret;
if (len != 16) return SD_ERR_USER_PARAM;
ret = SdSpi_SendCmd(sds, CMD27, param, CMD27_R, &resp); /* 發送寫CSD寄存器命令 send command that write CSD */
if (ret != SD_NO_ERR)
return ret;
if (resp != 0)
return SD_ERR_CMD_RESP;
buff[15] = (SdSpi_GetCRC7(buff, 15) << 1) + 0x01; /* 計算CSD中的crc 位域 calculate crc field in CSD */
return(SdSpi_WriteBlockData(sds, 0, 16, buff));
}
/********************************************************************************************************************
** 函數名稱: INT8U SD_GetCRC7() Name: INT8U SD_GetCRC7()
** 功能描述: 計算CRC7 Function: calculate crc7
** 輸 入: INT8U *pSource: 數據 Input: INT8U *pSource: data
INT16U len : 數據長度 INT16U len : data length
** 輸 出: CRC7碼 Output: CRC7 code
*********************************************************************************************************************/
INT8U SdSpi_GetCRC7(INT8U *pSource, INT16U len)
{
INT8U i = 0, j;
INT8U reg = 0;
do
{
for (j = 0; j < 8; j++)
{
reg <<= 1;
reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
}
i++;
}while(i < len);
return reg;
}
#if SD_EraseBlock_EN
/***************
CMD32或CMD35
***************/
/*******************************************************************************************************************
** 函數名稱: SdCmd_Erase_Wr_Blk_Start()
**
** 功能描述: 設置塊擦除起始地址
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U startblock : 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: startblock是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SdCmd_Erase_Wr_Blk_Start(sd_struct *sds, INT32U startblock)
{
if (sds->card_type == CARDTYPE_SD)
return (SdSpi_BlockCommand(sds, CMD32, CMD32_R, startblock)); /* 發送擦除起始塊地址 send the start block address of erasing operation */
else
return (SdSpi_BlockCommand(sds, CMD35, CMD35_R, startblock)); /* 發送擦除起始塊地址 send the start block address of erasing operation */
}
/*****************
CMD33 或 CMD36
*****************/
/*******************************************************************************************************************
** 函數名稱: SdCmd_Erase_Wr_Blk_End()
**
** 功能描述: 設置塊擦除終止地址
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT32U endblock : 塊地址
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: startblock是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SdCmd_Erase_Wr_Blk_End(sd_struct *sds, INT32U endblock)
{
if (sds->card_type == CARDTYPE_SD)
return (SdSpi_BlockCommand(sds, CMD33, CMD33_R, endblock)); /* 發送擦除終止塊地址 send the end block address of erasing operation */
else
return (SdSpi_BlockCommand(sds, CMD36, CMD36_R, endblock)); /* 發送擦除終止塊地址 send the end block address of erasing operation */
}
/*****************
CMD38
*****************/
/*******************************************************************************************************************
** 函數名稱: SdCmd_Erase()
**
** 功能描述: 擦除已選中的塊
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
**
** 注 意: startblock是以塊為單位的塊地址
********************************************************************************************************************/
INT8U SdCmd_Erase(sd_struct *sds)
{
INT8U param[4],resp,tmp;
SdSpi_PackParam(param, 0);
tmp = SdSpi_SendCmd(sds, CMD38, param, CMD38_R, &resp); /* 擦除所選擇的塊 erase blocks selected */
if (tmp != SD_NO_ERR)
return tmp;
if (SdSpi_WaitBusy(sds, SD_WAIT_ERASE) != SD_NO_ERR) /* 等待擦除完成 wait for finishing erasing */
return SD_ERR_TIMEOUT_ERASE;
else
return SD_NO_ERR;
}
#endif
/*****************
CMD58
*****************/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_ReadOCR()
**
** 功能描述: 讀所選擇的卡的操作條件寄存器OCR
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
**
** 輸 出: INT32U *ocrbuf : OCR寄存器內容, 長度為1
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SpiCmd_ReadOCR(sd_struct *sds, INT32U *ocrbuf)
{
INT8U param[4] = {0,0,0,0},resp[5],tmp;
tmp = SdSpi_SendCmd(sds, CMD58, param, CMD58_R, resp); /* 讀 OCR 寄存器命令 */
if (tmp != SD_NO_ERR) /* read OCR register command */
return tmp;
if (resp[4] != 0)
return SD_ERR_CMD_RESP; /* 響應錯誤 response is error */
*ocrbuf = (resp[3] << 24) + (resp[2] << 16) +
(resp[1] << 8) + resp[0]; /* 復制OCR寄存器內容到接收緩沖區 */
return SD_NO_ERR;
}
/********
CMD59
*********/
/*******************************************************************************************************************
** 函數名稱: SpiCmd_CRC_ON_OFF()
**
** 功能描述: SPI模式下, 使能主機與卡之間的數據傳輸是否使用CRC校驗
**
** 輸 入: sd_struct *sds : SD/MMC卡信息結構體
** INT8U bEnable : 1: 使能; 0: 禁止
**
** 輸 出: 無
**
** 返 回 值: 0: 正確 >0: 錯誤碼, 見 sddriver.h 文件
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -