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

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

?? sdhal.c

?? 基于lpc2378的SD/MMC卡讀寫程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/****************************************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卡讀寫模塊: 硬件抽象層 ---- SD總線硬件相關的操作函數
**
**
**------------------------------------------------------------------------------------------------------
** 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 結構體成員 RxTxFlag 取值 */
#define  MCI_RESET_FLAG             0xFF
#define  MCI_CUR_REC                0x01
#define  MCI_CUR_SEND               0x02

/* MCI數據傳輸結構體 */
typedef struct MCI_STRUCT
{
    INT8U CurTran;              // 當前數據傳輸類型, 可為MCI_CUR_REC或MCI_CUR_SEND
    INT8U RxTxFlag;             // 數據接收/發送標志, 用于標識接收/發送執行結果

    INT8U *pRecBuf;             // 接收數據緩沖區指針
    INT8U *pSendBuf;            // 發送數據緩沖區指針
    INT32U RecCnt;              // 接收數據計數器
    INT32U SendCnt;             // 發送數據計數器
    
    sd_struct *psds;            // 當前sd_struct結構體指針
}mci_struct;

volatile mci_struct lpc_mci;    // mci_struct結構體變量



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);

	/**********************************************
		
		硬件抽象層接口函數實現文件
	
	***********************************************/

/*******************************************************************************************************************
** 函數名稱: SdHal_Initialize()				
**
** 功能描述: 初始化訪問卡的硬件條件		
**
** 輸   入: sd_struct *sds:  卡信息結構體
**							  	
** 輸   出: 無
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
**
** 主要工作: 1. 先給卡下電, 再給卡上電;     2. 設置訪問卡的速度小于或等于 400KHz;
**
**           3. 使 CMD 線處于開漏狀態;      4. 初始化相關硬件寄存器為適當的狀態
********************************************************************************************************************/
INT8U SdHal_Initialize(sd_struct *sds)
{
    // 卡下電并延時
    SD_PowerOff(); 
	MCI_Delay(1);				            

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

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

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

	return SD_NO_ERR;
}												


/*******************************************************************************************************************
** 函數名稱: SD_PowerOff()				
**
** 功能描述: 給卡下電, 將	
**
** 輸   入: 無
**							  	
** 輸   出: 無
**
** 返 回 值: 無
********************************************************************************************************************/
void SD_PowerOff(void)
{
	SD_POWER_GPIO();
	SD_POWER_OUT();
	SD_POWER_OFF();							/* 關閉 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);					/* 關閉工作時鐘 */	
	MCIPower = 0x00;                        /* 配置電源控制寄存器 */
    MCIClock = 0;
    //MCIClock &= ~(1 << 8);                  /* 關閉MCICLK時鐘 */	
}


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


/*******************************************************************************************************************
** 函數名稱: SdHal_SendCmd()				
**
** 功能描述: 發送一個SD/MMC命令, 并獲得響應			
**
** 輸   入: sd_struct *sds:  卡信息結構體, 僅使用sds->card_posnum成員用于區分卡座
			 INT8U cmd:       命令索引(命令的[5:0]位)
**		     INT32U argument: 命令參數
**			 INT8U resptype:  響應類型, 取值可以為R0(即不需要響應), R1, R1B, R2, R3, R6 
**			 INT8U resplen:   響應長度, 
**                            當響應為R0時, 取值為0(對應resp指針也可為空).
**                            當響應為R1,R1B,R3,R6時, 取值4; 
**                            當響應為R2時, 取值為16(R2的bit[127:0]).
**							  	
** 輸   出: INT32U *resp:    響應內容, bit127在resp[0]的bit32
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 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;                        /* 卡無須響應本命令 */
    } 
    else if ((resptype == R1) || (resptype == R1B) || (resptype == R3) || (resptype == R6))
    {
        ExpectResp = EXPECT_SHORT_RESP;                     /* 短響應 */
    }  
    else if (resptype == R2)
    {
        ExpectResp = EXPECT_LONG_RESP;                      /* 長響應 */
    } 
    else 
    {
        return SD_ERR_CMD_RESPTYPE;							/* 錯誤的響應類型 */
    }
                
    MCI_SendCmd(cmd, argument, ExpectResp, 0);				/* 發送命令并獲取響應 */
    ret = MCI_GetCmdResp(cmd, ExpectResp, resplen, resp);
    if (ret != SD_NO_ERR)
        return ret;
       
    for (i = 0; i < 0x200; i++);	                        /* 延時, 確保 MCICommand 寄存器在規定時間內不再次被寫入 */
  
    return ret;
}


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


