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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? sdhal.c

?? 基于lpc2378的SD/MMC卡讀寫(xiě)程序
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			sdhal.c
** Last modified Date:	2007-5-20
** Last Version:		V2.0
** Descriptions:		SD/MMC卡讀寫(xiě)模塊: 硬件抽象層 ---- SD總線硬件相關(guān)的操作函數(shù)
**
**
**------------------------------------------------------------------------------------------------------
** Created by:			Ming Yuan Zheng
** Created date:		2005-1-6
** Version:				V1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			
** Modified date:		
** Version:				
** Descriptions:		
**
**------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified date:
** Version:	
** Descriptions: 
**
********************************************************************************************************/

#include "sdconfig.h"


#if SDBUS_MODE_EN

#if LPC23xx_MCI_DMA_EN
INT32U *src_addr; 
INT32U *dest_addr;
#endif
 

/* mci_struct 結(jié)構(gòu)體成員 RxTxFlag 取值 */
#define  MCI_RESET_FLAG             0xFF
#define  MCI_CUR_REC                0x01
#define  MCI_CUR_SEND               0x02

/* MCI數(shù)據(jù)傳輸結(jié)構(gòu)體 */
typedef struct MCI_STRUCT
{
    INT8U CurTran;              // 當(dāng)前數(shù)據(jù)傳輸類(lèi)型, 可為MCI_CUR_REC或MCI_CUR_SEND
    INT8U RxTxFlag;             // 數(shù)據(jù)接收/發(fā)送標(biāo)志, 用于標(biāo)識(shí)接收/發(fā)送執(zhí)行結(jié)果

    INT8U *pRecBuf;             // 接收數(shù)據(jù)緩沖區(qū)指針
    INT8U *pSendBuf;            // 發(fā)送數(shù)據(jù)緩沖區(qū)指針
    INT32U RecCnt;              // 接收數(shù)據(jù)計(jì)數(shù)器
    INT32U SendCnt;             // 發(fā)送數(shù)據(jù)計(jì)數(shù)器
    
    sd_struct *psds;            // 當(dāng)前sd_struct結(jié)構(gòu)體指針
}mci_struct;

volatile mci_struct lpc_mci;    // mci_struct結(jié)構(gòu)體變量



void SD_PowerOff(void);
void MCI_Delay(INT16U val);
void MCI_SendCmd(INT32U CmdIndex, INT32U Argument, INT32U ExpectResp, INT32U AllowTimeout );
INT8U MCI_GetCmdResp(INT32U ExpectCmdData, INT32U ExpectResp, INT8U resplen, INT32U *CmdResp);

	/**********************************************
		
		硬件抽象層接口函數(shù)實(shí)現(xiàn)文件
	
	***********************************************/

