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

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

?? sdhal.c

?? 基于lpc2378的SD/MMC卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
    
    lpc_mci.RecCnt = 0;                                     /* 初始化mci_struct結構體全局變量lpc_mci */
    lpc_mci.RxTxFlag = MCI_RESET_FLAG;
    lpc_mci.psds = sds;    
    lpc_mci.CurTran = MCI_CUR_REC; 
         
	return SD_NO_ERR;
}


/*******************************************************************************************************************
** 函數名稱: SdHal_ReadBlock()				
**
** 功能描述: 在發送讀單塊命令之后, 由硬件控制器實現讀取數據
**
** 輸   入: sd_struct *sds  :  卡信息結構體 
**	         
** 輸   出: INT8U *recbuf: 接收緩沖區, 大小為512字節
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_ReadBlock(sd_struct *sds, INT8U *recbuf)
{
	INT32U DataCtrl = 0;
	INT8U ret;
			
	lpc_mci.pRecBuf = recbuf;	

#if LPC23xx_MCI_DMA_EN
    // DMA 控制器初始化
	DMA_Init(1, P2M);                                                           
	DMACC1Configuration |= 0x10001 | (0x04 << 1) | (0x00 << 6) | (0x06 << 11);
	
	// 設置數據控制寄存器: 讀,塊傳輸,DMA傳輸,塊長度
	DataCtrl |= ((1 << 0) | (1 << 1) | (1 << 3) | (SD_BLOCKSIZE_NBITS << 4));	    
#else
    // 設置數據控制寄存器: 讀,塊傳輸,塊長度
	DataCtrl |= ((1 << 0) | (1 << 1) | (SD_BLOCKSIZE_NBITS << 4));
#endif
	
#if SD_UCOSII_EN
    OS_ENTER_CRITICAL();
    MCIDataCtrl = DataCtrl;						                /* 啟動數據傳輸 */
    OSSemPend(sds->pSemSdmmcRW, sds->timeout_read_os, &ret);    /* 進入等待狀態 */
    if (ret == OS_NO_ERR)   
        ret = lpc_mci.RxTxFlag;                                 /* 返回數據接收結果 */                            
    else if (ret == OS_TIMEOUT)
        ret = SD_ERR_TIMEOUT_READ;                              /* 接收數據超時 */            
    else
        ret = SD_ERR_WAIT_WRSEM;                                /* 等待信號量失敗 */
    
    OS_EXIT_CRITICAL();
#else	
    MCIDataCtrl = DataCtrl;                                     /* 啟動數據傳輸 */
	do
	{                                                           /* 等待數據接收 */
	    if (lpc_mci.RxTxFlag == SD_NO_ERR)
	        break;                                              /* 數據接收成功 */
	}while (lpc_mci.RxTxFlag == MCI_RESET_FLAG);
	
	ret = lpc_mci.RxTxFlag;                                     /* 返回接收結果 */
#endif	

	MCIMask0 &= ~((DATA_RX_INT_MASK) | (FIFO_INT_MASK));        /* 僅禁止接收中斷 */
	MCIMask1 = MCIMask0;  	

#if LPC23xx_MCI_DMA_EN
    src_addr = (INT32U *)DMA_SRC;                               /* 取得 DMA 源地址 */         
	dest_addr = (INT32U *)DMA_DST;                              /* 取得 DMA 目標地址 */    
    if (ret == SD_NO_ERR)
        memcpy(recbuf, dest_addr, 512);                         /* 返回接收到的數據 */
#endif

    return ret;
}