/*******************************************************************************************************************
** 函數名稱: SdHal_SetMCIClock()				
**
** 功能描述: 設置讀寫SD/MMC卡時鐘		
**
** 輸   入: sd_struct *sds  :  卡信息結構體
**           INT32U ClockRate:	要求的時鐘速度.  取值SD_RATE_SLOW   時, 設置訪問卡速度小于 400KHz		
**			  	                                 取值SD_RATE_NORMAL 時, 設置訪問卡速度為卡的最大速度或主控器的最大速度
** 輸   出: 無
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
**
** 注    意: 本函數有責任在ClockRate取不同的值時, 計算出相應的 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;	                            /* 設置時鐘小于等于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;    /* 根據卡數據的最大傳輸速度計算分頻值 */ 	    
	    //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++);	                        /* 在下次寫MCIClock前, 延時 3MCLK + 2PCLK */
}


/*******************************************************************************************************************
** 函數名稱: SdHal_CheckCard()				
**
** 功能描述: 檢測卡是否完全插入卡座中
**
** 輸   入: sd_struct *sds:  卡信息結構體
**	         
** 輸   出: 無
**
** 返 回 值: 1: 卡完全插入	   0: 卡沒有完全插入
********************************************************************************************************************/
INT8U SdHal_CheckCard(sd_struct *sds)
{
	if (SD_INSERT_STATUS() != 0)
		return 0;								/* 未完全插入 */
	else
		return 1;								/* 完全插入 */
}


/*******************************************************************************************************************
** 函數名稱: SdHal_CheckCardWP()				
**
** 功能描述: 檢測卡寫保護
**
** 輸   入: sd_struct *sds:  卡信息結構體
**	         
** 輸   出: 無
**
** 返 回 值: 1: 卡已寫保護	  0: 卡未寫保護
********************************************************************************************************************/
INT8U SdHal_CheckCardWP(sd_struct *sds)
{
	if (SD_WP_STATUS() != 0)
		return 1;								/* 寫保護 */
	else
		return 0;								/* 未寫保護 */
}



