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

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

?? sdhal.c

?? 基于lpc2378的SD/MMC卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			MCIClear = CmdRespStatus | MCI_CMD_RESP_END;
			break;	                                        /* 響應已成功接收到,退出循環(huán) */
		}
		else if ((CmdRespStatus & MCI_CMD_SENT) && (ExpectResp == EXPECT_NO_RESP))
		{                                                   /* 該命令無須響應 */
			MCIClear = MCI_CMD_SENT;
			return SD_NO_ERR;                               /* 返回命令*/
		}		
	}
	
	if ((MCIRespCmd & 0x3F) != ExpectCmdData)
	{
	    /* 響應為非R1, 而是R2或R3, 則無須檢查響應命令是否與發(fā)送的相符合 */
		if ((ExpectCmdData != SEND_OP_COND) && (ExpectCmdData != SEND_APP_OP_COND) 
			 && (ExpectCmdData != ALL_SEND_CID) && (ExpectCmdData != SEND_CSD))
		{
			return SD_ERR_CMD_RESP;                         /* 返回響應錯誤 */
		}
	}

    /* 下面讀取短響應內容及長響應內容 */
	if ((ExpectResp == EXPECT_SHORT_RESP) && (resplen == 1))
	{                                                       
		*CmdResp = MCIResponse0;                            /* 讀取短響應內容 */
	}
	else if ((ExpectResp == EXPECT_LONG_RESP) && (resplen == 4))
	{
		*CmdResp = MCIResponse0;                            /* 讀取長響應內容 */
		*(CmdResp+1) = MCIResponse1;
		*(CmdResp+2) = MCIResponse2;
		*(CmdResp+3) = MCIResponse3;
	}	
	
	return SD_NO_ERR;	                                    /* 響應正確. */
}



