亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sdcmd.c

?? 基于ST公司的STM32系列MCU的SD CARD驅動程序完整源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
** 函數名稱: INT8U SD_ReadRegister()		Name:	  INT8U SD_ReadRegister()
** 功能描述: 從SD卡讀取數據			Function: read data from SD card
** 輸   入: INT32U len	  : 長度		Input:	  INT32U len   : length
			 INT8U *recbuf: 接收緩沖區	INT8U *recbuf: receive buffer
** 輸   出: 0:   正確    >0:   錯誤碼		Output:	  0:  right		>0:  error code
*********************************************************************************************************************/
INT8U SD_ReadRegister(INT32U len, INT8U *recbuf)
{	
	INT32U i = 0;
	INT8U resp;

    SPI_CS_Assert();
    do{    											/* 等待數據起始令牌 wait for data start token */
        resp = SPI_RecByte();
    	i++;
    }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));    
    
    if (i >= SD_READREG_TIMEOUT)
    {
    	SPI_CS_Deassert();
    	return SD_ERR_TIMEOUT_READ;					/* 超時, 返回錯誤 timeout, return error */
  	}
  	
   	if (resp != SD_TOK_READ_STARTBLOCK)				
   	{												/* 不是收到數據起始令牌 not receive data start token */
		recbuf[0] = resp;							
		i = 1;										/* 還有len - 1個字節要接收 still len - 1 bytes will be received */
   	}
   	else
   		i = 0;										/* 收到數據起始令牌,還有len個字節要接收 received data start token,still len bytes will be received */
   	  	
    for (; i < len; i++)
   		recbuf[i] = SPI_RecByte();					/* 接收數據 receive data */
   		
    i = SPI_RecByte();								
    i = (i << 8) + SPI_RecByte();    				/* 讀取16位CRC get 16-bit CRC */	

#if SD_CRC_EN 
   	if (i != SD_GetCRC16(recbuf, len))
   	{												/* CRC校驗錯誤 CRC check is error */
   		SPI_SendByte(0xFF);
   		SPI_CS_Deassert();		
  		return SD_ERR_DATA_CRC16;					/* 返回RCR16錯誤  return error of CRC16 */				
  	}    
#endif   
  
    SPI_SendByte(0xFF);								/* 返回之前發送8個clock  clock out 8 clk before return */
    SPI_CS_Deassert();	
    	
	return SD_NO_ERR;
}	

/*******************************************************************************************************************
** 函數名稱: INT8U SD_ReadBlockData()			Name:	  INT8U SD_ReadBlockData()
** 功能描述: 從卡中讀取數據塊					Function: read block data from card
** 輸   入: INT32U len    : 長度				Input:	  INT32U len    : length
			 INT8U *recbuf : 接收緩沖區					  INT8U *recbuf : the buffer of receive
** 輸   出: 0:   正確    >0:   錯誤碼		  	Output:	  0:  right		>0:  error code
*******************************************************************************************************************/
INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf)
{
    INT8U tmp;
    INT32U i = 0,timeout;
    
#if SD_UCOSII_EN    
    timeout = SD_UCOSII_SMALLWAIT;						/* 很少的等待時間 small wait time */
#else
	timeout = sds.timeout_read;							/* 等待接收數據開始令牌最長時間 wait time that receive data start token */
#endif  
    
    SPI_CS_Assert();    
    do
    { 											    	/* 等待接收數據開始令牌0xFE  wait for receiving data start token 0xFE */
        tmp = SPI_RecByte();
        i++;
    }while((tmp == 0xFF) && (i < timeout));
	
#if SD_UCOSII_EN    
    if (i >= timeout)
   	{													/* 繼續等待(掛起任務) continue to wait(suspend task) */
   		timeout = sds.timeout_read;
   		i = 0;
	    do
    	{
        	OSTimeDly(1);								/* 掛起該任務1 tick(suspend task 1 tick) */
        	tmp = SPI_RecByte();
       	 	i++;
   		}while((tmp == 0xFF) && (i < timeout));
	}
#endif

	if (i >= timeout)
	{
		SPI_CS_Deassert();
       	return SD_ERR_TIMEOUT_READ;						/* 返回讀超時錯誤碼  return error timeout error code of reading */
	}
	
	if (tmp != SD_TOK_READ_STARTBLOCK)					/* 塊讀開始令牌錯誤 read start block token is error */
	{
		SPI_SendByte(0xFF);
		SPI_CS_Deassert();
		return SD_ERR_DATA_START_TOK;
	}
	
	for (i = 0; i < len; i++)
   		recbuf[i] = SPI_RecByte();						/* 接收數據 receive data */
   		
    i = SPI_RecByte();								
    i = (i << 8) + SPI_RecByte();    					/* 讀取16位CRC get 16-bit CRC */	

#if SD_CRC_EN 
   	if (i != SD_GetCRC16(recbuf, len))
   	{	
   		SPI_SendByte(0xFF); 							/* CRC校驗錯誤 CRC check is error */
   		SPI_CS_Deassert();		
  		return SD_ERR_DATA_CRC16;						/* 返回RCR16錯誤  return error of CRC16 */				
  	}    
#endif   

	SPI_SendByte(0xFF); 
	SPI_CS_Deassert();

  	return SD_NO_ERR;/* 返回函數執行成功 return function perform sucessfully */
}

