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

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

?? sdhal.c

?? 基于lpc2378的SD/MMC卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			MCIClear = CmdRespStatus | MCI_CMD_RESP_END;
			break;	                                        /* 響應已成功接收到,退出循環 */
		}
		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, 則無須檢查響應命令是否與發送的相符合 */
		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 中斷處理相關函數

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


/*******************************************************************************************************************
** 函數名稱: MCI_DataEndProcess()				
**
** 功能描述: MCI 數據結束處理函數
********************************************************************************************************************/
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 接收塊數據成功 */
    }
    else
    {
        while ( !(DMACRawIntTCStatus & 0x02) );
		DMACIntTCClear |= 0x02;
		lpc_mci.RxTxFlag = SD_NO_ERR;                       /* DMA 發送塊數據成功 */
    }
    
    #if SD_UCOSII_EN
	    OSSemPost(lpc_mci.psds->pSemSdmmcRW);               /* 使等待函數就緒 */
    #endif	

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

#endif	    
	MCIDataCtrl = 0;			                            /* 數據控制寄存器清0  */
}


/*******************************************************************************************************************
** 函數名稱: MCI_TxActiveProcess()				
**
** 功能描述: MCI 發送數據處理函數
********************************************************************************************************************/
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)
    	{                                                   /* 循環向FIFO中寫入數據 */
    		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位的數據 */
    		lpc_mci.SendCnt += 4;
    		if (lpc_mci.SendCnt >= (SD_BLOCKSIZE))          
     			break;	                                    /* 已發送完一個數據塊 */
    	}     	    
    }
}


/*******************************************************************************************************************
** 函數名稱: MCI_RxActiveProcess()				
**
** 功能描述: MCI 接收數據處理函數
********************************************************************************************************************/
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 )
	   	{                                                    /* 循環從FIFO中讀取數據 */
		    while (!((Status = MCIStatus) & MCI_RX_DATA_AVAIL))
		    {
		        if ((Status & MCI_RX_OVERRUN) != 0)          /* 判斷是否發生FIFO下溢錯誤 */
		        {
		            MCIDataCtrl = 0;
		            MCIClear    = 0x7FF;
		            MCIMask0    = 0;
		            MCIMask1    = 0;
		            lpc_mci.RxTxFlag = SD_ERR_HARDWARE;
		            return;
		        }
		    }
		    DataWord = MCIFIFO;                              /* 從FIFO中讀取一個32位的數據 */
		    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;                             /* 計數器計數 */
            if (lpc_mci.RecCnt >= (SD_BLOCKSIZE))
     			break;		    
	    }
	}

}


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

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

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


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

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

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

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


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

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



/*************************
LPC23xx DMA 初始化函數
**************************/

#if LPC23xx_MCI_DMA_EN