/*******************************************************************************************************************
** 函數名稱: SdHal_BeforeWriteBlock()				
**
** 功能描述: 在發送寫單塊命令之前, 給硬件控制器做一些事情的機會
**
** 輸   入: 無 
**	         
** 輸   出: INT8U *recbuf: 接收緩沖區, 大小為512字節
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_BeforeWriteBlock(sd_struct *sds)
{
	MCIMask0 = DATA_TX_INT_MASK | (FIFO_INT_MASK);	      /* 僅使能TX中斷 */
	MCIMask1 = MCIMask0; 

	MCIClear = 0x7FF;							          /* 清空清零寄存器的所有標志 */
	MCIDataCtrl = 0;							          /* 數據控制寄存器清0 */
		 
	MCIDataTimer = sds->timeout_write;                    /* 寫入寫數據超時值 */
	MCIDataLength = SD_BLOCKSIZE;				          /* 數據塊的長度 */
    MCIFifoCnt = 0;  
    
    lpc_mci.psds = sds;                                   /* 初始化lpc_mci結構體變量成員 */  
    lpc_mci.RxTxFlag = MCI_RESET_FLAG; 
    lpc_mci.SendCnt = 0;
    lpc_mci.CurTran = MCI_CUR_SEND;   
	return SD_NO_ERR;
}


/*******************************************************************************************************************
** 函數名稱: SdHal_WriteBlock()				
**
** 功能描述: 在發送寫單塊命令之后, 由硬件控制器向卡發送數據
**
** 輸   入: 無 
**	         
** 輸   出: INT8U *recbuf: 接收緩沖區, 大小為512字節
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_WriteBlock(sd_struct *sds, INT8U *sendbuf)
{
	INT32U DataCtrl = 0;
	INT8U ret;
	
#if LPC23xx_MCI_DMA_EN
    src_addr = (INT32U *)DMA_SRC;                           
	dest_addr = (INT32U *)DMA_DST;
	//memcpy(sendbuf, src_addr, 512);
	memcpy(src_addr, sendbuf, 512);                              /* 復制要寫入的數據到DMA源地址 */

	DMA_Init(0, M2P);                                            /* DMA控制器初始化 */
	DMACC0Configuration |= 0x00001 | (0x00 << 1) | (0x04 << 6) | (0x05 << 11);
	
	/* 設置數據控制寄存器: 寫, 塊傳輸, DMA, 數據長度 */
	DataCtrl |= ((1 << 0) | (1 << 3) | (SD_BLOCKSIZE_NBITS << 4));               
#else
 	lpc_mci.pSendBuf = sendbuf;
 	
 	/* 設置數據控制寄存器: 讀, 塊傳輸, 數據長度 */
 	DataCtrl |= ((1 << 0) | (SD_BLOCKSIZE_NBITS << 4));
#endif 	


#if SD_UCOSII_EN
    OS_ENTER_CRITICAL();
    MCIDataCtrl = DataCtrl;                                      /* 啟動數據傳輸 */
    OSSemPend(sds->pSemSdmmcRW, sds->timeout_write_os, &ret);    /* 進入等待狀態 */
    if (ret == OS_NO_ERR)
	    ret = lpc_mci.RxTxFlag;                                  /* 返回寫塊數據結果 */
    else if (ret == OS_TIMEOUT)
        ret = SD_ERR_TIMEOUT_WRITE;                              /* 返回等待超時 */
    else
        ret = SD_ERR_WAIT_WRSEM;                                 /* OSSemPend()執行失敗 */
    
    OS_EXIT_CRITICAL();
#else
    MCIDataCtrl = DataCtrl;                                      /* 啟動數據傳輸 */
	do
	{
	    if (lpc_mci.RxTxFlag == SD_NO_ERR)
	        break;                                               /* 發送數據成功 */   
	}while (lpc_mci.RxTxFlag == MCI_RESET_FLAG);
	
	ret = lpc_mci.RxTxFlag;                                      /* 返回發送數據執行結果 */
#endif

	MCIMask0 &= ~(DATA_TX_INT_MASK | FIFO_INT_MASK);	         /* 僅禁止TX中斷 */
	MCIMask1 = MCIMask0;  	
  
	return ret;
}