/**********************************

 下面部分為 MCI 中斷處理相關函數(shù)

***********************************/


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_DataEndProcess()				
**
** 功能描述: MCI 數(shù)據(jù)結束處理函數(shù)
********************************************************************************************************************/
void MCI_DataEndProcess(void)
{
#if LPC23xx_MCI_DMA_EN
    if (lpc_mci.CurTran == MCI_CUR_SEND)
    {
        while ( !(DMACRawIntTCStatus & 0x01) );
	    DMACIntTCClear |= 0x01;
		lpc_mci.RxTxFlag = SD_NO_ERR;                       /* DMA 接收塊數(shù)據(jù)成功 */
    }
    else
    {
        while ( !(DMACRawIntTCStatus & 0x02) );
		DMACIntTCClear |= 0x02;
		lpc_mci.RxTxFlag = SD_NO_ERR;                       /* DMA 發(fā)送塊數(shù)據(jù)成功 */
    }
    
    #if SD_UCOSII_EN
	    OSSemPost(lpc_mci.psds->pSemSdmmcRW);               /* 使等待函數(shù)就緒 */
    #endif	

#else
   
    MCIClear |= MCI_DATA_BLK_END;
    if ((lpc_mci.SendCnt >= SD_BLOCKSIZE) || 
        (lpc_mci.RecCnt >= SD_BLOCKSIZE))	   
	{                                                       /* 塊數(shù)據(jù)已收/發(fā)成功 */
	    lpc_mci.RxTxFlag = SD_NO_ERR;
	    #if SD_UCOSII_EN
	    	OSSemPost(lpc_mci.psds->pSemSdmmcRW);
		#endif
	} 

#endif	    
	MCIDataCtrl = 0;			                            /* 數(shù)據(jù)控制寄存器清0  */
}


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_TxActiveProcess()				
**
** 功能描述: MCI 發(fā)送數(shù)據(jù)處理函數(shù)
********************************************************************************************************************/
void MCI_TxActiveProcess(void)
{
	INT32U DataWord, blockSize,i;
	
	MCIClear |= MCI_TX_ACTIVE;
    if (lpc_mci.SendCnt < SD_BLOCKSIZE )
	{
	    blockSize = 0;
		if (MCIStatus & MCI_TX_FIFO_EMPTY)                  /* FIFO全空 */   
	        blockSize = FIFO_SIZE * 4;                      
		else if (MCIStatus & MCI_TX_HALF_EMPTY)             /* FIFO半空 */
		   	blockSize = (FIFO_SIZE / 2) * 4; 
		else if (!(MCIStatus & MCI_TX_FIFO_FULL))           /* FIFO全滿 */
	     	blockSize = 1 * 4; 
		   
		for (i = 0; i < blockSize; i += 4)
    	{                                                   /* 循環(huán)向FIFO中寫入數(shù)據(jù) */
    		DataWord = ((INT32U)lpc_mci.pSendBuf[lpc_mci.SendCnt]) + 
    		           (((INT32U)lpc_mci.pSendBuf[lpc_mci.SendCnt + 1]) << 8) +
    		           (((INT32U)lpc_mci.pSendBuf[lpc_mci.SendCnt + 2]) << 16) +
    		           (((INT32U)lpc_mci.pSendBuf[lpc_mci.SendCnt + 3]) << 24);
    		MCIFIFO = DataWord;                             /* 向FIFO寫入一個32位的數(shù)據(jù) */
    		lpc_mci.SendCnt += 4;
    		if (lpc_mci.SendCnt >= (SD_BLOCKSIZE))          
     			break;	                                    /* 已發(fā)送完一個數(shù)據(jù)塊 */
    	}     	    
    }
}


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_RxActiveProcess()				
**
** 功能描述: MCI 接收數(shù)據(jù)處理函數(shù)
********************************************************************************************************************/
void MCI_RxActiveProcess(void)
{
	INT32U DataWord, blockSize, i;
	INT32U Status;
	
    if (lpc_mci.RecCnt < SD_BLOCKSIZE )
	{
	    blockSize = 0;
	    if (!(MCIStatus & MCI_RX_FIFO_FULL))                 /* FIFO全滿 */          
	   	  	blockSize = FIFO_SIZE * 4; 
	   	else if (MCIStatus & MCI_RX_HALF_FULL)               /* FIFO半滿 */
	   		blockSize = (FIFO_SIZE/2) * 4; 
	   	else if (MCIStatus & MCI_RX_FIFO_EMPTY)              /* FIFO全空 */
	   		blockSize = 1 * 4; 
	   	
	   	for ( i = 0; i < blockSize; i += 4 )
	   	{                                                    /* 循環(huán)從FIFO中讀取數(shù)據(jù) */
		    while (!((Status = MCIStatus) & MCI_RX_DATA_AVAIL))
		    {
		        if ((Status & MCI_RX_OVERRUN) != 0)          /* 判斷是否發(fā)生FIFO下溢錯誤 */
		        {
		            MCIDataCtrl = 0;
		            MCIClear    = 0x7FF;
		            MCIMask0    = 0;
		            MCIMask1    = 0;
		            lpc_mci.RxTxFlag = SD_ERR_HARDWARE;
		            return;
		        }
		    }
		    DataWord = MCIFIFO;                              /* 從FIFO中讀取一個32位的數(shù)據(jù) */
		    lpc_mci.pRecBuf[lpc_mci.RecCnt] = DataWord & 0xFF;
		    lpc_mci.pRecBuf[lpc_mci.RecCnt + 1] = (DataWord >> 8) & 0xFF; 
		    lpc_mci.pRecBuf[lpc_mci.RecCnt + 2] = (DataWord >> 16) & 0xFF;
		    lpc_mci.pRecBuf[lpc_mci.RecCnt + 3] = (DataWord >> 24) & 0xFF;
		    lpc_mci.RecCnt += 4;                             /* 計數(shù)器計數(shù) */
            if (lpc_mci.RecCnt >= (SD_BLOCKSIZE))
     			break;		    
	    }
	}

}


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_DataInterruptProcess()				
**
** 功能描述: 這部分是處理讀寫卡的關鍵部分. 對于FIFO中斷沒有處理, 本函數(shù)主要使用 TX_ACTIVE 和 RX_ACTIVE 處理塊讀寫.
********************************************************************************************************************/
void MCI_DataInterruptProcess( void )
{
	INT32U Status  = MCIStatus;

 	if (Status &  MCI_DATA_END)                              /* 數(shù)據(jù)結束中斷 */
 		MCIClear = Status | MCI_DATA_END;
	
	if (Status & MCI_DATA_BLK_END)                           /* 數(shù)據(jù)塊結束中斷 */
	{
	    MCI_DataEndProcess();
	    return;
	}
		
#if !LPC23xx_MCI_DMA_EN	
	if (MCIStatus & MCI_TX_ACTIVE)
        MCI_TxActiveProcess();                               /* 發(fā)送數(shù)據(jù)中斷處理 */

	if (MCIStatus & MCI_RX_ACTIVE)
        MCI_RxActiveProcess();                               /* 接收數(shù)據(jù)中斷處理 */
#endif        
}


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_DataErrorProcess()				
**
** 功能描述: MCI 錯誤處理函數(shù): 當MCI有錯誤產生時, 該函數(shù)被調用
********************************************************************************************************************/
void MCI_DataErrorProcess( void )
{
	INT32U Status = MCIStatus;
	
    if (Status & MCI_DATA_CRC_FAIL)
		lpc_mci.RxTxFlag = SD_ERR_DATA_CRC16;                /* 收/發(fā)數(shù)據(jù)塊時發(fā)生CRC校驗錯誤 */         

	if (Status & MCI_DATA_TIMEOUT)
	{
        if (lpc_mci.CurTran == MCI_CUR_SEND)
            lpc_mci.RxTxFlag = SD_ERR_TIMEOUT_WRITE;         /* 發(fā)送數(shù)據(jù)超時錯誤 */
        else    
            lpc_mci.RxTxFlag = SD_ERR_TIMEOUT_READ;          /* 接收數(shù)據(jù)超時錯誤 */
    }
    	
	if (Status & MCI_TX_UNDERRUN)                            /* 發(fā)送數(shù)據(jù)時FIFO下溢錯誤 */
	    lpc_mci.RxTxFlag = SD_ERR_HARDWARE;

	if (Status & MCI_RX_OVERRUN)                             /* 接收數(shù)據(jù)時FIFO上溢錯誤 */
	    lpc_mci.RxTxFlag = SD_ERR_HARDWARE;

	if ( Status &  MCI_START_BIT_ERR )                       /* 寬總線模式下所有數(shù)據(jù)信號線上沒有檢測到起始位 */
	    lpc_mci.RxTxFlag = SD_ERR_DATA_STARTBIT;
	
#if SD_UCOSII_EN
	OSSemPost(lpc_mci.psds->pSemSdmmcRW);                    /* 使等待函數(shù)就緒 */
#endif
}