/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_Initialize()				
**
** 功能描述: 初始化訪問(wèn)卡的硬件條件		
**
** 輸   入: sd_struct *sds:  卡信息結(jié)構(gòu)體
**							  	
** 輸   出: 無(wú)
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
**
** 主要工作: 1. 先給卡下電, 再給卡上電;     2. 設(shè)置訪問(wèn)卡的速度小于或等于 400KHz;
**
**           3. 使 CMD 線處于開(kāi)漏狀態(tài);      4. 初始化相關(guān)硬件寄存器為適當(dāng)?shù)臓顟B(tài)
********************************************************************************************************************/
INT8U SdHal_Initialize(sd_struct *sds)
{
    // 卡下電并延時(shí)
    SD_PowerOff(); 
	MCI_Delay(1);				            

	// 卡上電并初始化MCI相關(guān)引腳
	SD_POWER_ON();
    PCONP |= (1 << 28);					    /* 使能MCI控制器工作時(shí)鐘 */	

    MCI_CLK_PIN();                          /* 配置MCI接口各功能引腳 */    
	MCI_CMD_PIN();
	MCI_DAT0_PIN();              
	MCI_DAT1_PIN();              
	MCI_DAT2_PIN();              
	MCI_DAT3_PIN();
	
	SD_INSERT_GPIO();                       /* 配置卡插入檢測(cè)引腳 */
	SD_INSERT_IN();  
	               
	SD_WP_GPIO();                           /* 配置卡寫(xiě)保護(hù)檢測(cè)引腳 */   
	SD_WP_IN();      
	           
    MCIPower = 0x02;
	MCI_Delay(1);                           /* 延時(shí) */ 
    MCIPower |= 0x01;
    MCIPower |= (1 << 6 );	                /* CMD線處于開(kāi)漏狀態(tài) */
  	
	// 設(shè)置訪問(wèn)卡時(shí)鐘小于 400KHz
	SdHal_SetMCIClock(sds, SD_RATE_SLOW); 

	// 清空 MCI 相關(guān)寄存器		
    MCICommand = 0;						    
	MCIClear = 0x7FF;						/* 清空MCI狀態(tài)寄存器 */
	MCIDataCtrl = 0;						
    MCIMask0 = 0;							
    MCIMask1 = MCIMask0;                    /* 屏蔽所有 MCI 中斷 */
	
#if LPC23xx_MCI_DMA_EN
	PCONP |= (1 << 29);   	                /* 使能 GPDMA 時(shí)鐘 */
#endif

	return SD_NO_ERR;
}												


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SD_PowerOff()				
**
** 功能描述: 給卡下電, 將	
**
** 輸   入: 無(wú)
**							  	
** 輸   出: 無(wú)
**
** 返 回 值: 無(wú)
********************************************************************************************************************/
void SD_PowerOff(void)
{
	SD_POWER_GPIO();
	SD_POWER_OUT();
	SD_POWER_OFF();							/* 關(guān)閉 SD 卡電源  turn off power of sd card */
	
    MCI_CLK_GPIO();                         /* 配置MCI接口各功能引腳 */    
	MCI_CMD_GPIO();
	MCI_DAT0_GPIO();              
	MCI_DAT1_GPIO();              
	MCI_DAT2_GPIO();              
	MCI_DAT3_GPIO();
		
    MCI_CLK_OUT();                          /* 配置MCI接口各功能引腳 */    
	MCI_CMD_OUT();
	MCI_DAT0_OUT();              
	MCI_DAT1_OUT();              
	MCI_DAT2_OUT();              
	MCI_DAT3_OUT();	
	
    MCI_CLK_CLR();                          /* 配置MCI接口各功能引腳 */    
	MCI_CMD_CLR();
	MCI_DAT0_CLR();              
	MCI_DAT1_CLR();              
	MCI_DAT2_CLR();              
	MCI_DAT3_CLR();	
	
	PCONP &= ~(1 << 28);					/* 關(guān)閉工作時(shí)鐘 */	
	MCIPower = 0x00;                        /* 配置電源控制寄存器 */
    MCIClock = 0;
    //MCIClock &= ~(1 << 8);                  /* 關(guān)閉MCICLK時(shí)鐘 */	
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_OpenDrainCmd()				
**
** 功能描述: 設(shè)置 CMD 信號(hào)線的開(kāi)漏狀態(tài) 	
**
** 輸   入: sd_struct *sds  : 卡信息結(jié)構(gòu)體
**           INT8U bOpenDrain: > 0: CMD 信號(hào)線開(kāi)漏;  = 0: CMD 信號(hào)線處于非開(kāi)漏 
**          							  	
** 輸   出: 無(wú)
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
**
** 主要工作: 1. 初始化相關(guān)硬件寄存器;  2. 先給卡下電, 再上電;  3. 設(shè)置訪問(wèn)卡的速度小于或等于 400KHz
**
**           4. 使 CMD 線處于開(kāi)漏狀態(tài)
********************************************************************************************************************/
void SdHal_OpenDrainCmd(sd_struct *sds, INT8U bOpenDrain)
{
    if (bOpenDrain)
        MCIPower |= (1 << 6 );	            /* CMD線處于開(kāi)漏狀態(tài) */      
    else
        MCIPower &= ~(1 << 6 );	            /* CMD線處于非開(kāi)漏狀態(tài) */      
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_SendCmd()				
**
** 功能描述: 發(fā)送一個(gè)SD/MMC命令, 并獲得響應(yīng)			
**
** 輸   入: sd_struct *sds:  卡信息結(jié)構(gòu)體, 僅使用sds->card_posnum成員用于區(qū)分卡座
			 INT8U cmd:       命令索引(命令的[5:0]位)
**		     INT32U argument: 命令參數(shù)
**			 INT8U resptype:  響應(yīng)類(lèi)型, 取值可以為R0(即不需要響應(yīng)), R1, R1B, R2, R3, R6 
**			 INT8U resplen:   響應(yīng)長(zhǎng)度, 
**                            當(dāng)響應(yīng)為R0時(shí), 取值為0(對(duì)應(yīng)resp指針也可為空).
**                            當(dāng)響應(yīng)為R1,R1B,R3,R6時(shí), 取值4; 
**                            當(dāng)響應(yīng)為R2時(shí), 取值為16(R2的bit[127:0]).
**							  	
** 輸   出: INT32U *resp:    響應(yīng)內(nèi)容, bit127在resp[0]的bit32
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_SendCmd(sd_struct *sds, INT8U cmd, INT32U argument, INT8U resptype, INT32U *resp, INT8U resplen)
{
    INT32U ExpectResp, i;
    INT32U ret;
    
    if (resptype == R0)
    {
        ExpectResp = EXPECT_NO_RESP;                        /* 卡無(wú)須響應(yīng)本命令 */
    } 
    else if ((resptype == R1) || (resptype == R1B) || (resptype == R3) || (resptype == R6))
    {
        ExpectResp = EXPECT_SHORT_RESP;                     /* 短響應(yīng) */
    }  
    else if (resptype == R2)
    {
        ExpectResp = EXPECT_LONG_RESP;                      /* 長(zhǎng)響應(yīng) */
    } 
    else 
    {
        return SD_ERR_CMD_RESPTYPE;							/* 錯(cuò)誤的響應(yīng)類(lèi)型 */
    }
                
    MCI_SendCmd(cmd, argument, ExpectResp, 0);				/* 發(fā)送命令并獲取響應(yīng) */
    ret = MCI_GetCmdResp(cmd, ExpectResp, resplen, resp);
    if (ret != SD_NO_ERR)
        return ret;
       
    for (i = 0; i < 0x200; i++);	                        /* 延時(shí), 確保 MCICommand 寄存器在規(guī)定時(shí)間內(nèi)不再次被寫(xiě)入 */
  
    return ret;
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_EnableMCIBusWidth()				
**
** 功能描述: 使能SD/MMC主控器是否使能寬總線		
**
** 輸   入: sd_struct *sds: 卡信息結(jié)構(gòu)體, 僅使用sds->card_posnum成員用于區(qū)分卡座
**           INT32U bWidth : > 0:  使能寬總線;     0: 禁止寬總線     
**							  	
** 輸   出: 無(wú)
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
********************************************************************************************************************/
void SdHal_EnableMCIBusWidth(sd_struct *sds, INT32U bWidth)
{
	if (bWidth != 0)
		MCIClock |= (1 << 11);
	else
		MCIClock &= ~(1 << 11);
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_SetMCIClock()				
**
** 功能描述: 設(shè)置讀寫(xiě)SD/MMC卡時(shí)鐘		
**
** 輸   入: sd_struct *sds  :  卡信息結(jié)構(gòu)體
**           INT32U ClockRate:	要求的時(shí)鐘速度.  取值SD_RATE_SLOW   時(shí), 設(shè)置訪問(wèn)卡速度小于 400KHz		
**			  	                                 取值SD_RATE_NORMAL 時(shí), 設(shè)置訪問(wèn)卡速度為卡的最大速度或主控器的最大速度
** 輸   出: 無(wú)
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
**
** 注    意: 本函數(shù)有責(zé)任在ClockRate取不同的值時(shí), 計(jì)算出相應(yīng)的 sds->clkval 值, 必須大于0. 
**
********************************************************************************************************************/
void SdHal_SetMCIClock(sd_struct *sds, INT32U ClockRate)
{
    INT32U i;
    INT32 div = 0;
    
    sds->host_clkval = 400000;
    PCLKSEL1 &= ~(0x03 << 24);                          
    PCLKSEL1 |= 0x01 << 24;                             /* MCICLK = Fcclk */
     
	if (ClockRate == SD_RATE_SLOW)
	{
		div = MCLKDIV_SLOW;	                            /* 設(shè)置時(shí)鐘小于等于400KHz */
		sds->host_clkval = Fcclk / (div + 1) / 2;       /* MCI 總線周期頻率 = MCLK / (2 * (div + 1)) */
	}
	else if (ClockRate == SD_RATE_NORMAL) 
	{
	    //div = Fcclk / sds->card_transpeed / 2 - 1;    /* 根據(jù)卡數(shù)據(jù)的最大傳輸速度計(jì)算分頻值 */ 	    
	    //if (div < 0)     div = 0;
	    //if (div > 254)   div = 254;   
	    div = MCLKDIV_NORMAL;	
	        		               
		sds->host_clkval = Fcclk / (div + 1) / 2;       /* MCI 總線周期頻率 = MCLK / (2 * (div + 1)) */
	}
	
	MCIClock &= ~0xFF;
	MCIClock = (1 << 8) | (1 << 9) | div;
	for (i = 0; i < 0x10; i++);	                        /* 在下次寫(xiě)MCIClock前, 延時(shí) 3MCLK + 2PCLK */
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_CheckCard()				
**
** 功能描述: 檢測(cè)卡是否完全插入卡座中
**
** 輸   入: sd_struct *sds:  卡信息結(jié)構(gòu)體
**	         
** 輸   出: 無(wú)
**
** 返 回 值: 1: 卡完全插入	   0: 卡沒(méi)有完全插入
********************************************************************************************************************/
INT8U SdHal_CheckCard(sd_struct *sds)
{
	if (SD_INSERT_STATUS() != 0)
		return 0;								/* 未完全插入 */
	else
		return 1;								/* 完全插入 */
}


/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_CheckCardWP()				
**
** 功能描述: 檢測(cè)卡寫(xiě)保護(hù)
**
** 輸   入: sd_struct *sds:  卡信息結(jié)構(gòu)體
**	         
** 輸   出: 無(wú)
**
** 返 回 值: 1: 卡已寫(xiě)保護(hù)	  0: 卡未寫(xiě)保護(hù)
********************************************************************************************************************/
INT8U SdHal_CheckCardWP(sd_struct *sds)
{
	if (SD_WP_STATUS() != 0)
		return 1;								/* 寫(xiě)保護(hù) */
	else
		return 0;								/* 未寫(xiě)保護(hù) */
}



/*******************************************************************************************************************
** 函數(shù)名稱(chēng): SdHal_BeforeReadBlock()				
**
** 功能描述: 在發(fā)送讀單塊命令之前, 給硬件控制器做一些事情的機(jī)會(huì)
**
** 輸   入: sd_struct *sds  :  卡信息結(jié)構(gòu)體 
**	         
** 輸   出: 無(wú)
**
** 返 回 值: 0:   正確    >0:   錯(cuò)誤碼, 見(jiàn) sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_BeforeReadBlock(sd_struct *sds)
{	
    MCIMask0 |= (DATA_RX_INT_MASK) | (FIFO_INT_MASK);	    /* 僅使能接收中斷 */
	MCIMask1 = MCIMask0;

	MCIClear = 0x7FF;							            /* 清空清零寄存器的所有標(biāo)志 */
	MCIDataCtrl = 0;							            /* 數(shù)據(jù)控制寄存器清0  */
			 
	MCIDataTimer = sds->timeout_read;                       /* 讀數(shù)據(jù)塊超時(shí)值 */
	MCIDataLength = SD_BLOCKSIZE;				            /* 塊長(zhǎng)度 */
    MCIFifoCnt = 0;                                         /* 清空接收FIFO計(jì)數(shù)器*/

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品三级av在线| 日韩成人一级片| 国产亚洲视频系列| 日韩欧美一级二级三级久久久| 欧美色倩网站大全免费| 欧美日韩美少妇 | 日韩欧美一级片| 日韩三级视频在线看| 日韩三级电影网址| 精品久久久久一区二区国产| 久久综合给合久久狠狠狠97色69| 久久久美女毛片| 国产午夜精品一区二区三区嫩草| 日本一区二区三区在线观看| 中文字幕不卡在线播放| 综合网在线视频| 一区二区三区四区在线| 香蕉成人啪国产精品视频综合网| 婷婷久久综合九色综合绿巨人| 日韩影视精彩在线| 国产一区二区三区在线观看免费 | 国产.精品.日韩.另类.中文.在线.播放| 国产乱人伦偷精品视频不卡| 成人黄色在线看| 色噜噜狠狠成人网p站| 欧美日韩一级二级| 欧美成人精精品一区二区频| 欧美激情中文字幕| 亚洲在线观看免费视频| 六月丁香综合在线视频| 成人午夜私人影院| 在线观看免费成人| 精品91自产拍在线观看一区| 一区二区在线观看免费| 亚洲午夜av在线| 激情小说亚洲一区| 91麻豆swag| 日韩欧美一级二级| 中文字幕日韩欧美一区二区三区| 性做久久久久久免费观看| 国内成+人亚洲+欧美+综合在线| 成人免费高清在线| 欧美挠脚心视频网站| 久久精品欧美一区二区三区不卡| 一区二区三区国产精华| 美女视频黄 久久| 91日韩精品一区| 日韩一区二区免费高清| 亚洲欧洲日韩一区二区三区| 天天综合网天天综合色| 丰满白嫩尤物一区二区| 欧美日韩色综合| 国产欧美视频一区二区三区| 午夜精品久久久久影视| 不卡的av中国片| 日韩欧美123| 亚洲欧美偷拍另类a∨色屁股| 青草av.久久免费一区| 91蜜桃视频在线| 精品伦理精品一区| 洋洋成人永久网站入口| 国产美女视频91| 欧美二区三区91| 亚洲精品视频在线看| 国产在线视频一区二区三区| 欧美无砖砖区免费| 国产精品视频第一区| 捆绑变态av一区二区三区| 色老汉av一区二区三区| 中文欧美字幕免费| 久久er99热精品一区二区| 欧美系列在线观看| 国产精品久久久久久户外露出| 久久国内精品视频| 欧美在线免费观看亚洲| 综合久久久久久| 国产成人综合精品三级| 日韩欧美高清在线| 婷婷六月综合亚洲| 欧美亚洲丝袜传媒另类| 中文字幕日韩精品一区| 国产激情一区二区三区桃花岛亚洲| 日韩一区二区免费电影| 日产国产高清一区二区三区| 精品视频一区二区不卡| 亚洲精品久久久久久国产精华液| 国产福利一区二区三区| 精品国产乱码久久久久久免费| 午夜欧美大尺度福利影院在线看| 色94色欧美sute亚洲线路一久| 国产精品久久久久久久久搜平片| 国产精品一区二区在线观看网站| wwww国产精品欧美| 久久99国产乱子伦精品免费| 日韩一区二区三| 久久精品国产一区二区| 亚洲人一二三区| 成人国产电影网| 国产精品二三区| 国产精品一区二区在线观看网站| 精品动漫一区二区三区在线观看| 日韩国产在线一| 欧美日韩美女一区二区| 五月婷婷综合网| 51精品视频一区二区三区| 亚洲成av人影院在线观看网| 欧美色爱综合网| 亚洲成人免费在线观看| 91精品国产综合久久福利软件| 日韩黄色在线观看| 欧美r级电影在线观看| 久久丁香综合五月国产三级网站| 久久综合成人精品亚洲另类欧美| 国产精品一区二区你懂的| 欧美激情在线观看视频免费| 99视频一区二区| 亚洲综合一区在线| 91精品国产麻豆| 国产久卡久卡久卡久卡视频精品| 欧美国产欧美亚州国产日韩mv天天看完整| 国产98色在线|日韩| 中文字幕一区不卡| 欧美性videosxxxxx| 日本美女一区二区| 国产亚洲综合在线| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲成人在线网站| 精品1区2区在线观看| 成人免费av资源| 亚洲成人动漫一区| 久久色中文字幕| 99免费精品在线| 日韩av二区在线播放| www一区二区| 色综合久久99| 美日韩黄色大片| 国产精品嫩草99a| 欧美浪妇xxxx高跟鞋交| 精品一区二区精品| 亚洲日本在线观看| 91精品欧美福利在线观看| 国产成人av影院| 亚洲精品视频在线观看网站| 日韩欧美一区二区免费| 99久久综合国产精品| 日本不卡一二三区黄网| 国产日产欧美一区| 欧美日韩国产高清一区二区三区 | 亚洲理论在线观看| 欧美一级日韩免费不卡| 不卡的电视剧免费网站有什么| 五月婷婷色综合| 国产精品久久久久久久久久久免费看| 欧美精品精品一区| 成人av网在线| 日本亚洲最大的色成网站www| 欧美激情中文字幕| 欧美一区欧美二区| av色综合久久天堂av综合| 美女在线视频一区| 亚洲欧美aⅴ...| 久久精品视频在线看| 欧美日韩电影一区| 99九九99九九九视频精品| 激情综合网av| 亚洲成人免费av| 日韩一区欧美一区| 久久亚洲私人国产精品va媚药| 欧美在线视频全部完| 成人国产视频在线观看| 国模少妇一区二区三区| 午夜亚洲福利老司机| 18成人在线观看| 国产亚洲欧美激情| 精品欧美久久久| 欧美日韩成人综合在线一区二区| 91天堂素人约啪| 国产高清在线精品| 久久超碰97人人做人人爱| 午夜亚洲福利老司机| 亚洲精品欧美在线| 国产精品久久久久久福利一牛影视 | 粗大黑人巨茎大战欧美成人| 久久国产夜色精品鲁鲁99| 五月天亚洲精品| 亚洲成在人线免费| 亚洲一区二区三区中文字幕| 中文字幕在线视频一区| 久久精品亚洲国产奇米99| 精品欧美一区二区三区精品久久| 91精品国产综合久久香蕉的特点 | 国产精品午夜春色av| 久久精品亚洲乱码伦伦中文 | 夜夜揉揉日日人人青青一国产精品| 中文字幕乱码久久午夜不卡| 精品国产91九色蝌蚪| 精品久久五月天| 精品理论电影在线| 精品国产一区二区三区不卡 | 天堂成人国产精品一区|