/*******************************************************************************************************************
** 函數名稱: SDMMC_WaitReadyforData()				
**
** 功能描述: 等待卡可接收數據(等待卡中有空的接收緩沖區), 即等待卡狀態寄存器的 bit8 為1, 
**
** 輸   入: sd_struct *sds  : SD/MMC卡信息結構體 
**	         
** 輸   出: 無
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_WaitReadyforData(sd_struct *sds)
{    
    return (SdHal_WaitBusy(sds, BUSY_TYPE_RDY_DATA));
}


#define   SD_UCOSII_SMALLWAIT		256				            /* 運行于UCOS-II時的小等待時間(避免OSTimeDly(1)降低系統性能) */
#define   CMD13_CLK_NUM             160                         /* 一個CMD13大約需要160個clk */   

/*******************************************************************************************************************
** 函數名稱: SdHal_WaitBusy()				
**
** 功能描述: 等待卡編程或擦除結束, 即等待卡狀態由編程狀態變為傳輸狀態: prg --> tran
**
** 輸   入: sd_struct *sds  : SD/MMC卡信息結構體 
**	         INT32U BusyType : 等待忙類型, 取值為: SD_WAIT_WRITE 和 SD_WAIT_ERASE
** 輸   出: 無
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_WaitBusy(sd_struct *sds, INT32U busytype)
{
    INT8U ret;
    INT32U status, timeout = 0, cnt = 0;
    INT32U stmask = CARD_STATUS_CURRENT_STATE;                
    INT32U stwait = CARD_STATUS_PRG;                            /* 等待時, 卡處于編程狀態 */
    
    if (busytype == BUSY_TYPE_RDY_DATA)
    {
        timeout = sds->timeout_write / CMD13_CLK_NUM;           /* 寫超時等待時間 */
        stmask = CARD_STATUS_RDY_DATA;
        stwait = 0;                                             /* 等待時, 卡的接收緩沖區未就緒 */
    }
    else if (busytype == BUSY_TYPE_PROG)
        timeout = sds->timeout_write / CMD13_CLK_NUM;           /* 擦除超時等待時間 */
    else if (busytype == BUSY_TYPE_ERASE)
        timeout = sds->timeout_erase / CMD13_CLK_NUM;
            
#if SD_UCOSII_EN 
    timeout = SD_UCOSII_SMALLWAIT;                              /* 先進行快速查詢, 再每隔1 os tick查詢 */
#endif

    do	
	{	
		ret = SdCmd_Send_Status(sds, &status);                  /* 讀取卡的狀態 */
		if (ret != SD_NO_ERR)
			return ret;
			
	    if (!SdHal_CheckCard(sds))                              /* 檢測卡是否拔出 */
 		    return SD_ERR_NO_CARD; 	
			
		cnt++;			
	}while(((status & stmask) == stwait) && (cnt < timeout));

#if SD_UCOSII_EN
	if (cnt >= timeout)
	{                                                           /* 很少等待后卡仍忙 */
  		if ((busytype == BUSY_TYPE_RDY_DATA) || (busytype == BUSY_TYPE_PROG))
  			timeout = sds->timeout_write_os;
  		else
  			timeout = sds->timeout_erase_os;   
			
		cnt = 0;
   		do
   		{ 	
   			OSTimeDly(1);                                       /* 操作系統掛起1 tick */
   			
		    ret = SdCmd_Send_Status(sds, &status);              /* 讀取卡的狀態 */
		    if (ret != SD_NO_ERR)
		    	return ret;
			
	        if (!SdHal_CheckCard(sds))                          /* 檢測卡是否拔出 */
 		        return SD_ERR_NO_CARD; 	   			
   			
   			cnt++;
    	}while(((status & stmask) == stwait) && (cnt < timeout));
	}
#endif	
	
	return SD_NO_ERR;
}