/*******************************************************************************************************************
** 函數(shù)名稱: MCI_Exception	或 MCI_Handler		
**
** 功能描述: MCI 中斷處理函數(shù)
********************************************************************************************************************/
#if SD_UCOSII_EN
void  MCI_Exception(void)
#else
void  __irq MCI_Handler(void)
#endif
{	   
    INT32U Status = MCIStatus;                              /* 讀取MCI當前狀態(tài) */

    if (Status & CMD_INT_MASK)
	{                                                       /* 命令中斷處理 */
		MCIClear = Status & CMD_INT_MASK;
	}
	else if (MCIStatus & DATA_ERR_INT_MASK)
	{                                                       /* 數(shù)據(jù)錯誤中斷處理 */
		MCI_DataErrorProcess();                 
		MCIClear |= DATA_ERR_INT_MASK;                      /* 清除數(shù)據(jù)錯誤中斷位 */
	}
	else if (MCIStatus & DATA_INT_MASK)
	{                                                       /* 數(shù)據(jù)中斷處理 */
		MCI_DataInterruptProcess();
		//MCIClear |= DATA_INT_MASK;
	}
    else if (MCIStatus & FIFO_INT_MASK)
	{
		;
	}
	
	VICVectAddr = 0;		                                /* 應答中斷控制器 */
}



