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

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

?? sd_driver.c

?? 飛思卡爾MC9S12uf32的一些實用驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:

		while(!(gSD_SDSATAT&0x0400)) ;					// wait for cmd end
		kSD_OCR_H = SD_SDRSP;
		kSD_OCR_M = SD_SDRSP;
		kSD_OCR_L = SD_SDRSP;
		kSD_OCR_H = ( (kSD_OCR_H & 0xff) <<24);
		kSD_OCR_M = ( kSD_OCR_M << 8);
		kSD_OCR_L = ( (kSD_OCR_L & 0xFF00) >> 8);
		kSD_OCR =( kSD_OCR_H | kSD_OCR_M | kSD_OCR_L);
		gSD_SDSATAT=0;		
	  kSD_OCR &= 0x00FF8000;			 // check the OCR range is within 2.7v~3.6V	
		if(kSD_OCR)				// response not 0, means the card has response. Must be a MMC card
		  goto InitMMCLoop;

InitLoop:

		//-------------------
		// card initializtion
		SD_SendCommand(0x0037, 0x0000, 0x0000, 0x0001);		// cmd55

		while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
//		SD_CheckResponse();		// to checking ACMD response to identify whether the plugged card is SD or MMC
				
		SD_SendCommand(0x0029, 0x00FF, 0x8000, 0x0003);		// cmd41, OCR

		UTL_Delay(6);
		while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
		kSD_OCR_H = SD_SDRSP;
		kSD_OCR_M = SD_SDRSP;
		kSD_OCR_L = SD_SDRSP;
		kSD_OCR_H = ( (kSD_OCR_H & 0xff) <<24);
		kSD_OCR_M = ( kSD_OCR_M << 8);
		kSD_OCR_L = ( (kSD_OCR_L & 0xFF00) >> 8);
		kSD_OCR =( kSD_OCR_H | kSD_OCR_M | kSD_OCR_L);
		gSD_SDSATAT=0;		

		for(i=0; i<70; i++)	
			asm NOP;					// delay 900us for next card init
		if((kSD_loop_counter == 10000) && (kSD_OCR == 0))
			goto InitMMCLoop;//			return(1);					// SD identification error

		else if((!(kSD_OCR & 0x80000000)) && (kSD_loop_counter<100000) )
		{
			kSD_loop_counter++;
			goto InitLoop;
		}

		else if( (kSD_OCR & 0x80000000) && (kSD_loop_counter<100000) )
			gSD_SDcard = 1;				// plugged flash card is SD
						
		goto EndInitLoop;
	
InitMMCLoop:
			SD_SendCommand(0x0001, 0x80FF, 0x8000, 0x0003);	// CMD1 SEND_OP_COND, for MMC initializtion
			while(!(gSD_SDSATAT&0x0400)) ;								// wait for cmd end
			kSD_OCR_H = SD_SDRSP;
			kSD_OCR_M = SD_SDRSP;
			kSD_OCR_L = SD_SDRSP;
			kSD_OCR_H = ( (kSD_OCR_H & 0xff) <<24);
			kSD_OCR_M = ( kSD_OCR_M << 8);
			kSD_OCR_L = ( (kSD_OCR_L & 0xFF00) >> 8);
			kSD_OCR =( kSD_OCR_H | kSD_OCR_M | kSD_OCR_L);
			gSD_SDSATAT=0;		

			for(i=0; i<70; i++)	
				asm NOP;			
	
			if((!(kSD_OCR & 0x80000000)) && (kSD_loop_counter<4000) )
			{
				kSD_loop_counter++;
				goto InitMMCLoop;
			}
			else if(kSD_loop_counter == 4000)
				return(1);					// SD identification error
			
			if( (kSD_OCR & 0x80000000) && (kSD_loop_counter<4000) )
				gSD_SDcard = 0;				// plugged flash card is MMC
				
EndInitLoop:	
			return(0);	
}

// ==================================================================
//   SD_Init() -
//
//   Step 3, to initialize the flash card
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//  
//	Returned value list:
//						0: no error
//						1: An error happened while SD_AllSendCID
//						2: An error happened while SD_AllSendRCA
//						3: An error happened while SD_SendCSD
//						4: An error happened while SD_SelectSDcard
//						5: An error happened while SD_SetBlockLength
//						6: An error happened while SD_SetBusWidth
//
// ==================================================================
muint8	SD_Init(void)
{	
//	muint8	kSD_ReturnedValue;

	
	SD_AllSendCID();
	
	SD_AllSendRCA();		
	
	SD_SendCSD();
			
	SD_SelectSDcard((muint16)(gSD_RCA));
		
	SD_SetBlockLength(0x0200);				// set block length to 512 bytes


//	if(!gSD_SDcard)							// MMC card plugged
//		SD_SetBusWidth(0x01);				// 1 bit mode
//	else 
		if (gSD_SDcard)
			SD_SetBusWidth(0x04);				// SD card plugged, force to 4-bits mode

	SD_SDCLKCON = 0x000a;		// card clk enable, 1/2, 6MHz
	UTL_Delay(1);
		
	return(0);
}