/*******************************************************************************************************************
** 函數名稱: MCI_Delay()				
**
** 功能描述: 延時函數	
**
** 輸   入: INT16U val:  延時值, 1大約相當于5ms
**							  	
** 輸   出: 無
**
** 返 回 值: 無 
********************************************************************************************************************/
void MCI_Delay(INT16U val)
{
#if !SD_UCOSII_EN
    INT16U i,j;
    for (i = 0; i < val; i++)
        for (j = 0; j < 0xC000; j++);
#else
    OSTimeDly(val); 
#endif   
}


/*******************************************************************************************************************
** 函數名稱: MCI_SendCmd()				
**
** 功能描述: 發送命令給卡, 但不獲取響應
**
** 輸   入: INT32U CmdIndex    : 命令索引
**           INT32U Argument    : 命令參數
**           INT32U ExpectResp  : 期望得到的回復 
**           INT32U AllowTimeout: 是否允許超時
**	         
** 輸   出: 無
**
** 返 回 值: 無
********************************************************************************************************************/
void MCI_SendCmd(INT32U CmdIndex, INT32U Argument, INT32U ExpectResp, INT32U AllowTimeout)
{
    INT32U CmdData = 0, i;
	INT32U CmdStatus;
		
	while ((CmdStatus = MCIStatus) & MCI_CMD_ACTIVE)    /* 命令正在處理中 */
	{
		MCICommand = 0;                                 
		MCIClear = CmdStatus | MCI_CMD_ACTIVE;          /* 清除相關狀態 */
		for(i = 0; i < 0x20; i++);
	}	
		
	CmdData |= (CmdIndex & 0x3F);	                    /* 命令索引只有bit0 ~ bit5 有效 */
	if (ExpectResp == EXPECT_NO_RESP)			        /* 無響應類型 */
	{
		CmdData &= ~((1 << 6) | (1 << 7));		        /* 清除短響應和長響應位 */
	}
	else if (ExpectResp == EXPECT_SHORT_RESP)	        /* 希望得到短響應 */
	{
		CmdData |= (1 << 6);
	}
	else if (ExpectResp == EXPECT_LONG_RESP)	        /* 希望得到長響應 */
	{
		CmdData |= (1 << 6) | (1 << 7);
	}

	if (AllowTimeout)			                        /* 是否允許超時中斷 */
		CmdData |= (1 << 8);
	else
		CmdData &= ~(1 << 8);

	CmdData |= (1 << 10);		                        /* 使能發送命令 */
	MCIArgument = Argument;	                            /* 命令參數     */
	MCICommand = CmdData;                               /* 啟動命令發送 */
}