/*************************
LPC23xx DMA 初始化函數(shù)
**************************/

#if LPC23xx_MCI_DMA_EN

/*******************************************************************************************************************
** 函數(shù)名稱: DMA_Init()				
**
** 功能描述: LPC23xx DMA控制器初始化
**
** 輸   入: INT32U ChannelNum: DMA 控制器通道號 
**	         INT32U DMAMode:    DMA 模式
** 輸   出: 無
**
** 返 回 值: TRUE:   正確;    FALSE:   錯誤
********************************************************************************************************************/
INT32U DMA_Init(INT32U ChannelNum, INT32U DMAMode)
{
	/* USB RAM is used for test.
	Please note, Ethernet has its own SRAM, but GPDMA can't access
	that. GPDMA can access USB SRAM and IRAM. Ethernet DMA controller can 
	access both IRAM and Ethernet SRAM. */
	if ( ChannelNum == 0 )
	{
		DMACIntErrClr = 0x01;   
		if ( DMAMode == M2M )
		{
			/* Ch0 is set for M2M tranfer from AHB1 to AHB2 SRAM */
			DMACC0SrcAddr = DMA_SRC;
			DMACC0DestAddr = DMA_DST;
			/* Terminal Count Int enable */
			DMACC0Control = (DMA_SIZE & 0x0FFF) | (0x04 << 12) | (0x04 << 15) 
				| (0x02 << 18) | (0x02 << 21) | (1 << 26) | (1 << 27) | 0x80000000;	
		}
		else if ( DMAMode == M2P )
		{
			/* Ch0 set for M2P transfer from mempry to MCI FIFO. */
			DMACC0SrcAddr = DMA_SRC;
			DMACC0DestAddr = DMA_MCIFIFO;
			/* The burst size is set to 8, the size is 8 bit too. */
			/* Terminal Count Int enable */
			DMACC0Control = (DMA_SIZE & 0x0FFF) | (0x01 << 12) | (0x02 << 15)
				| (0x02 << 18) | (0x02 << 21) | (1 << 26) | 0x80000000;
		}
		else if ( DMAMode == P2M )
		{
			/* Ch0 set for P2M transfer from MCI FIFO to memory. */
			DMACC0SrcAddr = DMA_MCIFIFO;
			DMACC0DestAddr = DMA_DST;
			/* The burst size is set to 8, the size is 8 bit too. */
			/* Terminal Count Int enable */
			DMACC0Control = (DMA_SIZE & 0x0FFF) | (0x04 << 12) | (0x04 << 15)
				| (0x02 << 18) | (0x02 << 21) | (1 << 27) | 0x80000000;
		}
		else
		{
			return ( FALSE );
		}
	}
	else if ( ChannelNum == 1 )
	{   
		DMACIntErrClr = 0x02;
		if ( DMAMode == M2M )
		{
			/* Ch1 is set for M2M tranfer */
			DMACC1SrcAddr = DMA_SRC;
			DMACC1DestAddr = DMA_DST;
			/* Terminal Count Int enable */
			DMACC1Control = (DMA_SIZE & 0x0FFF) | (0x04 << 12) | (0x04 << 15) 
				| (0x02 << 18) | (0x02 << 21) | (1 << 26) | (1 << 27) | 0x80000000;	
		}
		else if ( DMAMode == M2P )
		{
			/* Ch1 set for M2P transfer from mempry to MCI FIFO. */
			DMACC1SrcAddr = DMA_SRC;
			DMACC1DestAddr = DMA_MCIFIFO;
			/* The burst size is set to 8, the size is 8 bit too. */
			/* Terminal Count Int enable */
			DMACC1Control = (DMA_SIZE & 0x0FFF) | (0x04 << 12) | (0x04 << 15)
				| (0x02 << 18) | (0x02 << 21) | (1 << 26) | 0x80000000;
		}
		else if ( DMAMode == P2M )
		{
			/* Ch1 set for P2M transfer from MCI_FIFO to memory. */
			DMACC1SrcAddr = DMA_MCIFIFO;
			DMACC1DestAddr = DMA_DST;
			/* The burst size is set to 8, the size is 8 bit too. */
			/* Terminal Count Int enable */
			DMACC1Control = (DMA_SIZE & 0x0FFF) | (0x02 << 12) | (0x02 << 15)
				| (0x02 << 18) | (0x02 << 21) | (1 << 27) | 0x80000000;
		}
		else
		{
			return ( FALSE );
		}
	}
	else
	{
		return ( FALSE );
	}
	
	DMACConfiguration = 0x01;	/* Enable DMA channels, little endian */
	while ( !(DMACConfiguration & 0x01) );    
    return (TRUE);
}