/*******************************************************************************************************************
** 函數名稱: 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一区二区三区免费野_久草精品视频
亚洲欧美另类图片小说| 一区二区欧美国产| 亚洲国产精品一区二区久久恐怖片 | 综合激情网...| 蜜臀99久久精品久久久久久软件| 国产高清在线精品| 9191国产精品| 亚洲精品成人精品456| 国产乱人伦精品一区二区在线观看 | 欧美日本视频在线| 亚洲精品欧美激情| 成人av免费在线| 精品99久久久久久| 免费日本视频一区| 欧美日韩国产美| 一区二区激情视频| 日本伦理一区二区| 亚洲欧美日韩国产综合在线| 国产v综合v亚洲欧| 精品国产一二三| 免费看日韩a级影片| 欧美精品亚洲一区二区在线播放| 日韩美女视频19| av在线播放不卡| 亚洲欧洲精品成人久久奇米网| 国产一区二区三区在线观看免费| 欧美一二三在线| 麻豆国产欧美日韩综合精品二区 | 国产日产欧美一区| 国产精品123区| 2020国产精品| 国产精品系列在线观看| 久久久三级国产网站| 国产一区二区在线电影| 久久综合狠狠综合| 国产麻豆成人精品| 亚洲国产成人在线| 91天堂素人约啪| 亚洲精品第一国产综合野| 欧美性videosxxxxx| 亚洲一区二区三区四区中文字幕| 色婷婷综合久久久| 午夜日韩在线观看| 日韩欧美视频在线| 国产一区欧美日韩| 中文字幕制服丝袜成人av | 亚洲综合丝袜美腿| 精品视频一区二区不卡| 免费观看在线综合| 久久久久久亚洲综合影院红桃| 国产成人在线影院 | 韩国精品主播一区二区在线观看| 精品国产乱码久久| 岛国精品在线播放| 一区二区三区视频在线看| 欧美肥妇free| 国产精品1区2区3区在线观看| 国产精品乱人伦| 在线观看日韩高清av| 奇米精品一区二区三区在线观看一| 精品国产123| 色综合久久综合中文综合网| 性感美女极品91精品| 欧美成人aa大片| 成人黄页在线观看| 日韩成人精品视频| 国产精品久久久久久户外露出| 欧洲视频一区二区| 激情综合色综合久久| 亚洲女性喷水在线观看一区| 7777精品伊人久久久大香线蕉超级流畅| 久久激情五月激情| 夜夜操天天操亚洲| 久久人人97超碰com| 色婷婷综合中文久久一本| 国产在线精品一区二区不卡了| 日韩久久一区二区| 久久久久久久综合色一本| 在线精品视频免费观看| 国产91丝袜在线观看| 日韩影视精彩在线| 综合久久久久久| 国产视频一区二区在线| 欧美妇女性影城| 色婷婷综合久久久中文字幕| 国产又粗又猛又爽又黄91精品| 亚洲成国产人片在线观看| 国产精品美女久久久久久久久| 欧美一级欧美一级在线播放| 一本在线高清不卡dvd| 丁香六月久久综合狠狠色| 蜜桃av一区二区| 亚洲成人自拍偷拍| 亚洲女人小视频在线观看| 日本一区二区三区四区在线视频 | 欧美另类变人与禽xxxxx| av成人老司机| 成人黄色大片在线观看| 国产精品一二三区| 久久99精品久久久久婷婷| 日本在线不卡视频一二三区| 一区二区三区日韩在线观看| 国产精品久久免费看| 日韩欧美亚洲国产精品字幕久久久| 国产精品久久久一区麻豆最新章节| 精品处破学生在线二十三| 91精品国产欧美一区二区18| 欧美视频精品在线| 日韩欧美不卡一区| 亚洲一区二区在线免费观看视频| 欧美极品美女视频| 中文字幕不卡一区| 国产女主播一区| 亚洲国产精品av| 国产精品色在线观看| 国产午夜精品一区二区三区四区| 久久色.com| 中文字幕va一区二区三区| 欧美国产视频在线| 国产精品麻豆网站| 最新不卡av在线| 亚洲午夜私人影院| 日韩精品色哟哟| 黄页网站大全一区二区| 国产一区视频导航| 97精品久久久久中文字幕 | 中文字幕日韩欧美一区二区三区| 欧美精彩视频一区二区三区| 国产农村妇女精品| 亚洲欧美激情插| 日本中文字幕不卡| 国产成人在线影院| 日本大香伊一区二区三区| 欧美日韩三级一区| 日韩欧美在线综合网| 久久综合九色欧美综合狠狠| 国产精品理论片| 亚洲va欧美va天堂v国产综合| 日本不卡视频一二三区| 国产自产2019最新不卡| 成人免费视频免费观看| 欧美三级日韩在线| 精品国产乱码久久久久久蜜臀| 久久精品亚洲国产奇米99| 亚洲欧美一区二区不卡| 免费在线观看不卡| av在线这里只有精品| 欧美精品丝袜中出| 中文字幕第一区二区| 亚洲国产一区在线观看| 国产伦精品一区二区三区免费| 97精品电影院| 欧美电影免费观看高清完整版| 国产精品视频观看| 日韩综合一区二区| 不卡视频免费播放| 欧美成人精品高清在线播放| 中文字幕一区在线观看| 强制捆绑调教一区二区| 99久久国产综合精品色伊| 制服丝袜一区二区三区| 中文字幕一区二区三区在线不卡| 日韩av一级电影| 99久久精品国产精品久久| 欧美va亚洲va香蕉在线| 亚洲综合清纯丝袜自拍| 国产宾馆实践打屁股91| 555夜色666亚洲国产免| 亚洲丝袜另类动漫二区| 国产一区三区三区| 欧美一区二区视频在线观看2022| 中文字幕国产一区二区| 捆绑调教一区二区三区| 91黄色免费观看| 国产精品久久久久9999吃药| 极品美女销魂一区二区三区| 欧美日免费三级在线| 亚洲婷婷综合久久一本伊一区| 精品一区二区久久久| 4438亚洲最大| 亚洲午夜一区二区三区| 99久久精品情趣| 欧美国产日本韩| 国产69精品久久99不卡| 欧美精品一区二区三区很污很色的| 一区二区三区四区在线免费观看| 国产aⅴ综合色| 久久久久久久久蜜桃| 蜜臀av性久久久久蜜臀av麻豆| 在线成人免费观看| 无码av免费一区二区三区试看| 色综合中文字幕| 亚洲男人的天堂在线aⅴ视频| 成人av资源网站| 国产精品三级视频| 91影院在线免费观看| 综合久久久久久| 在线观看网站黄不卡| 夜夜夜精品看看| 欧美日韩一级二级|