/*******************************************************************************************************************
** 函數名稱: SdHal_BeforeReadBlock()				
**
** 功能描述: 在發送讀單塊命令之前, 給硬件控制器做一些事情的機會
**
** 輸   入: sd_struct *sds  :  卡信息結構體 
**	         
** 輸   出: 無
**
** 返 回 值: 0:   正確    >0:   錯誤碼, 見 sddriver.h 文件
********************************************************************************************************************/
INT8U SdHal_BeforeReadBlock(sd_struct *sds)
{	
    MCIMask0 |= (DATA_RX_INT_MASK) | (FIFO_INT_MASK);	    /* 僅使能接收中斷 */
	MCIMask1 = MCIMask0;

	MCIClear = 0x7FF;							            /* 清空清零寄存器的所有標志 */
	MCIDataCtrl = 0;							            /* 數據控制寄存器清0  */
			 
	MCIDataTimer = sds->timeout_read;                       /* 讀數據塊超時值 */
	MCIDataLength = SD_BLOCKSIZE;				            /* 塊長度 */
    MCIFifoCnt = 0;                                         /* 清空接收FIFO計數器*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品国产更新| a亚洲天堂av| 天天操天天干天天综合网| 国产精品美日韩| www亚洲一区| 精品国产99国产精品| 欧美一三区三区四区免费在线看| 色婷婷狠狠综合| 日本精品一级二级| 91久久久免费一区二区| 99精品国产99久久久久久白柏| 国产成人综合在线| 成人av网址在线| 精品少妇一区二区| 色丁香久综合在线久综合在线观看| 成人97人人超碰人人99| 91无套直看片红桃| 色94色欧美sute亚洲线路一ni | 国产成人精品影视| 国产精品自拍在线| 高清成人免费视频| 91免费视频大全| 91福利国产精品| 欧美视频一区在线| 欧美视频日韩视频| 日韩一区二区三区三四区视频在线观看 | 午夜精品福利久久久| 亚洲sss视频在线视频| 亚洲高清免费视频| 欧美aaa在线| 国产精品99久久久久久宅男| 高清成人在线观看| 欧美在线观看禁18| 91麻豆精品国产91久久久| 日韩欧美国产小视频| 国产亚洲精品bt天堂精选| 久久精品男人天堂av| 国产精品国产馆在线真实露脸| 亚洲男人的天堂在线观看| 水蜜桃久久夜色精品一区的特点| 强制捆绑调教一区二区| 国产一区日韩二区欧美三区| 9i在线看片成人免费| 欧美日韩精品高清| 久久久久久一级片| 亚洲男人的天堂在线aⅴ视频| 无码av中文一区二区三区桃花岛| 黄色成人免费在线| 91啪九色porn原创视频在线观看| 欧美视频在线不卡| 久久精品一区二区三区不卡| 亚洲精品日韩综合观看成人91| 婷婷夜色潮精品综合在线| 国产精品99久久久久久久vr| 在线免费观看视频一区| 精品久久五月天| 亚洲激情图片一区| 韩国三级在线一区| 人人爽香蕉精品| 丝袜美腿亚洲色图| 国产成人精品影视| 欧美日韩激情一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w | 性感美女极品91精品| 国产91对白在线观看九色| 欧美视频一区二区| 国产情人综合久久777777| 天天免费综合色| 99r国产精品| 久久婷婷国产综合国色天香| 一区二区三区在线免费视频| 精久久久久久久久久久| 欧美在线啊v一区| 日本一二三不卡| 青青草国产成人av片免费| 日本精品一区二区三区四区的功能| www国产成人免费观看视频 深夜成人网| 成人欧美一区二区三区小说 | 亚洲色图在线播放| 国产激情91久久精品导航| 91精品国产高清一区二区三区| 国产精品久久久久影院亚瑟| 久久99精品久久久久久久久久久久| 一本色道综合亚洲| 欧美国产日本韩| 精品一区二区三区不卡| 欧美久久久久久久久| 亚洲蜜臀av乱码久久精品蜜桃| 国产乱对白刺激视频不卡| 欧美精选午夜久久久乱码6080| 亚洲精品综合在线| voyeur盗摄精品| 欧美经典一区二区三区| 国产一区二区福利视频| 精品卡一卡二卡三卡四在线| 强制捆绑调教一区二区| 欧美老肥妇做.爰bbww视频| 亚洲国产成人91porn| 在线观看视频欧美| 亚洲精品免费播放| 99国产精品国产精品久久| 中文字幕亚洲区| 国产成人精品www牛牛影视| 日韩欧美国产wwwww| 美女www一区二区| 欧美一三区三区四区免费在线看| 天堂精品中文字幕在线| 欧美日韩一区不卡| 偷拍自拍另类欧美| 7777精品伊人久久久大香线蕉| 午夜欧美电影在线观看| 欧美日韩精品欧美日韩精品一综合| 亚洲国产精品一区二区www | 91麻豆成人久久精品二区三区| 国产精品青草综合久久久久99| 国产美女娇喘av呻吟久久| 久久精品欧美一区二区三区不卡| 国产成人精品亚洲午夜麻豆| 久久欧美中文字幕| 成人a级免费电影| 亚洲婷婷综合色高清在线| 色综合久久中文综合久久97| 一区av在线播放| 3atv一区二区三区| 激情六月婷婷久久| 国产精品美女一区二区三区| 97久久超碰国产精品| 亚洲美女屁股眼交3| 欧美三区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩精品中文字幕一区 | 日韩一区二区三区高清免费看看| 久久精品国产77777蜜臀| 国产亚洲一二三区| 99国内精品久久| 亚洲成人精品一区二区| 欧美区在线观看| 国产一区二区三区黄视频 | 久久不见久久见中文字幕免费| 久久久久久久综合狠狠综合| proumb性欧美在线观看| 亚洲综合色婷婷| 精品伦理精品一区| 国产精品色哟哟网站| 东方欧美亚洲色图在线| 一区二区视频在线看| 欧美精品v日韩精品v韩国精品v| 另类小说色综合网站| 亚洲国产精华液网站w| 欧美亚洲动漫另类| 精品亚洲欧美一区| 中文字幕在线播放不卡一区| 欧美色精品在线视频| 国产一区二区三区高清播放| 亚洲免费看黄网站| 日韩片之四级片| 99精品欧美一区| 美女mm1313爽爽久久久蜜臀| 国产精品美女久久久久av爽李琼| 欧美三区在线视频| 国产精品一二三四区| 亚洲一二三四久久| 久久精品夜色噜噜亚洲a∨| 色婷婷综合激情| 国产乱子伦视频一区二区三区| 亚洲午夜视频在线观看| 国产视频一区在线观看| 欧美日韩精品一区二区三区| 国产成人在线看| 五月天久久比比资源色| 国产精品美女视频| 日韩免费成人网| 色菇凉天天综合网| 福利一区在线观看| 免费日韩伦理电影| 亚洲一区二区不卡免费| 欧美国产成人精品| 日韩免费高清av| 欧美亚洲综合久久| av不卡在线播放| 国产一区二区免费看| 日韩精品一二三区| 亚洲精品成人少妇| 国产精品色噜噜| 久久久99精品免费观看不卡| 欧美日韩精品是欧美日韩精品| 北条麻妃一区二区三区| 精品一区二区影视| 日韩在线一区二区| 一区二区视频在线看| 国产精品不卡在线| 国产午夜精品福利| 欧美sm极限捆绑bd| 在线不卡免费欧美| 欧美四级电影在线观看| 91亚洲国产成人精品一区二三| 国产一本一道久久香蕉| 久久国产夜色精品鲁鲁99| 日本欧美加勒比视频| 日日夜夜一区二区|