/*******************************************************************************************************************
** 函數名稱: MCI_GetCmdResp()				
**
** 功能描述: 從卡獲取響應, 該函數與MCI_SendCmd()成對使用
**
** 輸   入: INT32U ExpectCmdData: SD/MMC 命令碼
**           INT32U ExpectResp   : 希望的響應, 取值為: EXPECT_NO_RESP, EXPECT_SHORT_RESP, EXPECT_LONG_RESP
**           INT8U  resplen      : 響應長度
**           
**	         
** 輸   出: INT32U *CmdResp     : 響應內容, 長度為resplen
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U MCI_GetCmdResp(INT32U ExpectCmdData, INT32U ExpectResp, INT8U resplen, INT32U *CmdResp)
{
	INT32U LastCmdIndex;
	INT32U CmdRespStatus = 0;

	while (1)
	{                                                       /* 不斷循環等待卡的響應 */
		CmdRespStatus = MCIStatus;
		if (CmdRespStatus & (MCI_CMD_TIMEOUT))
		{                                                   /* 超時錯誤, 超時周期固定為64個MCICLK時鐘周期 */
		    MCIClear = CmdRespStatus | MCI_CMD_TIMEOUT;
			MCICommand = 0;                                 /* 清空命令寄存器及參數寄存器 */
			MCIArgument = 0xFFFFFFFF;
			return SD_ERR_CMD_TIMEOUT;                      /* 返回響應命令超時錯誤 */
		}
		
		if (CmdRespStatus & MCI_CMD_CRC_FAIL)
		{                                                   /* CRC校驗失敗錯誤 */
			MCIClear = CmdRespStatus | MCI_CMD_CRC_FAIL;
			LastCmdIndex = MCICommand & 0x003F;
			if ((LastCmdIndex == SEND_OP_COND) || (LastCmdIndex == SEND_APP_OP_COND) 
					|| (LastCmdIndex == STOP_TRANSMISSION))
			{                                               /* 忽略命令 SEND_OP_COND和STOP_TRANSMISSION的CRC校驗 */
				MCICommand = 0;
				MCIArgument = 0xFFFFFFFF;	 
				break;
			}
			else
				return SD_ERR_CMD_RESPCRC;                  /* 返回響應命令CRC校驗失敗錯誤 */
		}
		else if (CmdRespStatus & MCI_CMD_RESP_END)
		{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产高清一区二区| av网站免费线看精品| 亚洲伦在线观看| 国产精品福利av| 亚洲欧洲av一区二区三区久久| 国产精品麻豆网站| 国产精品美女久久久久aⅴ| 国产午夜一区二区三区| 国产午夜精品理论片a级大结局 | 91老司机福利 在线| 色综合天天综合网天天看片| 色欧美片视频在线观看在线视频| 在线免费一区三区| 欧美日韩不卡一区| 精品少妇一区二区三区| 久久久www成人免费毛片麻豆| 国产亚洲综合在线| 亚洲欧美自拍偷拍| 视频在线观看一区| 国产一区二区三区在线观看免费| 国产成人鲁色资源国产91色综| av电影一区二区| 欧美日韩综合不卡| www成人在线观看| 国产精品久久久久久妇女6080| 亚洲一区二区三区影院| 美腿丝袜亚洲综合| 成人免费视频视频| 欧美日韩色一区| 久久久久久久久久久黄色| 亚洲少妇30p| 美女网站视频久久| 91日韩在线专区| 欧美电影免费观看完整版| 综合色天天鬼久久鬼色| 美女脱光内衣内裤视频久久网站| 成人免费视频一区二区| 5月丁香婷婷综合| 亚洲丝袜制服诱惑| 国产尤物一区二区| 欧美日本在线观看| 中文字幕一区二| 国产一区999| 欧美精选在线播放| 日韩美女啊v在线免费观看| 美女视频一区在线观看| 在线观看网站黄不卡| 久久蜜桃av一区精品变态类天堂 | www.色精品| 精品久久久久久久久久久久包黑料 | 日韩一区欧美一区| 狠狠色丁香婷婷综合| 91成人网在线| 国产精品久久久久桃色tv| 另类中文字幕网| 欧美日韩国产高清一区| 亚洲精品中文在线观看| 成人自拍视频在线| 久久精品在线观看| 麻豆91免费看| 制服丝袜日韩国产| 亚洲制服丝袜一区| 亚洲精品一区二区三区精华液| 亚洲一区成人在线| 在线看国产一区| 亚洲激情六月丁香| 色999日韩国产欧美一区二区| 国产精品久久毛片a| 国产福利一区二区三区视频在线| 日韩午夜在线观看| 日韩精品亚洲专区| 91精品国产综合久久久久久漫画| 亚洲国产wwwccc36天堂| 在线观看亚洲a| 亚洲亚洲人成综合网络| 精品视频免费在线| 午夜天堂影视香蕉久久| 欧美视频精品在线观看| 亚洲电影激情视频网站| 欧美日韩国产一区| 丝袜美腿亚洲综合| 91麻豆精品国产无毒不卡在线观看| 午夜精品成人在线视频| 日韩一级免费观看| 蜜桃精品视频在线| 久久噜噜亚洲综合| 国产精品一区二区男女羞羞无遮挡| 久久久久97国产精华液好用吗| 国产.精品.日韩.另类.中文.在线.播放| 久久久久久久性| 97精品电影院| 亚洲国产精品久久久久秋霞影院| 欧美妇女性影城| 美腿丝袜亚洲综合| 国产亚洲欧美日韩在线一区| 国产成人鲁色资源国产91色综| 成人欧美一区二区三区1314| 日本二三区不卡| 午夜婷婷国产麻豆精品| 欧美精品一区二区蜜臀亚洲| 不卡av在线网| 青青草一区二区三区| 国产亚洲精品bt天堂精选| 色综合久久九月婷婷色综合| 日韩va亚洲va欧美va久久| 国产日韩欧美综合在线| 国产精品一线二线三线| 亚洲女爱视频在线| 欧美v国产在线一区二区三区| 丁香桃色午夜亚洲一区二区三区| 亚洲精品视频免费观看| 日韩美女视频在线| 91丨porny丨最新| 日韩精品久久久久久| 国产精品色在线| 欧美一卡在线观看| 福利一区二区在线观看| 日韩综合小视频| 中文字幕av资源一区| 91精品国产全国免费观看| 91在线免费视频观看| 精品一区二区在线观看| 亚洲一区免费在线观看| 国产精品嫩草99a| 精品国产一区二区三区忘忧草| 色偷偷久久人人79超碰人人澡| 国产乱子伦视频一区二区三区 | 亚洲欧美一区二区三区极速播放| 精品久久国产字幕高潮| 26uuu精品一区二区| 欧美色网站导航| 91一区二区在线观看| 国内久久精品视频| 天涯成人国产亚洲精品一区av| 国产精品女同一区二区三区| www国产精品av| 欧美一区二区高清| 欧美久久久久免费| 色综合中文字幕| 成人国产一区二区三区精品| 国产一区二区三区| 精品一区二区在线视频| 日韩精品电影在线观看| 亚洲国产另类精品专区| 亚洲精品大片www| 亚洲激情图片小说视频| 中文字幕一区二区三区蜜月| 欧美经典一区二区| 久久久国产一区二区三区四区小说| 日韩欧美一二区| 日韩视频123| 欧美一区二区三区视频免费播放| 色婷婷久久久亚洲一区二区三区| a在线欧美一区| 91在线观看成人| 91毛片在线观看| 在线亚洲一区观看| 在线免费观看成人短视频| 91免费视频大全| 91免费看视频| 欧美日韩国产小视频在线观看| 欧美精品乱码久久久久久| 欧美日韩综合在线免费观看| 欧美美女网站色| 日韩欧美成人午夜| 日韩精品一区二区三区在线观看 | 91麻豆精品国产91久久久更新时间| 欧美色爱综合网| 欧美一区二区成人6969| 欧美xxxxx裸体时装秀| 久久尤物电影视频在线观看| 久久久久久久久99精品| 国产精品美女久久久久aⅴ| 亚洲精品中文在线观看| 日本免费在线视频不卡一不卡二 | 亚洲男人天堂av| 午夜精品在线看| 韩国精品主播一区二区在线观看| 成人高清视频在线观看| 欧美综合天天夜夜久久| 日韩欧美国产综合| 亚洲国产精品成人综合| 亚洲综合久久久| 精品一区二区三区在线播放| 福利一区二区在线观看| 欧美日韩午夜在线| 久久综合色一综合色88| 亚洲欧美区自拍先锋| 首页亚洲欧美制服丝腿| 国产精品系列在线播放| 欧美吻胸吃奶大尺度电影| 精品国产一区二区三区av性色| 国产精品免费免费| 男女男精品视频网| 不卡大黄网站免费看| 欧美一区二区三区人| 中文字幕一区二区三区四区| 麻豆一区二区三| 欧美日韩一卡二卡| 亚洲欧洲色图综合|