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

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

?? sd.c

?? SD和FAT文件系統.rar
?? C
字號:

#include "..\inc\sd.h"
#include "..\inc\44b.h"

SD_INFO g_SDInfo;

volatile char endSioTR=0;
//啟用中斷傳輸模式
void __irq Sio_Int(void)			//SPI中斷函數
{
	rI_ISPC = BIT_SIO;				//清零中斷標志位
	endSioTR = 1;
}

/*************************************************************************
* 名稱: void SPI_MasterTransmit(INT8U u8Data)				 									 
* 功能: SPI主機模式傳送數據				       									
* 參數: cData 要傳輸的字節數據    		                   									
* 返回: SPI接收值		                           								
*************************************************************************/
INT8U SPI_MasterTransmit(INT8U u8Data)
{
	rSIODAT = u8Data;
	rSIOCON |= (1 << 3);  //啟動數據傳輸 
	while (!endSioTR); 	//等待傳輸結束
	endSioTR = 0;
	return rSIODAT;  //返回SPI接收的數據
}
/*************************************************************************
*名稱: SD_SendCMD													 
*功能: 向SD卡發送命令	       									
*參數: u8Cmd 命令 u32Arg 參數					          									
*返回: SD卡狀態值		                           								
*************************************************************************/	
INT8U SD_SendCMD(INT8U u8Cmd, INT32U u32Arg)
{
	INT8U r1;
	INT16U Temp = 0;
	SPI_CS_ASSERT;
	SPI_MasterTransmit(u8Cmd | 0x40);	//分別寫入命令	
	SPI_MasterTransmit(u32Arg >> 24);
	SPI_MasterTransmit(u32Arg >> 16);
	SPI_MasterTransmit(u32Arg >> 8);
	SPI_MasterTransmit(u32Arg);
	SPI_MasterTransmit(0x95);
	do{
		r1 = SPI_MasterTransmit(0xFF);
		if(Temp++ > 100) 
		{
			break; 						//超時退出
		}	
	}while(r1 == 0xFF);
	SPI_CS_DEASSERT;
	SPI_MasterTransmit(0xFF); 			//發送8個填充時鐘
	return r1; 							//返回狀態值	
}
/*************************************************************************
*名稱: SD_GetOCR
*功能: 獲取OCR寄存器數據	       									
*參數: *pu8Buff 數據緩存區指針
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_GetOCR(INT8U *pu8Buff)
{
	INT8U i;
	INT8U r1=0;
	r1 = SD_SendCMD(CMD_SD_SEND_OP_COND, 0);
	if(r1 != 0) //響應錯誤
	{
		return 1;
	}
	SPI_CS_ASSERT;	
    for (i = 0; i < 4; i++)
    {
    	pu8Buff[i] = SPI_MasterTransmit(0xFF);
    }
	SPI_CS_DEASSERT;	
	return 0;
}
/*************************************************************************
*名稱: SD_GetCID
*功能: 獲取CID寄存器數據	       									
*參數: *pu8Buff 數據緩存區指針
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_GetCID(INT8U *pu8Buff)
{
	INT8U i;
	INT8U Temp = 0;
	INT8U r1=0;
	r1 = SD_SendCMD(CMD_SEND_CID,0);//發送讀CSD寄存器命令
	if(r1 != 0) //響應錯誤
	{
		return 1;
	}
	SPI_CS_ASSERT;
	do{
		r1 = SPI_MasterTransmit(0xFF);
		if(Temp++ > 100)
		{
			return 1;
		}
	}while(r1 != 0xFE); //等待數據起始令牌
    for (i = 0; i < 16; i++)
    {
    	pu8Buff[i] = SPI_MasterTransmit(0xFF);
    }
  SPI_MasterTransmit(0xFF); //發送8個填充時鐘
	SPI_CS_DEASSERT;	
	return 0;	
}
/*************************************************************************
*名稱: SD_GetCSD
*功能: 獲取CSD寄存器數據	       									
*參數: *pu8Buff 數據緩存區指針
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_GetCSD(INT8U *pu8Buff)
{
	INT8U i;
	INT8U Temp = 0;
	INT8U r1=0;
	r1 = SD_SendCMD(CMD_SEND_CSD ,0);
	r1 = SD_SendCMD(CMD_SEND_CSD ,0);//發送讀CSD寄存器命令
	if(r1 != 0) //響應錯誤
	{
		return 1;
	}
	SPI_CS_ASSERT;
	do{
		r1 = SPI_MasterTransmit(0xFF);
		if(Temp++ > 100)
		{
			return 1;
		}
	}while(r1 != 0xFE); //等待數據起始令牌
		
    for (i = 0; i < 16; i++)
    {
    	pu8Buff[i] = SPI_MasterTransmit(0xFF);
    }
  SPI_MasterTransmit(0xFF); //發送8個填充時鐘
	SPI_CS_DEASSERT;	
	return 0;	
}
/*************************************************************************
*名稱: SD_GetCardInfo
*功能: 獲取卡片信息
*參數: 
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_GetCardInfo(SD_INFO *pg_SDInfo)
{
	INT8U Temp[16];
    if(SD_GetCID(Temp) == 0)		//獲取CID信息
    {
       	INT8U i;
       	pg_SDInfo->mid = Temp[0];
		pg_SDInfo->oid[0] = Temp[1];
		pg_SDInfo->oid[1] = Temp[2];  
		for(i = 0; i < 5; i++)
		{
			pg_SDInfo->pnm[i] = Temp[i + 3];
		}
        pg_SDInfo->prv = Temp[1];
		pg_SDInfo->psn = ((INT32U)Temp[9] << 24) + ((INT32U)Temp[10] << 16)
				+ ((INT32U)Temp[11] << 8) + (INT32U)Temp[12];
				//計算32位串號
		pg_SDInfo->mdt = Temp[14];
    }
    else
    {
        return 3;       
    }
	if(SD_GetCSD(Temp) == 0)		//獲取CSD信息
	{
		INT32U j;
		pg_SDInfo->bl = 1 << (Temp[5] & 0x0F);	//計算塊長度
	
		 
		pg_SDInfo->bn = ((Temp[6] & 0x03) << 10) +
						(Temp[7] << 2) + ((Temp[8] & 0xC0) >> 6);	
                							//計算C_SIZE + 1
		j = ((Temp[9] & 0x03) << 1) + ((Temp[10] & 0x80) >> 7);
	      									//計算C_SIZE_MULT	
    	
		pg_SDInfo->bn = (pg_SDInfo->bn + 1) * (1 << (j + 2));	
        		//計算BLOCKNR = (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2)	
        pg_SDInfo->cap = pg_SDInfo->bl * pg_SDInfo->bn; //計算容量大小
        pg_SDInfo->cap >>= 20;
	}
	else
	{
		return 4;
	}
	return 0;
}
/*************************************************************************
*名稱: SD_Init													 
*功能: SD卡初始化	       									
*參數: 無					          									
*返回: 0成功 非零是失敗		                           								
*************************************************************************/	
INT8U SD_Init(PSD_INFO psdi)
{
	INT8U i;
	INT8U Temp = 0;
	INT8U r1=0;
	
	pISR_SIO = (unsigned)Sio_Int;      //中斷入口地址
	rINTMSK = ~(BIT_GLOBAL | BIT_SIO);
	//-- SPI(SIO) port initialize
	rPCONF = (rPCONF & 0x3ff) + (3 << 19) + (3 << 16) + (3 << 13) + (3 << 10);
	rPUPF |= 0x160; //Rx must pullup

	//-- SPI(SIO) controller & card initialize
	rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x1 << 5) | (0x0 << 4) | (0x0 << 3) | (0x0 << 2) | 0x1;
	//inter clk, MSB 1st, Tx/Rx, falling, no action, auto run, SIO int
	rSBRDR = 99; //MCLK=60MHz,SIOCK=300KHz(in initialize time)
	rIVTCNT = 0;
	
	for (i = 0;i < 20;i++) 		//至少發送74個脈沖 
	{
		SPI_MasterTransmit(0xFF);
	}
	
	do								//復位存儲卡
	{
		r1 = SD_SendCMD(CMD_GO_IDLE_STATE , 0); //發IDLE命令	
		if(Temp++ > 20)
		{
			return 1;				//超時退出
		}		
	} while(r1 != 0x01);
	
	Temp = 0;
	do								//激活存儲卡
	{
		r1 = SD_SendCMD(CMD_SEND_OP_COND , 0); 	//發CMD1命令激活卡	
		if(Temp++ > 20)
		{
			return 1;					//超時退出
		}		
	} while(r1 != 0x01);
	do 									//判斷卡片類型
	{
		r1 = SD_SendCMD(CMD_APP, 0); 	//發CMD55命令	
		if(r1 == 0x01) 					//響應正確
		{
			r1 = SD_SendCMD(CMD_SD_SEND_OP_COND, 0);//發ACMD41命令
			if(r1 == 0x00) 				//SD卡
			{
				psdi->ct = SD_TYPE_SD	; 
			}
		}
		
		else							//響應錯誤
		{
			r1 = SD_SendCMD(CMD_SEND_OP_COND , 0); //發CMD1命令激活卡
			if(r1 == 0x00)				//MMC卡
			{
				psdi->ct = SD_TYPE_MMC;
			}
		}
	//	Uart_Printf("卡的類型\n",&psdi->ct);
/*		if(Temp++ > 20)
		{
			return 1;				//超時退出
		}	*/
	} while(r1 != 0x00);
	Uart_Printf("SD卡的類型\n");
	
	if(SD_GetCardInfo(psdi) != 0)	// 獲取存儲卡信息失敗
	{
		return 1;
	}
	Uart_Printf("獲取存儲卡信息\n");
	r1 = SD_SendCMD(CMD_CRC_ON_OFF, 0);   // 關閉crc16
	r1 = SD_SendCMD(CMD_CRC_ON_OFF, 0);
	if(r1 != 0 )
	{
		return 1;
	}
	Uart_Printf("關閉crc16\n");
	r1 = SD_SendCMD(CMD_SET_BLOCKLEN, 512); 	// 設扇區大小512
	if(r1 != 0 )
	{
		return 1;
	}
	Uart_Printf("\nIn ready state\n");
	rSIOCON = (0x0 << 7) | (0x0 << 6) | (0x1 << 5) | (0x0 << 4) | (0x0 << 3) | (0x0 << 2) | 0x1;
	rSBRDR = 5; 	//MCLK=60MHz,SIOCK=5MHz
	rIVTCNT = 0;
	return 0;	
}
/*************************************************************************
*名稱: SD_ReadBlockSingle
*功能: 讀取單塊數據
*參數: u32Sector扇區地址, *pBuff讀取數據存飯緩存指針
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_ReadBlockSingle(INT32U u32Sector, INT8U *pu8Buff)
{

	INT16U Temp = 0;
	INT8U r1 = 0;
	INT16U i = 0;
	do{
		r1 = SD_SendCMD(CMD_READ_SINGLE_BLOCK, u32Sector << 9);
											 //發送讀BLOCK命令
		if(Temp++ > 10) //超時返回
		{
             return 1;
		}
	}while(r1 != 0x00);
	Temp = 0;
	SPI_CS_ASSERT;
	while( SPI_MasterTransmit(0xFF) != 0xFE); //等待數據起始令牌
  for (i = 0; i < 512; i++) //讀取一整塊數據
  {
  	pu8Buff[i] = SPI_MasterTransmit(0xFF);
  }
  SPI_MasterTransmit(0xFF); //接收偽CRC16
  SPI_MasterTransmit(0xFF); 
	SPI_CS_DEASSERT;
  SPI_MasterTransmit(0xFF); //發送8個填充時鐘

	return 0;	
}
/*************************************************************************
*名稱: SD_WriteBlockSingle
*功能: 寫取單塊數據
*參數: u32Sector扇區地址, *pBuff指向寫入數據
*返回: 0成功 非零失敗
*************************************************************************/
INT8U SD_WriteBlockSingle(INT32U u32Sector, INT8U *pu8Buff)
{
	INT16U i;
	INT8U Temp = 0;
	INT8U r1 = 0;
	do{
		r1 = SD_SendCMD(CMD_WRITE_SINGLE_BLOCK, u32Sector << 9); 
								//發送讀BLOCK命令
		if(Temp++ > 10)
		{
            return 1;
		}
	}while(r1 != 0);
	SPI_CS_ASSERT;
    SPI_MasterTransmit(0xFF);
    SPI_MasterTransmit(0xFE); //發送數據起始令牌
    for (i = 0; i < 512; i++)
    {
    	SPI_MasterTransmit(*pu8Buff++);
    }
    SPI_MasterTransmit(0xFF); //發送偽CRC16
    SPI_MasterTransmit(0xFF);
    r1 = SPI_MasterTransmit(0xFF);
    if((r1 & 0x0F) != 0x05) //等待是否成功
    {
        SPI_MasterTransmit(0xFF);
        SPI_CS_DEASSERT;
        return 1;
    }
    while(SPI_MasterTransmit(0xFF) != 0xFF); //等待是否完成
    SPI_MasterTransmit(0xFF);
	SPI_CS_DEASSERT;	
	return 0;	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久先锋影音av鲁色资源网| 99国产欧美另类久久久精品| 欧美日韩另类一区| 欧美精品xxxxbbbb| 久久久777精品电影网影网 | 亚洲欧洲日韩av| 国产成人在线电影| 国产日韩在线不卡| gogogo免费视频观看亚洲一| **网站欧美大片在线观看| 91毛片在线观看| 91福利精品第一导航| 亚洲精品久久嫩草网站秘色| 欧美调教femdomvk| av激情成人网| 欧美国产日韩a欧美在线观看| 成人a级免费电影| ...av二区三区久久精品| 欧美私人免费视频| 蜜臀久久久久久久| 久久婷婷久久一区二区三区| av亚洲产国偷v产偷v自拍| 亚洲柠檬福利资源导航| 欧美日韩国产大片| 国产裸体歌舞团一区二区| 国产精品视频免费| 欧美日韩一区二区三区不卡| 精品一区二区三区日韩| 国产精品―色哟哟| 欧美日韩国产成人在线免费| 国产成人a级片| 亚洲一区欧美一区| 99久久精品免费| 日韩av中文字幕一区二区三区| 精品欧美一区二区久久 | 国产精品资源在线| 中文字幕日韩av资源站| 欧美人妖巨大在线| 国产精品一区久久久久| 亚洲一区二区三区四区在线观看 | 91精品一区二区三区久久久久久 | 天天爽夜夜爽夜夜爽精品视频 | 国产精品美女久久福利网站| 欧美在线观看一区| 国产一区二区不卡| 亚洲图片欧美一区| 亚洲国产成人私人影院tom| 欧美男生操女生| 99re视频精品| 久久不见久久见免费视频7| 亚洲美女区一区| 久久久综合精品| 欧美人妇做爰xxxⅹ性高电影| 成人avav在线| 国产毛片精品国产一区二区三区| 亚洲高清免费一级二级三级| 欧美国产日韩a欧美在线观看 | 欧美精品一区在线观看| 色视频欧美一区二区三区| 国产女人水真多18毛片18精品视频 | 久久久久国产精品免费免费搜索| 在线精品观看国产| 欧美亚洲一区二区三区四区| 国产日韩欧美不卡| 欧美一卡二卡三卡| 91丨九色丨尤物| av一区二区不卡| 国产精品原创巨作av| 老司机一区二区| 午夜视频一区在线观看| 亚洲综合男人的天堂| 国产精品国产自产拍高清av王其 | 亚洲午夜成aⅴ人片| 欧美久久久久久久久中文字幕| 日韩电影在线观看一区| |精品福利一区二区三区| 欧美剧情片在线观看| 国产精品国产馆在线真实露脸| 精品久久99ma| 亚洲成人精品在线观看| 极品少妇一区二区三区精品视频 | 欧美videofree性高清杂交| 欧美xxxx老人做受| 韩国成人精品a∨在线观看| 亚洲精品一二三| 天天做天天摸天天爽国产一区| 欧美在线影院一区二区| 日本三级亚洲精品| 中文字幕成人在线观看| www.视频一区| 成人开心网精品视频| 欧美一区二区黄| 99久久99久久精品国产片果冻| 国产精品一级片在线观看| 紧缚捆绑精品一区二区| 国产精品一区二区在线看| 日韩av午夜在线观看| 91麻豆福利精品推荐| 精品国产伦理网| **网站欧美大片在线观看| 欧美日韩亚洲综合| 欧美精选一区二区| 欧美一区二区在线观看| 国产精品每日更新| 国产日韩综合av| 免费国产亚洲视频| 一区二区三区久久久| 国产在线精品一区二区夜色| 国产风韵犹存在线视精品| 国产尤物一区二区| 日本精品一级二级| 99精品视频在线播放观看| 一本色道久久综合精品竹菊| 欧美性色综合网| 一道本成人在线| 欧美日韩在线不卡| 欧美视频自拍偷拍| 在线视频国内自拍亚洲视频| 欧美日韩国产不卡| 国产精品麻豆视频| 亚洲男人的天堂在线观看| 欧美国产一区二区| 美脚の诱脚舐め脚责91 | 中文字幕一区免费在线观看| 午夜免费久久看| 9i在线看片成人免费| 国产欧美综合在线| 日韩欧美国产1| 日韩黄色小视频| 久久综合久色欧美综合狠狠| 香蕉久久一区二区不卡无毒影院 | 亚洲精品ww久久久久久p站| 亚洲视频电影在线| 欧美一区二区日韩| 免费久久99精品国产| 51精品秘密在线观看| 成人免费视频免费观看| 色婷婷香蕉在线一区二区| 日韩欧美卡一卡二| 一区二区三区在线观看国产| 日韩精品一区第一页| 99久久精品免费精品国产| 欧美成人性战久久| 亚洲影视在线观看| 99精品欧美一区| 日韩午夜激情av| 亚洲一本大道在线| 高清不卡在线观看av| 日韩精品中午字幕| 亚洲成人777| 91欧美一区二区| 久久久国产一区二区三区四区小说 | 国产午夜精品一区二区| 亚洲超碰97人人做人人爱| av中文字幕一区| 久久精品一区二区三区不卡牛牛| 日日欢夜夜爽一区| 在线观看三级视频欧美| 中文字幕亚洲视频| 国产69精品一区二区亚洲孕妇| 亚洲一区二区三区精品在线| 99久久久久久| 综合欧美亚洲日本| 福利视频网站一区二区三区| 精品国产99国产精品| 日日夜夜免费精品视频| 欧美性一二三区| 一区二区三区日本| 色噜噜狠狠成人网p站| 亚洲日本一区二区| 91碰在线视频| 亚洲免费毛片网站| kk眼镜猥琐国模调教系列一区二区| 欧美精品一区二区蜜臀亚洲| 日本成人在线一区| 777久久久精品| 日韩成人午夜电影| 91精品国产一区二区三区香蕉| 91麻豆精品国产91| 中文字幕在线观看一区| 国产裸体歌舞团一区二区| 九九久久精品视频| 一区二区在线免费观看| 一区免费观看视频| 亚洲精品国产一区二区精华液 | 亚洲欧洲av一区二区三区久久| 亚洲日本va午夜在线电影| 天天影视色香欲综合网老头| 欧美精品高清视频| 日韩激情中文字幕| 91精品国产综合久久精品性色| 日本最新不卡在线| 久久综合久色欧美综合狠狠| 国产成人亚洲精品青草天美| 中文字幕在线不卡国产视频| 91精品福利视频| 亚洲一区二区三区四区在线观看| 午夜视频在线观看一区二区| 日韩视频在线你懂得| 国产精品中文字幕欧美|