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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sdcmd.c

?? 一份關(guān)于周立功的SD卡驅(qū)動
?? C
?? 第 1 頁 / 共 3 頁
字號:
	return SD_NO_ERR;    								 /* 返回執(zhí)行成功 return perform sucessfully */		
}
#endif

		/*********************************************************
		
		    			下面為一些數(shù)據(jù)傳輸函數(shù)
		
		**********************************************************/

/********************************************************************************************************************
** 函數(shù)名稱: INT8U SD_ReadRegister()				Name:	  INT8U SD_ReadRegister()
** 功能描述: 從SD卡讀取數(shù)據(jù)							Function: read data from SD card
** 輸   入: INT32U len	  : 長度					Input:	  INT32U len   : length
			 INT8U *recbuf: 接收緩沖區(qū)					 	  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{    											/* 等待數(shù)據(jù)起始令牌 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)				
   	{												/* 不是收到數(shù)據(jù)起始令牌 not receive data start token */
		recbuf[0] = resp;							
		i = 1;										/* 還有l(wèi)en - 1個字節(jié)要接收 still len - 1 bytes will be received */
   	}
   	else
   		i = 0;										/* 收到數(shù)據(jù)起始令牌,還有l(wèi)en個字節(jié)要接收 received data start token,still len bytes will be received */
   	  	
    for (; i < len; i++)
   		recbuf[i] = SPI_RecByte();					/* 接收數(shù)據(jù) 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);								/* 返回之前發(fā)送8個clock  clock out 8 clk before return */
    SPI_CS_Deassert();	
    	
	return SD_NO_ERR;
}	

/*******************************************************************************************************************
** 函數(shù)名稱: INT8U SD_ReadBlockData()			Name:	  INT8U SD_ReadBlockData()
** 功能描述: 從卡中讀取數(shù)據(jù)塊					Function: read block data from card
** 輸   入: INT32U len    : 長度				Input:	  INT32U len    : length
			 INT8U *recbuf : 接收緩沖區(qū)					  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;							/* 等待接收數(shù)據(jù)開始令牌最長時間 wait time that receive data start token */
#endif  
    
    SPI_CS_Assert();    
    do
    { 											    	/* 等待接收數(shù)據(jù)開始令牌0xFE  wait for receiving data start token 0xFE */
        tmp = SPI_RecByte();
        i++;
    }while((tmp == 0xFF) && (i < timeout));
	
#if SD_UCOSII_EN    
    if (i >= timeout)
   	{													/* 繼續(xù)等待(掛起任務(wù)) continue to wait(suspend task) */
   		timeout = sds.timeout_read;
   		i = 0;
	    do
    	{
        	OSTimeDly(1);								/* 掛起該任務(wù)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();						/* 接收數(shù)據(jù) 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;									/* 返回函數(shù)執(zhí)行成功 return function perform sucessfully */
}

/*******************************************************************************************************************
** 函數(shù)名稱: INT8U SD_WriteBlockData()				Name:	  INT8U SD_WriteBlockData()
** 功能描述: 向卡寫數(shù)據(jù)塊							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: 發(fā)送緩沖區(qū)					 	  INT8U *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);								/* 開始發(fā)送數(shù)據(jù)之前發(fā)送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]);					/* 發(fā)送數(shù)據(jù) send data */

#if SD_CRC_EN	
	i = SD_GetCRC16(sendbuf,len);					/* 計算CRC16 calculate CRC16 */
#endif

	SPI_SendByte((i >> 8) & 0xFF);
	SPI_SendByte(i & 0xFF); 						/* 發(fā)送CRC16校驗碼 send CRC16 check code */
			    
	tmp = SPI_RecByte();
  	if ((tmp & SD_RESP_DATA_MSK) != SD_RESP_DATA_ACCETPTED)	
  	{		
   		SPI_SendByte(0xFF);							/* 返回之前發(fā)送8個clock  clock out 8 clk before return */
   		SPI_CS_Deassert();
   		return SD_ERR_DATA_RESP;					/* 數(shù)據(jù)響應(yīng)錯誤 data response error */
    }
        
    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 */
 }

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


/********************************************************************************************************************
** 函數(shù)名稱: void SD_WaitBusy()						Name:	  void SD_WaitBusy()
** 功能描述: 查詢SD卡是否處于忙狀態(tài)					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
   	{ 												/* 等待忙結(jié)束 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);							/* 操作系統(tǒng)掛起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;										/* 返回執(zhí)行結(jié)果 */
}

/********************************************************************************************************************
** 函數(shù)名稱: 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);						 	/* 發(fā)送0xFF clock out 0xFF */
}








