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

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

?? sdcmd.c

?? Read MP3 from sd,send vs1003 decode
?? C
?? 第 1 頁 / 共 3 頁
字號:
#endif

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

/********************************************************************************************************************
** 函數名稱: uint8 SD_ReadRegister()				Name:	  uint8 SD_ReadRegister()
** 功能描述: 從SD卡讀取數據							Function: read data from SD card
** 輸   入: uint32 len	  : 長度					Input:	  uint32 len   : length
			 uint8 *recbuf: 接收緩沖區					 	  uint8 *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_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;
}	

/*******************************************************************************************************************
** 函數名稱: uint8 SD_ReadBlockData()			Name:	  uint8 SD_ReadBlockData()
** 功能描述: 從卡中讀取數據塊					Function: read block data from card
** 輸   入: uint32 len    : 長度				Input:	  uint32 len    : length
			 uint8 *recbuf : 接收緩沖區					  uint8 *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,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 */
			Uart_Printf("SPI_RecByte data is  0x%x \t \n", recbuf[i]);
		}
    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 */
}

/*******************************************************************************************************************
** 函數名稱: uint8 SD_WriteBlockData()				Name:	  uint8 SD_WriteBlockData()
** 功能描述: 向卡寫數據塊							Function: write block data to card
** 輸   入: uint8 bmulti  : 是否為多塊操作1:是0:否 Input:	  uint8 bmulti   : multi blocks operate 1:Y 0:N 
			 uint32 len    : 長度						  	  uint32 len     : length
			 uint8 *sendbuf: 發送緩沖區					 	  uint8 *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
** 輸   入: uint32 waittype: 超時類型				Input:	  uint32 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;				/* 等待類型為寫操作 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 
** 輸   入: uint8 value: 延時值,不超過255		    Input:	  uint8 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一区二区三区免费野_久草精品视频
丁香啪啪综合成人亚洲小说 | 美脚の诱脚舐め脚责91| 欧美亚洲国产怡红院影院| 亚洲人快播电影网| 色天天综合久久久久综合片| 亚洲一区二区视频| 日韩一区二区电影| 国产福利91精品一区二区三区| 国产精品色噜噜| 欧美伊人久久久久久午夜久久久久| 亚洲国产日日夜夜| 91精品国产品国语在线不卡| 国产精品一线二线三线| 国产精品久久看| 欧美日韩国产天堂| 精品一区二区在线观看| 国产精品理伦片| 欧美日韩午夜影院| 国产一区视频在线看| 亚洲日本一区二区三区| 91精品国产一区二区| 国产成人自拍高清视频在线免费播放| 中文字幕在线观看不卡| 色美美综合视频| 久草热8精品视频在线观看| 国产精品二三区| 91精品欧美福利在线观看| 国产成人啪午夜精品网站男同| 亚洲日本在线天堂| 精品欧美久久久| 欧美最猛黑人xxxxx猛交| 另类综合日韩欧美亚洲| 一区二区在线观看不卡| 精品国产乱码久久久久久久久| 91麻豆成人久久精品二区三区| 石原莉奈在线亚洲三区| 国产精品久久久久久亚洲伦| 3d动漫精品啪啪| www.99精品| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲韩国精品一区| 国产视频一区二区三区在线观看| 在线观看视频一区| 国产盗摄女厕一区二区三区| 日韩精品电影在线| 亚洲美女精品一区| 久久精品一区蜜桃臀影院| 欧美一区二区三区公司| 日本道免费精品一区二区三区| 国产一区二区网址| 日本va欧美va精品发布| 伊人开心综合网| 国产精品视频在线看| 精品久久一二三区| 8x福利精品第一导航| 在线免费不卡电影| 97精品电影院| 成人97人人超碰人人99| 精品一区二区三区香蕉蜜桃 | 狠狠色综合播放一区二区| 亚洲成人高清在线| 亚洲欧洲精品一区二区三区不卡 | 国产精品白丝在线| 久久久国产精品麻豆| 91精品国产综合久久精品app| 91国内精品野花午夜精品| 不卡大黄网站免费看| 调教+趴+乳夹+国产+精品| 白白色亚洲国产精品| 日日嗨av一区二区三区四区| 一区二区三区欧美日| 亚洲精品欧美激情| 亚洲欧美福利一区二区| 综合久久久久综合| 综合久久久久久久| 亚洲色图.com| 亚洲美女精品一区| 夜夜亚洲天天久久| 一区二区三区国产豹纹内裤在线| 亚洲欧美日韩国产中文在线| 亚洲精品免费视频| 亚洲影院久久精品| 亚洲国产成人porn| 日韩成人dvd| 久久国产视频网| 国产一区在线视频| 波多野结衣91| 一本久久精品一区二区| 欧美亚洲综合网| 56国语精品自产拍在线观看| 欧美一区二区在线免费观看| 日韩一级欧美一级| 2021国产精品久久精品 | 日韩精品一区二区三区四区 | 欧美午夜片在线看| 午夜伦欧美伦电影理论片| 亚洲宅男天堂在线观看无病毒| 一区二区免费在线| 天天综合网 天天综合色| 日韩av一区二区三区| 久久国产日韩欧美精品| 成人午夜免费电影| 色噜噜狠狠色综合中国| 欧美精品三级在线观看| 精品国偷自产国产一区| 国产欧美日韩久久| 亚洲精品国产a久久久久久| 日韩精品亚洲专区| 国产精品一区二区久激情瑜伽| 成人免费视频视频在线观看免费| 91在线免费视频观看| 在线不卡a资源高清| 久久久久97国产精华液好用吗| 国产精品国产精品国产专区不片| 亚洲国产欧美另类丝袜| 经典一区二区三区| 色哟哟欧美精品| 日韩视频在线一区二区| 综合在线观看色| 另类小说视频一区二区| www.亚洲国产| 天天操天天干天天综合网| 69堂亚洲精品首页| 精品久久久久99| 国产精品传媒入口麻豆| 亚洲国产中文字幕在线视频综合| 蜜臀av性久久久久蜜臀aⅴ | 不卡一区二区三区四区| 欧美视频一区二| 日本一区二区免费在线观看视频| 一区二区三区中文免费| 国产伦理精品不卡| 欧美日韩亚洲综合一区二区三区| 国产日韩欧美精品电影三级在线| 亚洲第四色夜色| aaa欧美日韩| 精品久久久久av影院| 亚洲va韩国va欧美va| 高清不卡一二三区| 欧美一区二区观看视频| 一区二区三区在线视频播放| 国内精品嫩模私拍在线| 在线播放视频一区| 一区二区三区高清在线| 成人av午夜影院| 久久久蜜桃精品| 免费精品99久久国产综合精品| 色婷婷综合激情| 国产精品久久午夜| 国产精品综合一区二区三区| 欧美一级搡bbbb搡bbbb| 亚洲成av人片| 欧美午夜精品久久久久久孕妇| 国产精品福利电影一区二区三区四区| 国产精品自在在线| 91精品国产免费| 丝袜脚交一区二区| 欧美日本一区二区三区| 亚洲一区二区三区精品在线| 91麻豆蜜桃一区二区三区| 亚洲日本va午夜在线电影| 国内精品久久久久影院薰衣草| 69精品人人人人| 日韩国产欧美在线播放| 欧美乱妇15p| 日韩av中文字幕一区二区| 精品视频在线免费| 一区二区理论电影在线观看| 色偷偷成人一区二区三区91 | 色综合久久九月婷婷色综合| 亚洲三级电影网站| 91国模大尺度私拍在线视频| 一区二区三区中文字幕| 欧美三级日韩在线| 午夜日韩在线观看| 在线播放亚洲一区| 另类小说综合欧美亚洲| 久久久蜜臀国产一区二区| 福利视频网站一区二区三区| 中文字幕在线不卡| 91免费观看国产| 一个色在线综合| 欧美性色黄大片| 日本美女一区二区三区视频| 日韩精品最新网址| 国产成人综合在线| 亚洲特级片在线| 欧美日韩一级大片网址| 麻豆成人av在线| 国产精品久久久久久久久久久免费看 | 国产婷婷色一区二区三区 | 亚洲人xxxx| 宅男在线国产精品| 黄网站免费久久| 亚洲婷婷国产精品电影人久久| 欧洲一区二区三区在线| 日本91福利区| 国产精品美女一区二区三区| 在线亚洲人成电影网站色www| 美女视频免费一区|