// ==================================================================
//   SD_AllSendCID() -
//
//   Ask the card to send out it's CID (Card Identification)
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//	Returned value list:
//						0: no error
//						1: An error happened while SD_AllSendCID
//
// ==================================================================
void	SD_AllSendCID(void)
{
	muint16	i;

	gSD_SDSATAT=0;		
	SD_SDBLKLN = 0x0200;					// set block length to 512 bytes
	SD_SendCommand(0x0002, 0x0000, 0x0000, 0x0002);		
	while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
	
	for(i=0;i<8;i++)
		gSD_CID[i] = SD_SDRSP;
	gSD_SDSATAT=0;		

	for(i=0; i<100; i++)	
		asm NOP;							// delay 1ms for next card init		
	

}



// ==================================================================
//   SD_AllSendRCA() -
//
//   Ask the card to send out it's RCA (Card Relative Address)
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
//	Returned value list:
//						0: no error
//						1: An error happened while SD_AllSendRCA
//
// ==================================================================
void	SD_AllSendRCA(void)
{
	muint16	i;
	muint16 kSD_RCA_H, kSD_RCA_M, kSD_RCA_L;	
	
	gSD_SDSATAT=0;		
	//-----------------
	// all send RCA
	if(gSD_SDcard)
	{
		SD_SendCommand(0x0003, 0x0000, 0x0000, 0x0001);	

		while(!(gSD_SDSATAT&0x0400)) ;				// wait for cmd end
		kSD_RCA_H = SD_SDRSP;
		kSD_RCA_M = SD_SDRSP;
		kSD_RCA_L = SD_SDRSP;	
		gSD_SDSATAT=0;	
		kSD_RCA_H = (kSD_RCA_H & 0x00ff);			// RCA[31:16]
		kSD_RCA_M = ( kSD_RCA_M & 0xff00);
		gSD_RCA =( (kSD_RCA_H << 8) | (kSD_RCA_M >> 8));	
	}			
	else
	{
		gSD_RCA = 0x0102;			// for MMC card
		SD_SendCommand(0x0003, gSD_RCA, 0x0000, 0x0001);		// RCA=0xaaaa for MMC card

		while(!(gSD_SDSATAT&0x0400)) ;				// wait for cmd end
	}

	for(i=0; i<100; i++)	
		asm NOP;			// delay 1ms for next card init	
		
}


// ==================================================================
//   SD_SendCSD() -
//
//   Ask the card to send out it's CSD (Card Specific Data)
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
//	Returned value list:
//						0: no error
//						1: An error happened while SD_SendCSD
//
// ==================================================================
void	SD_SendCSD(void)
{
	muint16	i;

	gSD_SDSATAT=0;		
	SD_SendCommand(0x0009, (muint16)gSD_RCA, 0x0000, 0x0002);	// CMD9 SEND_CSD
	while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
	
	for(i=0; i<8; i++)
		gSD_CSD[i] = SD_SDRSP;
	for(i=0; i<100; i++)	
		asm NOP;			// delay 1ms for next card init				

//	gSD_MaxBlockNumber = ( ((gSD_CSD[3] & 0x3FF) << 2) | ( (gSD_CSD[4] & 0xC000) >> 14) ) * pow(2, ( (gSD_CSD[5] & 0x7000) >> 12 )+2 );
//	gSD_Capacity = (muint32)gSD_MaxBlockNumber * 0.5;

//	for(i=0; i<7; i++)
//		kSD_Temp |=	gSD_CSD[i];
//		
//	if(kSD_Temp == 0)
//		return(1);
//	else
//		return(0);			// no error
		
}


// ==================================================================
//   SD_SelectSDcard() -
//
//   Select the card
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//	Returned value list:
//						0: no error, the card is ready
//						1: the card is not ready
//
// ==================================================================
void	SD_SelectSDcard(muint16 kSD_RCA)
{
	muint16	i;
//	muint32 kSD_Temp;
	
	gSD_SDSATAT=0;		
	SD_SendCommand(0x0007, kSD_RCA, 0x0000, 0x0001);	// 0xbb0b: Toshiba SD card

	UTL_Delay(6);

	while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
	
	SD_SDBLKLN = 0x0200;		// set block length to 512 bytes
	SD_SDNOBLK = 2;				// test, Number of block in block mode transmission					

	for(i=0; i<100; i++)	
		asm NOP;			// delay 1ms for next card init		
//		
//	kSD_Temp =SD_CheckResponse();
//	if((kSD_Temp & 0x0100) == 0x0100)	// bit8=1 means the card is ready
//		return(0);			// no error
//	else
//		return(1);			// not ready
	
}