#endif



#endif




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线精品一区二区| 国产精品污污网站在线观看| 亚洲一区二区偷拍精品| 欧美tk丨vk视频| 欧美一区日韩一区| 奇米影视一区二区三区| 2014亚洲片线观看视频免费| 一区二区三区四区激情| 国产精品乱子久久久久| 美日韩一级片在线观看| 亚洲日本一区二区| 欧美性猛交xxxxxx富婆| 欧美性受xxxx黑人xyx性爽| 性欧美疯狂xxxxbbbb| 美女精品自拍一二三四| 日韩欧美精品在线视频| 国产女同互慰高潮91漫画| 亚洲欧美视频一区| 精品国产免费一区二区三区香蕉| 国产精品久久一卡二卡| 国产日产欧美一区| 91高清在线观看| 色综合久久久久久久久| 激情久久五月天| 偷拍日韩校园综合在线| 中文字幕日本乱码精品影院| 亚洲专区一二三| 国产精品久久久久久久久搜平片 | 国产成人精品亚洲777人妖| 国产精品久久久久婷婷二区次| 欧美艳星brazzers| 欧美性猛交xxxxxxxx| 日韩成人一级片| 欧美a级一区二区| 亚洲一区影音先锋| 国产亚洲欧美在线| 久久精品视频一区| 日本一区二区综合亚洲| 日韩欧美国产电影| 精品久久国产字幕高潮| 欧美三级电影精品| 国产传媒久久文化传媒| 图片区小说区国产精品视频| 久久久亚洲精华液精华液精华液| 国产亚洲欧美日韩在线一区| 精品久久久久久无| 日本在线不卡视频一二三区| 亚洲v精品v日韩v欧美v专区| 日韩av一区二区在线影视| 一区二区中文视频| 国产精品国产三级国产普通话蜜臀 | 亚洲综合激情另类小说区| 日韩欧美一区中文| 国产日产精品1区| 亚洲素人一区二区| 日韩高清电影一区| 久久成人精品无人区| 精品写真视频在线观看| kk眼镜猥琐国模调教系列一区二区| 国产成人综合视频| 国产suv一区二区三区88区| 国产不卡高清在线观看视频| 国产精品一区久久久久| 成人一区二区三区| 成人一区二区三区在线观看| 亚洲国产精品一区二区www| 色呦呦日韩精品| 蜜臀久久久99精品久久久久久| 国产a视频精品免费观看| 26uuu国产日韩综合| 综合中文字幕亚洲| 亚洲一区二区欧美激情| 岛国av在线一区| 久久久久久久性| 国产在线精品一区二区| 精品久久久影院| 五月综合激情日本mⅴ| 国产一区 二区| 久久综合av免费| 亚洲黄色在线视频| 亚洲色图在线播放| av在线播放不卡| 欧美韩日一区二区三区| 国产精品一区二区三区网站| 欧美tickling网站挠脚心| 美女任你摸久久| 精品成人一区二区| 经典一区二区三区| 国产日韩欧美精品一区| 99久久夜色精品国产网站| 一区二区欧美在线观看| 欧美日韩成人综合在线一区二区| 午夜精品久久久久久久| 日韩精品一区二区三区在线观看| 激情五月婷婷综合网| 欧美一区二区三区视频免费| 国产99久久久国产精品潘金 | 九色porny丨国产精品| 欧美一区二区三区四区在线观看| 国产精品久久久久久久裸模 | 麻豆精品一区二区三区| 国产精品久久久久国产精品日日| 在线国产亚洲欧美| 国产福利91精品| 蜜臀av性久久久久蜜臀av麻豆| 欧美日韩免费电影| 国产麻豆精品一区二区| 亚洲精品中文在线影院| 精品久久久久久综合日本欧美| 91社区在线播放| 国产91丝袜在线18| 奇米综合一区二区三区精品视频| 久久精品人人爽人人爽| 欧美不卡视频一区| av在线不卡电影| 久久成人精品无人区| 日韩av一区二区在线影视| 亚洲成人免费在线| 亚洲已满18点击进入久久| 亚洲图片另类小说| 亚洲欧洲精品成人久久奇米网| 久久精品日产第一区二区三区高清版 | 亚洲综合久久av| 亚洲欧美日韩在线不卡| 亚洲免费三区一区二区| 亚洲欧洲综合另类在线| 精品国产乱码久久久久久牛牛 | 中文字幕免费观看一区| 8x8x8国产精品| 色吧成人激情小说| 国产精品亚洲а∨天堂免在线| 蜜臀av一区二区三区| 国产精品一二三区在线| 日本久久一区二区| 日韩一区二区三区在线视频| 久久影音资源网| 中文字幕av一区二区三区免费看| 欧美日韩高清在线播放| 狠狠色丁香婷婷综合久久片| 7777精品伊人久久久大香线蕉| 国产很黄免费观看久久| 成人免费高清在线观看| 在线观看一区日韩| 久久精品在这里| 日韩精品视频网站| 成人在线综合网| 日韩精品中文字幕一区| 一区二区三区四区视频精品免费| 亚洲精品ww久久久久久p站 | 欧美日韩午夜在线| 国产欧美日韩视频一区二区| 蜜桃视频一区二区三区在线观看| 不卡大黄网站免费看| 日韩欧美国产精品| 亚洲va中文字幕| 成人av电影免费在线播放| 欧美日本精品一区二区三区| 日韩一区二区三区精品视频 | 中文字幕的久久| 天天综合色天天综合| 韩国av一区二区三区| 日韩欧美电影在线| 一区二区三区免费看视频| 极品尤物av久久免费看| 久久婷婷国产综合精品青草| 欧美国产乱子伦| 国产激情一区二区三区| 国产日韩av一区二区| 国产传媒日韩欧美成人| 国产精品久久久久影院亚瑟| 国产一区美女在线| 国产精品国产三级国产有无不卡| 国产白丝网站精品污在线入口| 国产精品二三区| 97久久精品人人澡人人爽| 亚洲乱码精品一二三四区日韩在线| 欧美日韩一区三区| 国产综合色精品一区二区三区| 久久看人人爽人人| 99久久精品情趣| 一区二区三区欧美| 久久综合狠狠综合| 成人av一区二区三区| 亚洲国产成人91porn| 久久日一线二线三线suv| 日本不卡一二三区黄网| 久久无码av三级| 日韩一区二区三区视频| 99久久精品国产一区| 狠狠色综合播放一区二区| 亚洲一区二区三区在线播放| 2020国产成人综合网| 6080国产精品一区二区| 国产一区二区三区蝌蚪| 一区二区三区波多野结衣在线观看| 777色狠狠一区二区三区| 色综合天天视频在线观看| 国产成人夜色高潮福利影视| 日韩成人精品在线| 香蕉成人啪国产精品视频综合网|