/*******************************************************************************************************************
** 函數名稱: INT8U SD_WriteBlockData()			Name:	  INT8U SD_WriteBlockData()
** 功能描述: 向卡寫數據塊				Function: write block data to card
** 輸   入: INT8U bmulti  : 是否為多塊操作1:是0:否     Input:INT8U bmulti   : multi blocks operate 1:Y 0:N 
	INT32U len    : 長度					INT32U len     : length
	INT8U *sendbuf: 發送緩沖區			        NT8U *sendbuf : the buffer of send
** 輸   出: 0:   正確    >0:   錯誤碼		        Output:	  0:  right		>0:  error code
********************************************************************************************************************/
INT8U SD_WriteBlockData(INT8U bmulti, INT32U len, INT8U *sendbuf)
{
	INT16U i;
	INT8U tmp;

	SPI_CS_Assert();
		
    SPI_SendByte(0xFF);/* 開始發送數據之前發送8個clock clock out 8 clk before start */
    
    if (bmulti == 1)
        SPI_SendByte(SD_TOK_WRITE_STARTBLOCK_M);/* 寫多塊開始令牌 start token of write multi blocks */
	else
		SPI_SendByte(SD_TOK_WRITE_STARTBLOCK);	/* 寫單塊開始令牌 start token of write single block */

	for (i = 0; i < len; i++)
        SPI_SendByte(sendbuf[i]);	/* 發送數據 send data */

#if SD_CRC_EN	
	i = SD_GetCRC16(sendbuf,len);	/* 計算CRC16 calculate CRC16 */
#endif
	
	SPI_SendByte((i >> 8) & 0xFF);
	SPI_SendByte(i & 0xFF); 	/* 發送CRC16校驗碼 send CRC16 check code */
			    
	tmp = SPI_RecByte();

	#if 0
  	if ((tmp & SD_RESP_DATA_MSK) != SD_RESP_DATA_ACCETPTED)	
  	{		
   		SPI_SendByte(0xFF);		/* 返回之前發送8個clock  clock out 8 clk before return */
   		SPI_CS_Deassert();
   		return SD_ERR_DATA_RESP;	/* 數據響應錯誤 data response error */
    }
    #endif   

    SPI_CS_Deassert();
     		
    if (SD_WaitBusy(SD_WAIT_WRITE) != SD_NO_ERR)			
    	return SD_ERR_TIMEOUT_WRITE;		/* 寫入超時 write time out */
    else
    	return SD_NO_ERR; 			/* 寫入正確 write right */
 }

/*******************************************************************************************************************
** 函數名稱: void SD_StopMultiToken()		Name:	  void SD_StopMultiToken(void)
** 功能描述: 發送多塊寫停止令牌			Function: send the token that stop multiple block write
** 輸   入: 無					Input:	  NULL
** 輸   出: 無					Output:	  NULL
********************************************************************************************************************/
void SD_StopMultiToken(void)
{
	SPI_CS_Assert();
	
	SPI_SendByte(0xFF);								/* 先發送8個clock send 8 clock first */
	SPI_SendByte(SD_TOK_STOP_MULTI);/* 發送停止數據傳輸令牌 send stop transmission token */
	SPI_RecByte();
	
    SPI_CS_Deassert();
}