// ==================================================================
//   SD_SetBlockLength() -
//
//   Set block length fixed to 512 bytes
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
//	Returned value list:
//						0: no error, the card is ready
//						1: the card is not ready
//
// ==================================================================
void	SD_SetBlockLength(muint16 SD_BlockLength)
{
	muint16	i;
	
	gSD_SDSATAT=0;		
	SD_SendCommand(0x0010, 0x0000, SD_BlockLength, 0x0001);	

	while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
	for(i=0; i<100; i++)	
		asm NOP;			// delay 1ms for next card init	

//	kSD_Temp =SD_CheckResponse();
//	if((kSD_Temp & 0x0100) == 0x0100)	// bit8=1 means the card is ready
//		return(0);			// no error
//	else
//		return(1);			// not ready	
	
}



// ==================================================================
//   SD_SetBusWidth() -
//
//   Set bus width to 1 or 4 bits mode
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
//	Returned value list:
//						0: no error, the card is ready
//						1: the card is not ready
//
// ==================================================================
void	SD_SetBusWidth(muint16 SD_BusWidth)
{
	muint16	i;

	gSD_SDSATAT=0;		
	if(gSD_SDcard)
	{
		SD_SendCommand(0x0037, (muint16)gSD_RCA, 0x0000, 0x0001);	// cmd55, RCA, stuff bits
		UTL_Delay(6);

		while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
		if(SD_BusWidth == 1)
			SD_SendCommand(0x0006, 0x0000, 0x0000, 0x0001);		// cmd6 SET_BUS_WIDTH, [31:2]stuff bits, [1:0] bus width, 00=1bit, 0x200=1bit

		else
			SD_SendCommand(0x0006, 0x0000, 0x0002, 0x0201);		// 4 bits

		while(!(gSD_SDSATAT&0x0400)) ;			// wait for cmd end
		
		UTL_Delay(6);
		for(i=0; i<100; i++)	
			asm NOP;			// delay 1ms for next card init	

//		kSD_Temp =SD_CheckResponse();
//
//	if((kSD_Temp & 0x0100) == 0x0100)	// bit8=1 means the card is ready
//		return(0);			// no error
//	else
//		return(1);			// not ready
	
	}
	
}



// ==================================================================
//   SD_CheckStatus() -
//
//     Check the response from SD card
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
//	Returned value list:
//			0: RDY
//			1: Not RDY
//
// ==================================================================
muint8	SD_CheckStatus(void)
{	
	muint32 kSD_ResponseCheck;
	muint16	i;

	gSD_SDSATAT=0;		
	SD_SendCommand(0x000d, gSD_RCA, 0x0000, 0x0001);	// CMD13 SEND_STATUS,

	while(!(gSD_SDSATAT&0x0400)) ;								// wait for cmd end

	kSD_ResponseCheck = SD_CheckResponse();

	for(i=0; i<100; i++)	
		asm NOP;			// delay 1ms for next card init	
	if( (kSD_ResponseCheck&0x0100)==0x0100 )			// bit8=1=RDY
		return(1);	// the card is ready

	else
		return(0);	// the card is not ready
}


// ==================================================================
//   SD_CheckResponse() -
//
//     Check the response from SD card
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
// ==================================================================
muint32	SD_CheckResponse(void)
{
	muint32 kSD_Resp;
	muint8 	*cptr;

	cptr=(muint8*)&kSD_Resp;
	*cptr++=0;
	*cptr++ = (muint8)SD_SDRSP;
	*cptr++ = (muint8)SD_SDRSP; 
	*cptr++ = (muint8)SD_SDRSP;
	
	return(kSD_Resp);
}


// ==================================================================
//   SD_SendCommand() -
//
//
//	Input -		nil
//
//	Output - 	nil
//
//	Function -	nil.
//
// ==================================================================
void	SD_SendCommand(muint16 SD_CMDNo, muint16 SD_argh, muint16 SD_argl, muint16 SD_RespNo)
{
//	muint16 i;

	SD_SDCMDNO 		= SD_CMDNo;		
	SD_SDARGH 		= SD_argh;			
	SD_SDARGL 		= SD_argl;	
	SD_SDCMDATCON = SD_RespNo;		

	while (!(gSD_SDSATAT &  0x0400));
}