?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品免费在线| 欧美三级视频在线| 久久天堂av综合合色蜜桃网| 麻豆91精品91久久久的内涵| 91精品国产福利| 日本伊人色综合网| 欧美r级在线观看| 国产一区二区三区四区在线观看| 久久免费视频色| av影院午夜一区| 亚洲精品视频一区二区| 欧美日韩国产一区二区三区地区| 青青草97国产精品免费观看无弹窗版| 欧美成人激情免费网| 国产精品123区| 亚洲裸体xxx| 欧美一区二区日韩| 成人在线综合网| 亚洲一线二线三线久久久| 欧美日韩欧美一区二区| 精一区二区三区| 亚洲视频在线一区观看| 欧美三级三级三级| 精品制服美女久久| 最新高清无码专区| 日韩午夜小视频| 成人动漫一区二区三区| 五月综合激情婷婷六月色窝| 久久久久久电影| 欧美狂野另类xxxxoooo| 大胆欧美人体老妇| 亚洲3atv精品一区二区三区| 欧美激情一区二区三区蜜桃视频| 欧美亚男人的天堂| 风流少妇一区二区| 日韩黄色小视频| 亚洲视频一二三| 精品国产电影一区二区| 色94色欧美sute亚洲线路一久| 极品少妇一区二区三区精品视频| 亚洲欧洲日产国码二区| 欧美va日韩va| 欧美老女人在线| 色婷婷狠狠综合| 粉嫩一区二区三区性色av| 日本va欧美va瓶| 免费高清成人在线| 国产精品正在播放| 中文字幕一区av| 5858s免费视频成人| 99国产精品视频免费观看| 另类欧美日韩国产在线| 亚洲电影一级片| 亚洲视频每日更新| 中文字幕欧美激情| 精品国产欧美一区二区| 欧美日本乱大交xxxxx| 成人av网在线| 国产成人午夜视频| 久久99国产精品久久99果冻传媒| 香蕉av福利精品导航| 一区二区国产盗摄色噜噜| 中文一区在线播放| 国产日韩精品一区二区三区 | 日韩欧美一区二区三区在线| 91麻豆swag| 91麻豆6部合集magnet| www.色综合.com| 成人精品国产免费网站| 国产91精品露脸国语对白| 国产精品亚洲专一区二区三区 | 久久在线观看免费| 欧美一区二区精品| 欧美一区二区三区喷汁尤物| 欧美视频一区二区| 欧美日韩国产一级二级| 欧美日本不卡视频| 91精品在线免费| 日韩一区二区三区在线观看 | 欧美成人精品二区三区99精品| 欧美精品vⅰdeose4hd| 在线不卡a资源高清| 51精品秘密在线观看| 日韩久久精品一区| 久久久久久久网| 国产精品久久网站| 亚洲人成伊人成综合网小说| 亚洲精品一二三| 亚洲v精品v日韩v欧美v专区 | 色偷偷88欧美精品久久久| av高清久久久| 国产欧美精品一区二区色综合 | 国产精品国产自产拍高清av王其| 国产精品免费丝袜| 中文字幕一区二区三区不卡在线| 综合在线观看色| 亚洲午夜久久久久久久久电影院| 五月天激情综合网| 精品亚洲成av人在线观看| 成人性生交大片免费看中文 | 色激情天天射综合网| 精品视频一区二区三区免费| 日韩一区二区三区在线| 国产精品网站在线| 亚洲在线成人精品| 精品一区二区影视| 91麻豆福利精品推荐| 8v天堂国产在线一区二区| 久久精品水蜜桃av综合天堂| 国产色综合久久| 国产一区二区三区在线观看精品 | 亚洲日本青草视频在线怡红院| 久久久欧美精品sm网站| 一本色道a无线码一区v| 678五月天丁香亚洲综合网| 亚洲精品一线二线三线无人区| 综合久久一区二区三区| 日韩精品电影在线观看| 国产69精品久久久久777| 欧美日韩一区中文字幕| 国产日韩成人精品| 五月天激情综合| 不卡一区在线观看| 日韩一卡二卡三卡国产欧美| 国产精品国产三级国产普通话蜜臀| 图片区日韩欧美亚洲| 国产99久久久国产精品免费看| 欧美日韩三级在线| 亚洲国产成人私人影院tom| 日日夜夜精品视频天天综合网| 国产成人精品影视| 欧美一区二区女人| 亚洲美女在线一区| 国产成人免费视频精品含羞草妖精| 国产乱人伦偷精品视频不卡| 国产亚洲精品精华液| 99久久伊人久久99| 欧美情侣在线播放| 中文字幕一区二区三区蜜月| 国产伦精品一区二区三区免费 | 精品国产污网站| 亚洲一区二区三区爽爽爽爽爽| 国产成人综合精品三级| 日韩一级二级三级精品视频| 亚洲一区免费视频| 白白色亚洲国产精品| 国产亚洲一二三区| 久久99精品国产麻豆不卡| 91精品在线免费| 午夜精品一区在线观看| 99久久久国产精品免费蜜臀| 国产欧美一区在线| 国产一区二区免费在线| 欧美成人精品福利| 久久av中文字幕片| 欧美丰满高潮xxxx喷水动漫| 亚洲bdsm女犯bdsm网站| 欧美色图一区二区三区| 亚洲欧美日韩一区二区三区在线观看| 国产91精品在线观看| 国产婷婷色一区二区三区四区| 激情偷乱视频一区二区三区| 日韩女优制服丝袜电影| 六月丁香婷婷久久| 日韩一区二区三区在线观看| 裸体一区二区三区| 欧美一级在线观看| 青草av.久久免费一区| 日韩三级视频在线看| 美国十次综合导航| 国产成人日日夜夜| 久久99国产精品麻豆| 国产精品自拍av| 久久久精品国产免费观看同学| 国产一区二区在线观看免费| 精品国产91乱码一区二区三区| 91久久精品网| 亚洲二区在线观看| 日韩一区二区三区四区| 精品一区二区三区的国产在线播放 | 午夜精品成人在线视频| 欧美日韩综合在线| 日本麻豆一区二区三区视频| 日韩一级片在线观看| 国产又粗又猛又爽又黄91精品| 国产欧美一区二区三区沐欲| 92国产精品观看| 亚洲一区成人在线| 日韩欧美一二区| 国产夫妻精品视频| 亚洲品质自拍视频| 欧美精品在欧美一区二区少妇| 另类小说综合欧美亚洲| 国产亚洲精久久久久久| 91在线视频免费观看| 午夜精品久久久久久久| 久久综合狠狠综合| av成人老司机| 国产欧美一区二区精品性色超碰| 亚洲午夜精品网|