亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产午夜精品福利| 国产欧美在线观看一区| 91黄视频在线观看| 91小视频免费观看| 欧美主播一区二区三区| 成人高清av在线| proumb性欧美在线观看| eeuss鲁片一区二区三区| 不卡一区二区在线| 99re这里只有精品视频首页| 成人app在线| 色婷婷综合中文久久一本| 色就色 综合激情| 欧美日韩一区二区欧美激情| 51精品秘密在线观看| 欧美一区二区三区白人| 日韩久久精品一区| 2020国产精品自拍| 中文字幕欧美一区| 亚洲国产一区二区视频| 日本麻豆一区二区三区视频| 国产在线国偷精品产拍免费yy| 国产不卡在线播放| 色激情天天射综合网| 在线观看精品一区| 精品久久久久一区二区国产| 久久精品一区蜜桃臀影院| 国产精品国产三级国产| 一区二区三区成人| 美女www一区二区| 成人av电影在线播放| 这里只有精品电影| 中文字幕av一区 二区| 亚洲电影视频在线| 国产成人精品影视| 欧美日韩久久久一区| 久久久久久久久岛国免费| 伊人婷婷欧美激情| 经典三级视频一区| 在线日韩av片| 国产女同互慰高潮91漫画| 一区二区三区四区不卡在线| 美腿丝袜一区二区三区| 色综合久久中文字幕综合网| 欧美成人一区二区| 亚洲最新视频在线观看| 国产精品一线二线三线| 欧美日韩精品三区| 1区2区3区精品视频| 精品一区二区三区视频| 欧美理论片在线| 亚洲视频一二三区| 国产一区二区看久久| 91精选在线观看| 亚洲精品国产高清久久伦理二区| 国产剧情一区在线| 欧美一级理论片| 亚洲精品国产a久久久久久| 成人性生交大合| 2021久久国产精品不只是精品| 亚洲国产成人高清精品| 91亚洲精品久久久蜜桃| 国产精品久久国产精麻豆99网站| 国产一区久久久| 欧美电影免费观看完整版| 亚洲电影在线免费观看| 91一区二区在线| 国产精品短视频| 成人网页在线观看| 国产人妖乱国产精品人妖| 另类小说视频一区二区| 51午夜精品国产| 日韩不卡免费视频| 欧美日韩不卡一区二区| 亚洲另类在线一区| 在线观看亚洲一区| 一区二区三区在线视频免费观看| 99国产精品久久久久久久久久久 | 亚洲激情网站免费观看| 成人免费看黄yyy456| 国产精品国产三级国产| 色婷婷久久久久swag精品| 亚洲人成人一区二区在线观看| 白白色亚洲国产精品| 亚洲视频中文字幕| 欧美综合在线视频| 午夜天堂影视香蕉久久| 日韩一区二区三区视频在线观看| 久久超碰97中文字幕| 国产女人aaa级久久久级| 成人av在线一区二区| 亚洲女女做受ⅹxx高潮| 欧美日韩精品是欧美日韩精品| 奇米四色…亚洲| 2欧美一区二区三区在线观看视频| 精品中文字幕一区二区| 国产精品网站在线播放| 日本韩国欧美一区二区三区| 日韩成人免费电影| 国产午夜三级一区二区三| 91丨九色丨黑人外教| 亚洲成人av一区二区| 精品电影一区二区| 91一区二区在线| 美女一区二区三区| 国产精品视频在线看| 欧美丰满少妇xxxbbb| 国产精品一卡二卡在线观看| 一区二区三区四区中文字幕| 欧美成人女星排名| 91视频在线看| 国产综合色产在线精品| 一区二区激情小说| 久久亚洲私人国产精品va媚药| 一本色道久久综合精品竹菊| 免费在线观看一区| 亚洲男同1069视频| 久久久高清一区二区三区| 欧美系列日韩一区| 春色校园综合激情亚洲| 婷婷综合另类小说色区| 国产精品久久久爽爽爽麻豆色哟哟| 欧美人牲a欧美精品| 北岛玲一区二区三区四区| 麻豆视频一区二区| 亚洲国产日韩一区二区| 国产精品毛片高清在线完整版| 日韩欧美成人午夜| 欧美日韩一区不卡| 不卡av在线免费观看| 黄色小说综合网站| 蜜臀精品一区二区三区在线观看 | 国产精品沙发午睡系列990531| 91精品免费在线| 91国产成人在线| 99热这里都是精品| 国产九色sp调教91| 久久精品国产一区二区三区免费看| 亚洲精品视频自拍| 国产精品成人网| 中文字幕 久热精品 视频在线 | 久久欧美中文字幕| 制服.丝袜.亚洲.另类.中文| 欧美日韩一区二区三区在线| 91蜜桃免费观看视频| www.欧美日韩国产在线| 成人99免费视频| www.一区二区| 色综合 综合色| 99re这里只有精品首页| heyzo一本久久综合| 97久久精品人人澡人人爽| av成人免费在线| 一本在线高清不卡dvd| av成人动漫在线观看| eeuss鲁片一区二区三区| av电影一区二区| 色综合色狠狠天天综合色| 色综合久久久久久久久久久| 色综合久久综合| 欧美日本在线看| 91精品国产欧美日韩| 精品美女一区二区| 久久精品水蜜桃av综合天堂| 国产精品嫩草影院av蜜臀| 国产精品毛片久久久久久| 亚洲另类春色校园小说| 午夜欧美在线一二页| 久久av老司机精品网站导航| 国产乱子伦一区二区三区国色天香| 激情欧美日韩一区二区| 国产福利一区二区三区视频在线 | 欧美aaaaa成人免费观看视频| 久久精品国产99国产精品| 国产精品综合二区| 高清久久久久久| 欧美色成人综合| 国产亚洲欧美在线| 一级女性全黄久久生活片免费| 日日噜噜夜夜狠狠视频欧美人| 国产综合色在线视频区| 99久久国产综合精品女不卡| 欧美在线高清视频| 精品少妇一区二区三区免费观看 | 最新热久久免费视频| 亚洲国产综合色| 国产高清亚洲一区| 欧美综合亚洲图片综合区| 91精品国产综合久久精品| 久久久久97国产精华液好用吗| 亚洲三级电影网站| 蜜桃久久av一区| 一本大道久久a久久精品综合| 欧美精品v国产精品v日韩精品 | 久久电影网站中文字幕| 91同城在线观看| 国产亚洲人成网站| 日韩影院免费视频| 91社区在线播放| 国产亚洲精久久久久久|