// ==================================================================
//   SD_LBACommand1() -
//
//     To set command to SM device
//
//	Input -		=	3 command parameters
//				
//	Output - 	=	
//
//	Function returns error code
//
// ==================================================================
muint8 SD_LBACommand1(muint8 Block, muint8 *pLBA, muint8 QueBuffer)
{
	muint32				*lptr;
	volatile muint32 SD_LBA;
	muint16 status;

	lptr=(muint32*)pLBA;	
	gSD_LBA=*lptr;
	
	gSD_DSCR_B = Block;
	
	mClearBit(QnEN,QC1CR);				// disable QC1
	QC1REQ	= 0xff;						// remap QC1 to mon-existing resources
	QC2REQ	= 0xff;						// remap QC1 to mon-existing resources
	mSetBit(DBRST,QC34DCR);				// reset QC34
	mSetBit(QnPRST, QC3CR);				// reset QC3

	SD_LBA=gSD_LBA;
		    
	IQUECR = (1<<CH34DBE)+(1<<IQUEEN);	// Enable double buffer
    QC34DTR = 0;							// Enable force handshake
	mClearBit(SBTE,QC34DCR);				// clear single buffer mode

    QC3CR=0x17;							// Q1SML = 0, large buffer 16-bit transfer
    QC3SZB=0x10+QueBuffer<<1;			// 512 bytes block, starting from $x000+QueBuffer
    QC3REQ=0x08;						// SD Rx channel		
 	
  	status = SD_QUE_ReadMultipleBlock(SD_LBA, gSD_DSCR_B);		  

	IQUECR = (1<<CH34DBE)+(1<<IQUEEN);	// Enable double buffer
	QC34DTR = (1<<DTHE)+(1<<DRHE);		// Enable force handshake
  	QC3CR = (1<<QnEN)+(1<<Qn16EN)+(1<<QnPRST);	
	QC3SZB = 0x12;						// 2 block 0f 256 bytes (HS), base 0x2000
	QC3REQ = 0x01;						// Channel 3 set to USB TX
 	
 	QC1CR  = (1<<QnEN)+(1<<Qn16EN)+(1<<QnPRST);
	QC1SZB = 0x10;						// 2 block of 256 bytes (HS)	  
	QC1REQ = 0x00;						// Channel 1 set to USB RX

	return(0);	
}