/********************************************************************************************************************
** 函數名稱: void SD_WaitBusy()		Name:	  void SD_WaitBusy()
** 功能描述: 查詢SD卡是否處于忙狀態	Function: poll SD Card wheather it is busy
** 輸   入: INT32U waittype: 超時類型	Input:	  INT32U timeout: time out type
** 輸   出: 0: 未超時  >0: 錯誤碼	Output:	  0: not time out   > 0: error code
*********************************************************************************************************************/
INT8U SD_WaitBusy(INT8U waittype)
{
    INT32U timeout, i = 0;
    INT8U tmp;
    
  	if (waittype == SD_WAIT_WRITE)
  		timeout = sds.timeout_write;		/* 等待類型為寫操作 wait type is write operation */
  	else
  		timeout = sds.timeout_erase;   		/* 等待類型為擦除操作 wait type is erase operation */
    	
#if SD_UCOSII_EN
        timeout = SD_UCOSII_SMALLWAIT;			/* 很少的等待時間 small wait time */
#endif
   
	SPI_CS_Assert();
   	do
   	{ 												/* 等待忙結束 wait for being busy end */
        tmp = SPI_RecByte();
        i++;
    }while ((tmp != 0xFF) && (i < timeout));		/* 忙時收到的值為0 always receive 0 when card is busy */    

#if SD_UCOSII_EN
	if (i >= timeout)
	{												/* 很少等待后卡仍忙, after small wait, card is still busy */
  		if (waittype == SD_WAIT_WRITE)
  			timeout = sds.timeout_write;
  		else
  			timeout = sds.timeout_erase;   
			
		i = 0;
   		do
   		{ 	
   			OSTimeDly(1);							/* 操作系統掛起1 tick  OS suspend 1 tick */
       		tmp = SPI_RecByte();
       		i++;
    	}while ((tmp != 0xFF) && (i < timeout));	/* 忙時收到的值為0 always receive 0 when card is busy */    
	}
#endif	

	if(i < timeout) 
		tmp = SD_NO_ERR;							/* 返回0,表示沒超時 return 0 indicate that operation is not time out */
	else 
		tmp = SD_ERR_TIMEOUT_WAIT;	/* 返回錯誤碼,表示超時 return error code indicate that operation is time out */

	SPI_SendByte(0xFF);
	SPI_CS_Deassert();								
	return tmp;	 /*返回執行結果 */
}

/********************************************************************************************************************
** 函數名稱: void SD_SPIDelay()		Name:	  void SD_SPIDelay()
** 功能描述: SPI總線延時		Function: SPI Bus delay 
** 輸   入: INT8U value: 延時值,不超過255	Input:	  INT8U value : delay value,do not beyond 255
** 輸   出: 無					Output:	  NULL
*********************************************************************************************************************/
void SD_SPIDelay(INT8U value)
{
    INT8U i;

    for (i = 0; i < value; i++)
        SPI_SendByte(0xFF);	/* 發送0xFF clock out 0xFF */
}








