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

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

?? sdcmd.c

?? SD卡開發源程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
    if (resp != 0)
    	return SD_ERR_CMD_RESP;    	
 											
   	ret = SD_SendCmd(ACMD22, tmp, ACMD22_R, &resp);  			/* 讀取正確寫入的塊數命令 */
   	if (ret != SD_NO_ERR)										/* command that read the numbers of block written correctly */
   		return ret;											    
   		 														
	if (resp != 0)
    	return SD_ERR_CMD_RESP;									/* 響應錯誤 response is error */
    		
    ret = SD_ReadBlockData(4, tmp);								/* 讀塊數 read the numbvers of block */
    if (ret != SD_NO_ERR)
    	return ret;
    	
    *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];	
    															/* 轉換為32位 change to 32 bits */

	return SD_NO_ERR;    										/* 返回執行成功 return perform sucessfully */		
}
#endif

		/*********************************************************
		
		    			下面為一些數據傳輸函數
		
		**********************************************************/

/********************************************************************************************************************
** 函數名稱: 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
*********************************************************************************************************************/
uint8 SD_ReadRegister(uint32 len, uint8 *recbuf)
{	
	uint32 i = 0;
	uint8 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_CS_Deassert();
   		SPI_SendByte(0xFF);    						
  		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()
** 功能描述: 從SD卡中讀取數據塊					Function: read block data from sd card
** 輸   入: INT32U len    : 長度				Input:	  INT32U len    : length
			 INT8U *recbuf : 接收緩沖區					  INT8U *recbuf : the buffer of receive
** 輸   出: 0:   正確    >0:   錯誤碼		  	Output:	  0:  right		>0:  error code
*******************************************************************************************************************/
uint8 SD_ReadBlockData(uint32 len, uint8 *recbuf)
{
    uint8 tmp;
    uint32 i = 0;

    SPI_CS_Assert();    
    do
    { 											    /* 等待接收數據開始令牌0xFE  wait for receiving data start token 0xFE */
        tmp = SPI_RecByte();
        i++;
     }while((tmp == 0xFF) && (i < sds.timeout_read));
	
	if (i >= sds.timeout_read)
	{
		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))
   	{												/* CRC校驗錯誤 CRC check is error */
   		SPI_SendByte(0xFF); 
   		SPI_CS_Deassert();  						
  		return SD_ERR_DATA_CRC16;					/* 返回CRC16錯誤  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()
** 功能描述: 向sd卡寫數據塊							Function: write block data to sd card
** 輸   入: INT8U bmulti  : 是否為多塊操作1:是0:否 Input:	  INT8U bmulti   : multi blocks operate 1:Y 0:N 
			 INT32U len    : 長度						  	  INT32U len     : length
			 INT8U *sendbuf: 發送緩沖區					 	  INT8U *sendbuf : the buffer of send
** 輸   出: 0:   正確    >0:   錯誤碼		  		Output:	  0:  right		>0:  error code
********************************************************************************************************************/
uint8 SD_WriteBlockData(uint8 bmulti, uint32 len, uint8 *sendbuf)
{
	uint16 i;
	uint8 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 ((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 */
    }
        
    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
*********************************************************************************************************************/
uint8 SD_WaitBusy(uint8 waittype)
{
    uint32 timeout, i = 0;
    uint8 tmp;
    
    if (waittype == SD_WAIT_WRITE)
    	timeout = sds.timeout_write;
    else
    	timeout = sds.timeout_erase;

	SPI_CS_Assert();
   	do
   	{ 												/* 等待忙結束 wait for being busy end */
        tmp = SPI_RecByte();
        i++;
    }while ((tmp != 0xFF) && (i < timeout));		/* 忙時收到的值為0xFF always receive 0xFF when card is busy */    
	SPI_CS_Deassert();								/* 有錯 */
	
	if(i < timeout) 
		return SD_NO_ERR;							/* 返回0,表示沒超時 return 0 indicate that operation is not time out */
	else 
		return SD_ERR_TIMEOUT_WAIT;					/* 返回錯誤碼,表示超時 return error code indicate that operation is time out */
}

/********************************************************************************************************************
** 函數名稱: 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(uint8 value)
{
    uint8 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一区二区三区免费野_久草精品视频
99九九99九九九视频精品| 欧美日韩另类国产亚洲欧美一级| 亚洲三级免费观看| 91精品婷婷国产综合久久性色| 懂色一区二区三区免费观看| 丝袜亚洲精品中文字幕一区| 中文字幕久久午夜不卡| 88在线观看91蜜桃国自产| 成人午夜电影小说| 免费观看日韩电影| 尤物视频一区二区| 国产无人区一区二区三区| 欧美日韩精品欧美日韩精品| 99精品国产热久久91蜜凸| 久久国产视频网| 视频一区欧美精品| 亚洲国产视频一区二区| 国产精品国产馆在线真实露脸 | 国产成人亚洲精品青草天美| 亚洲第一二三四区| 国产精品久久久久久久久免费相片 | 久久久久久久久免费| 欧美日韩激情一区二区三区| www.色综合.com| 国产99精品在线观看| 韩国v欧美v日本v亚洲v| 日本欧美一区二区三区乱码 | 日韩高清国产一区在线| 一区二区日韩av| **欧美大码日韩| 国产精品美女一区二区在线观看| 欧美成人高清电影在线| 欧美男男青年gay1069videost| 欧美最猛性xxxxx直播| 91色在线porny| 91免费在线视频观看| 91在线观看成人| 99久久综合99久久综合网站| 波多野结衣一区二区三区| 高清日韩电视剧大全免费| 国产伦精品一区二区三区在线观看| 久久精品久久精品| 精品一区二区免费在线观看| 久久精品理论片| 国产酒店精品激情| 懂色av中文字幕一区二区三区 | 有坂深雪av一区二区精品| 亚洲另类在线视频| 亚洲天堂免费看| 亚洲精品日日夜夜| 亚洲国产精品视频| 日韩经典中文字幕一区| 久久国产精品无码网站| 精品一区二区av| 成人一区在线观看| 91网址在线看| 欧美在线综合视频| 91精品国产麻豆| 久久一区二区视频| 国产精品不卡视频| 一区二区三区四区精品在线视频| 一区二区视频在线| 午夜精品久久久久影视| 久久精品理论片| 高清国产一区二区| 一本久道久久综合中文字幕| 欧美日韩一级二级三级| 欧美不卡123| 国产精品区一区二区三| 一区二区久久久| 蜜桃视频在线观看一区二区| 国产盗摄视频一区二区三区| 一本久久a久久免费精品不卡| 在线成人高清不卡| 久久久久99精品一区| 亚洲图片另类小说| 青椒成人免费视频| 成人激情开心网| 7799精品视频| 久久精品一区二区三区av| 亚洲欧美区自拍先锋| 蜜桃av一区二区三区电影| 波多野结衣亚洲| 51午夜精品国产| 中文字幕在线不卡国产视频| 日本亚洲三级在线| www.亚洲在线| 欧美成人精品高清在线播放| 亚洲少妇最新在线视频| 免费在线观看成人| 91蜜桃在线免费视频| 精品国产成人在线影院 | 亚洲成人资源网| 国产精品123区| 91精品免费观看| 国产精品夫妻自拍| 激情五月婷婷综合网| 在线中文字幕不卡| 国产精品丝袜黑色高跟| 日韩黄色片在线观看| 91麻豆免费观看| 久久亚洲二区三区| 午夜日韩在线观看| eeuss鲁片一区二区三区在线观看| 欧美猛男gaygay网站| 中文字幕成人av| 韩国精品免费视频| 91精品国产91综合久久蜜臀| 国产精品嫩草99a| 国产综合色在线视频区| 欧美精品在线观看一区二区| 亚洲另类中文字| fc2成人免费人成在线观看播放| 欧美精品一区二区三区高清aⅴ| 亚洲成a人在线观看| 欧美综合在线视频| 国产精品情趣视频| 国产大陆精品国产| 久久精品人人做人人爽人人| 麻豆精品久久久| 欧美精品一卡两卡| 亚洲午夜电影在线观看| 日本高清成人免费播放| 亚洲欧美综合另类在线卡通| 国产一区二区精品久久| 日韩女同互慰一区二区| 青青草原综合久久大伊人精品 | 婷婷丁香激情综合| 欧美视频在线播放| 日韩美女精品在线| 不卡的看片网站| 中文字幕精品在线不卡| 不卡视频一二三四| 国产精品久99| av在线不卡网| √…a在线天堂一区| 91麻豆免费看片| 亚洲自拍偷拍av| 欧美三级日韩三级| 日韩专区中文字幕一区二区| 91精品国产欧美一区二区成人 | 精品福利一区二区三区免费视频| 日韩不卡一二三区| 制服丝袜中文字幕一区| 开心九九激情九九欧美日韩精美视频电影| 欧美一区2区视频在线观看| 日本视频一区二区三区| 精品久久久久久久久久久久久久久久久 | 欧美激情在线一区二区| 成人听书哪个软件好| 国产精品麻豆视频| 色成年激情久久综合| 午夜成人免费视频| 日韩精品综合一本久道在线视频| 激情综合色丁香一区二区| 久久一留热品黄| 不卡的av中国片| 亚洲图片一区二区| 日韩精品一区二区三区四区| 国内精品伊人久久久久影院对白| 国产亚洲欧美日韩俺去了| 成人av高清在线| 亚洲国产日韩一级| 日韩欧美123| 成人国产亚洲欧美成人综合网| 亚洲色图欧美激情| 欧美日韩一区 二区 三区 久久精品 | 国产清纯白嫩初高生在线观看91| 国产91高潮流白浆在线麻豆| 亚洲美女淫视频| 在线不卡中文字幕播放| 国产精品456| 一区二区三区四区激情| 日韩一区二区免费在线电影| 国产suv一区二区三区88区| 一区二区三区日韩| 日韩精品自拍偷拍| 91在线观看免费视频| 麻豆国产精品一区二区三区| 中文字幕欧美日韩一区| 欧美日韩的一区二区| 国产成人av影院| 亚洲成av人片www| 国产精品色在线| 日韩一区二区三区视频在线| 成人avav在线| 精品一区二区三区免费观看 | 国产综合一区二区| 亚洲另类色综合网站| www成人在线观看| 在线中文字幕一区二区| 国产成人亚洲综合a∨猫咪| 亚洲第一激情av| 国产精品久线在线观看| 日韩免费高清av| 欧美探花视频资源| 国产 欧美在线| 精品一区二区三区免费播放| 亚洲午夜影视影院在线观看| 欧美国产一区视频在线观看|