//
// The end of file sd_driver.c 
// *********************************************************************************

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产另类不卡| 国产精品久久久久久久久动漫| 欧美激情一区二区三区全黄| 蜜桃视频在线观看一区| 精品久久99ma| 成人综合婷婷国产精品久久| 亚洲欧洲精品成人久久奇米网| 在线欧美一区二区| 亚洲第一会所有码转帖| 欧美人与禽zozo性伦| 91色porny蝌蚪| 亚洲男人的天堂在线观看| 色成人在线视频| 成人欧美一区二区三区视频网页| 亚洲影视在线观看| 精品日韩在线一区| 一本久久精品一区二区| 男女男精品网站| 国产精品乱码人人做人人爱| 欧美一区二区三区思思人| 久久99精品久久久久久国产越南| 亚洲欧美激情插| 中文字幕高清一区| 日韩欧美中文一区| 欧美一区二区三区免费| 成人禁用看黄a在线| 狠狠色伊人亚洲综合成人| 一区二区三区日韩在线观看| 精品国产伦理网| 久久这里只有精品首页| 日韩一二三四区| 91精品综合久久久久久| 在线视频亚洲一区| 欧美唯美清纯偷拍| 91福利视频网站| 精品国产乱码久久久久久1区2区 | 亚洲乱码国产乱码精品精的特点| 欧美一级艳片视频免费观看| 欧美色图免费看| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲欧美另类图片小说| 欧美国产精品v| 亚洲色图欧洲色图婷婷| 亚洲一二三区视频在线观看| 午夜影院在线观看欧美| 香蕉久久一区二区不卡无毒影院| 亚洲美女淫视频| 日韩精品亚洲一区| 国产主播一区二区| 一本大道av伊人久久综合| 欧美日韩亚洲综合一区二区三区| 欧美亚洲图片小说| 精品999久久久| 亚洲天堂免费在线观看视频| 亚洲一二三四久久| 精品一区二区三区视频| 色8久久精品久久久久久蜜| 欧美撒尿777hd撒尿| 国产女同互慰高潮91漫画| 亚洲欧美日本韩国| 精品一区二区影视| 91国偷自产一区二区使用方法| 日韩欧美卡一卡二| 一区二区在线免费观看| 大陆成人av片| 日韩精品专区在线影院重磅| 一区二区日韩av| 99久久久无码国产精品| 欧美极品美女视频| 日本aⅴ免费视频一区二区三区| 一本一道久久a久久精品综合蜜臀| 欧美伊人久久久久久久久影院| 国产午夜精品福利| 国产麻豆精品在线| 久久精品一区二区| 国产精品一区专区| 国产欧美一区二区精品久导航| 免费在线观看精品| wwww国产精品欧美| 国产精品中文字幕日韩精品| 日韩一二在线观看| 激情综合色播激情啊| 久久无码av三级| 成人午夜av电影| 国产精品乱码一区二三区小蝌蚪| 精品一区二区久久久| 亚洲国产精品成人综合色在线婷婷 | 欧美一级久久久| 国产精品一区二区在线看| 中文字幕av一区二区三区免费看 | 欧美高清hd18日本| 看国产成人h片视频| 中文字幕一区二区在线观看| 在线视频一区二区三| 久久精品国产999大香线蕉| 久久久久高清精品| 欧美日韩在线观看一区二区| 九九视频精品免费| 亚洲午夜羞羞片| 日本一区二区动态图| 欧美夫妻性生活| 成人国产精品免费观看视频| 三级不卡在线观看| 亚洲精品日韩一| 精品精品国产高清a毛片牛牛| 91激情在线视频| 成人黄色小视频在线观看| 日日摸夜夜添夜夜添精品视频| 欧美激情综合五月色丁香小说| 欧美午夜精品免费| 91在线观看一区二区| 国产在线播精品第三| 老司机一区二区| 日本成人在线电影网| 天堂资源在线中文精品| 亚洲成人免费视频| 亚洲成人三级小说| 视频一区视频二区在线观看| 一区二区三区免费观看| 亚洲国产精品久久久久婷婷884| 中文字幕精品三区| 日韩毛片精品高清免费| 亚洲国产经典视频| 国产精品国产精品国产专区不片| 国产亚洲婷婷免费| 国产精品视频一二三| 国产精品久久综合| 综合电影一区二区三区| 亚洲自拍都市欧美小说| 亚洲成人1区2区| 精品一区二区在线看| 成人av在线电影| 欧美日韩大陆一区二区| 欧美大片顶级少妇| 中文一区一区三区高中清不卡| 国产喷白浆一区二区三区| 亚洲激情图片qvod| 免费成人深夜小野草| 国产成人综合精品三级| eeuss影院一区二区三区| 日本韩国一区二区三区| 7777精品伊人久久久大香线蕉完整版| 日韩精品一区二区三区在线观看| 国产欧美日韩视频一区二区| 亚洲成人tv网| 色综合色狠狠天天综合色| 精品久久一区二区| 一区二区三区国产| 成人av电影在线观看| 欧美一区二区三区四区高清| 国产精品久久久久7777按摩| 免费精品视频最新在线| 色8久久精品久久久久久蜜| 久久久久99精品国产片| 美女视频一区二区| 538prom精品视频线放| 1区2区3区国产精品| 懂色av噜噜一区二区三区av| 欧美大片顶级少妇| 国产一区在线不卡| 精品国产乱码久久久久久1区2区 | 亚洲国产成人自拍| 粉嫩av一区二区三区| 国产精品久久久久久久久图文区| 国内精品伊人久久久久av一坑| 欧美一区二区日韩一区二区| 日韩国产在线一| 欧美日韩一区国产| 青娱乐精品视频在线| 在线91免费看| 国产精品一级在线| 中文字幕av一区二区三区高 | 亚洲欧美福利一区二区| 色哟哟欧美精品| 日韩不卡手机在线v区| 精品国产3级a| 91亚洲精品久久久蜜桃网站| 亚洲欧洲精品一区二区三区不卡 | 成人国产免费视频| 亚洲一区自拍偷拍| 精品处破学生在线二十三| 国产黑丝在线一区二区三区| 亚洲综合在线观看视频| 日韩视频免费观看高清完整版 | av不卡免费在线观看| 亚洲第一成年网| 国产精品久久久久天堂| 91精品在线一区二区| 91蝌蚪国产九色| 激情久久久久久久久久久久久久久久| 国产精品传媒视频| 26uuu国产在线精品一区二区| 色偷偷久久一区二区三区| 国产精品99久久不卡二区| 日本不卡123| 日韩国产一二三区| 中文字幕在线观看一区| 国产亚洲视频系列| 久久综合九色欧美综合狠狠| 欧美日韩一区中文字幕|