?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲欧美日韩俺去了| 日本电影欧美片| 亚洲国产裸拍裸体视频在线观看乱了| 欧美成人一区二区三区片免费| 色婷婷综合久久久久中文一区二区| 国产一区二区在线观看视频| 婷婷久久综合九色综合绿巨人 | 中文在线资源观看网站视频免费不卡| 91黄色在线观看| 99久久精品情趣| 久久成人免费电影| 亚洲最大成人网4388xx| 国产精品久久三| 精品国产网站在线观看| 日韩一级精品视频在线观看| 欧美一区二区三区视频免费播放| 欧美亚一区二区| 欧美日韩一区二区三区四区| 日本二三区不卡| 欧美日韩一二区| 欧美亚洲国产一区二区三区| 日本久久一区二区| 欧亚一区二区三区| 欧美精品 国产精品| 欧美日韩精品一区二区天天拍小说 | 亚洲一区二区三区视频在线播放| 亚洲日本在线视频观看| 久久久久久99久久久精品网站| 2023国产精品视频| 国产女同性恋一区二区| 久久综合国产精品| 国产精品网站在线观看| 亚洲精品美国一| 亚洲国产日产av| 麻豆传媒一区二区三区| 韩国女主播成人在线| 成人久久18免费网站麻豆| 99久久久久免费精品国产 | 成人网在线免费视频| 国产一区二区三区四| 六月婷婷色综合| 日韩精品成人一区二区三区| 久久99精品国产麻豆婷婷| 国产风韵犹存在线视精品| 91网址在线看| 日韩情涩欧美日韩视频| 国产亚洲一区二区三区四区| 一区二区三区在线免费观看| 日本少妇一区二区| av在线不卡网| 欧美一区欧美二区| 中文字幕一区二区在线播放| 亚洲国产精品久久不卡毛片| 激情综合色综合久久| 成人白浆超碰人人人人| 日韩一区二区精品在线观看| 国产亚洲精品7777| 亚洲综合色婷婷| 国产一区二区在线电影| 欧美性猛交xxxx乱大交退制版| 久久久噜噜噜久噜久久综合| 国产精品国产三级国产| 人人狠狠综合久久亚洲| 欧美在线不卡一区| 国产精品视频看| 国产真实乱对白精彩久久| 欧美午夜片在线看| 国产视频一区二区在线观看| 一区二区三区欧美视频| 国产精品一区二区男女羞羞无遮挡| 一本一道久久a久久精品综合蜜臀| 精品久久一二三区| 性做久久久久久久久| 日本高清成人免费播放| 亚洲同性同志一二三专区| 粉嫩av一区二区三区在线播放| 日韩午夜激情av| 亚洲成人手机在线| 91麻豆免费看| 国产精品麻豆久久久| 国产成人啪午夜精品网站男同| 欧美精品乱码久久久久久| 亚洲国产高清在线观看视频| 日韩制服丝袜av| 欧美性一二三区| 亚洲在线视频网站| 色哟哟国产精品免费观看| 中文字幕在线不卡一区| 成人黄色电影在线| 国产精品素人视频| 国产91丝袜在线观看| 国产日韩欧美在线一区| 国产一区二区三区久久久| 精品国产sm最大网站免费看| 蜜桃视频一区二区三区在线观看| 51精品久久久久久久蜜臀| 婷婷久久综合九色国产成人 | 欧美va亚洲va香蕉在线| 奇米888四色在线精品| 欧美精品aⅴ在线视频| 免费观看91视频大全| 欧美不卡一区二区三区四区| 精品一区二区三区在线播放| 国产欧美一区在线| 91亚洲国产成人精品一区二三 | 在线看一区二区| 亚洲国产你懂的| 在线成人小视频| 国产尤物一区二区在线| 欧美国产日韩一二三区| 91视频国产资源| 一区二区激情小说| 在线播放欧美女士性生活| 日韩国产精品久久久久久亚洲| 欧美高清精品3d| 国产精一品亚洲二区在线视频| 国产日韩欧美综合在线| 色噜噜狠狠成人网p站| 天天综合天天做天天综合| 精品国产制服丝袜高跟| 美美哒免费高清在线观看视频一区二区 | xvideos.蜜桃一区二区| 成人自拍视频在线| 亚洲综合一区二区| 26uuu国产一区二区三区| jlzzjlzz亚洲女人18| 亚洲午夜久久久久中文字幕久| 欧美sm极限捆绑bd| 91麻豆高清视频| 久久www免费人成看片高清| 国产精品久久综合| 日韩一级大片在线观看| 粉嫩一区二区三区性色av| 亚洲国产欧美日韩另类综合| 亚洲精品在线免费播放| 成人性生交大合| 一区二区三区国产豹纹内裤在线| 欧美一区二区免费视频| 99精品一区二区三区| 久久国产精品一区二区| 亚洲一卡二卡三卡四卡五卡| 久久久久久麻豆| 91麻豆精品国产| 色哟哟欧美精品| av网站一区二区三区| 久久狠狠亚洲综合| 日韩高清在线观看| 一区二区在线观看免费视频播放| 久久久av毛片精品| 4hu四虎永久在线影院成人| 色偷偷成人一区二区三区91| 韩国成人精品a∨在线观看| 亚洲成人tv网| 一区二区三区四区亚洲| 国产精品久久久久精k8 | 国产精品久久久久久久岛一牛影视 | 欧美国产禁国产网站cc| 日韩三级中文字幕| 8x福利精品第一导航| 在线免费观看成人短视频| 不卡一区二区中文字幕| 国产成人免费av在线| 激情综合色综合久久综合| 日韩黄色免费网站| 图片区小说区国产精品视频| 亚洲一二三区不卡| 一区二区三区在线视频免费 | 欧美日韩在线精品一区二区三区激情| 99久久久免费精品国产一区二区| 韩国av一区二区三区| 国产综合久久久久久久久久久久 | 国产欧美一区二区精品性色超碰 | 91久久一区二区| 99久久久国产精品| 色欲综合视频天天天| 色网站国产精品| 91福利小视频| 日韩欧美一级二级| 国产精品美女久久福利网站| 一区二区三区日韩| 久久精品免费观看| 色综合久久久久久久久久久| 538prom精品视频线放| 久久九九99视频| 亚洲国产成人av网| 国产精品系列在线观看| 欧美性videosxxxxx| 精品免费日韩av| 亚洲免费av高清| 国精产品一区一区三区mba桃花| 成人国产精品免费观看视频| 91精品久久久久久久91蜜桃| 国产精品电影一区二区三区| 日韩电影在线观看一区| 成人av电影免费观看| 日韩欧美国产一区二区三区| 亚洲同性gay激情无套| 美脚の诱脚舐め脚责91| 色视频成人在线观看免| 国产欧美日韩综合|