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

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

?? mmc_sd.c

?? STM32實現定時加熱
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include "sys.h"
#include "mmc_sd.h"
#include "spi.h"
#include "usart.h"
#include "delay.h" 							   
u8  SD_Type=0;//SD卡的類型
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//Mini STM32開發板
//SD卡 驅動代碼		   
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2010/11/28 
//版本:V1.1
//版權所有,盜版必究。
//Copyright(C) 正點原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.1修改說明
//2010/5/13									   
//增加了一些延時,實測可以支持TF卡(1G/2G),金士頓2G,4G 16G SD卡
//2010/6/24
//加入了u8 SD_GetResponse(u8 Response)函數
//修改了u8 SD_WaitDataReady(void)函數
//增加了USB讀卡器支持的u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead);
//和u8 MSD_WriteBuffer(u8* pBuffer, u32 WriteAddr, u32 NumByteToWrite);兩個函數
////////////////////////////////////////////////////////////////////////////////// 	  
 

//等待SD卡回應
//Response:要得到的回應值
//返回值:0,成功得到了該回應值
//    其他,得到回應值失敗
u8 SD_GetResponse(u8 Response)
{
	u16 Count=0xFFF;//等待次數	   						  
	while ((SPIx_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到準確的回應  	  
	if (Count==0)return MSD_RESPONSE_FAILURE;//得到回應失敗   
	else return MSD_RESPONSE_NO_ERROR;//正確回應
}
//等待SD卡寫入完成
//返回值:0,成功;   
//    其他,錯誤代碼;
u8 SD_WaitDataReady(void)
{
    u8 r1=MSD_DATA_OTHER_ERROR;
    u32 retry;
    retry=0;
    do
    {
        r1=SPIx_ReadWriteByte(0xFF)&0X1F;//讀到回應
        if(retry==0xfffe)return 1; 
		retry++;
		switch (r1)
		{					   
			case MSD_DATA_OK://數據接收正確了	 
				r1=MSD_DATA_OK;
				break;  
			case MSD_DATA_CRC_ERROR:  //CRC校驗錯誤
				return MSD_DATA_CRC_ERROR;  
			case MSD_DATA_WRITE_ERROR://數據寫入錯誤
				return MSD_DATA_WRITE_ERROR;  
			default://未知錯誤    
				r1=MSD_DATA_OTHER_ERROR;
				break;	 
		}   
    }while(r1==MSD_DATA_OTHER_ERROR); //數據錯誤時一直等待
	retry=0;
	while(SPIx_ReadWriteByte(0XFF)==0)//讀到數據為0,則數據還未寫完成
	{
		retry++;
		//delay_us(10);//SD卡寫等待需要較長的時間
		if(retry>=0XFFFFFFFE)return 0XFF;//等待失敗了
	};	    
    return 0;//成功了
}	 
//向SD卡發送一個命令
//輸入: u8 cmd   命令 
//      u32 arg  命令參數
//      u8 crc   crc校驗值	   
//返回值:SD卡返回的響應															  
u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc)
{
    u8 r1;	
	u8 Retry=0;	         
	SD_CS=1;
    SPIx_ReadWriteByte(0xff);//高速寫命令延時
	SPIx_ReadWriteByte(0xff);     
 	SPIx_ReadWriteByte(0xff);  	 
    //片選端置低,選中SD卡
    SD_CS=0; 
    //發送
    SPIx_ReadWriteByte(cmd | 0x40);//分別寫入命令
    SPIx_ReadWriteByte(arg >> 24);
    SPIx_ReadWriteByte(arg >> 16);
    SPIx_ReadWriteByte(arg >> 8);
    SPIx_ReadWriteByte(arg);
    SPIx_ReadWriteByte(crc); 
    //等待響應,或超時退出
    while((r1=SPIx_ReadWriteByte(0xFF))==0xFF)
    {
        Retry++;	    
        if(Retry>200)break; 
    }   
    //關閉片選
    SD_CS=1;
    //在總線上額外增加8個時鐘,讓SD卡完成剩下的工作
    SPIx_ReadWriteByte(0xFF);
    //返回狀態值
    return r1;
}		  																				 
//向SD卡發送一個命令(結束是不失能片選,還有后續數據傳來)
//輸入:u8 cmd   命令 
//     u32 arg  命令參數
//     u8 crc   crc校驗值	 
//返回值:SD卡返回的響應															  
u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc)
{
	u8 Retry=0;	         
	u8 r1;			   
    SPIx_ReadWriteByte(0xff);//高速寫命令延時
	SPIx_ReadWriteByte(0xff);  	 	 
    SD_CS=0;//片選端置低,選中SD卡	   
    //發送
    SPIx_ReadWriteByte(cmd | 0x40); //分別寫入命令
    SPIx_ReadWriteByte(arg >> 24);
    SPIx_ReadWriteByte(arg >> 16);
    SPIx_ReadWriteByte(arg >> 8);
    SPIx_ReadWriteByte(arg);
    SPIx_ReadWriteByte(crc);   
    //等待響應,或超時退出
    while((r1=SPIx_ReadWriteByte(0xFF))==0xFF)
    {
        Retry++;	    
        if(Retry>200)break; 
    }  	  
    //返回響應值
    return r1;
}
//把SD卡設置到掛起模式
//返回值:0,成功設置
//       1,設置失敗
u8 SD_Idle_Sta(void)
{
	u16 i;
	u8 retry;	   	  
    for(i=0;i<0xf00;i++);//純延時,等待SD卡上電完成	 
    //先產生>74個脈沖,讓SD卡自己初始化完成
    for(i=0;i<10;i++)SPIx_ReadWriteByte(0xFF); 
    //-----------------SD卡復位到idle開始-----------------
    //循環連續發送CMD0,直到SD卡返回0x01,進入IDLE狀態
    //超時則直接退出
    retry = 0;
    do
    {	   
        //發送CMD0,讓SD卡進入IDLE狀態
        i = SD_SendCommand(CMD0, 0, 0x95);
        retry++;
    }while((i!=0x01)&&(retry<200));
    //跳出循環后,檢查原因:初始化成功?or 重試超時?
    if(retry==200)return 1; //失敗
	return 0;//成功	 						  
}														    
//初始化SD卡
//如果成功返回,則會自動設置SPI速度為18Mhz
//返回值:0:NO_ERR
//       1:TIME_OUT
//      99:NO_CARD																 
u8 SD_Init(void)
{								 
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用來進行超時計數
    u8 buff[6];
    //設置硬件上與SD卡相關聯的控制引腳輸出
	//避免NRF24L01/W25X16等的影響
	RCC->APB2ENR|=1<<2;       //PORTA時鐘使能 
	GPIOA->CRL&=0XFFF000FF; 
	GPIOA->CRL|=0X00033300;//PA2.3.4 推挽 	    
	GPIOA->ODR|=0X7<<2;    //PA2.3.4上拉 
	SPIx_Init();
 	SPIx_SetSpeed(SPI_SPEED_256);//設置到低速模式		 
	SD_CS=1;	
    if(SD_Idle_Sta()) return 1;//超時返回1 設置到idle 模式失敗	  
    //-----------------SD卡復位到idle結束-----------------	 
    //獲取卡片的SD版本信息
 	SD_CS=0;	
	r1 = SD_SendCommand_NoDeassert(8, 0x1aa,0x87);	     
    //如果卡片版本信息是v1.0版本的,即r1=0x05,則進行以下初始化
    if(r1 == 0x05)
    {
        //設置卡類型為SDV1.0,如果后面檢測到為MMC卡,再修改為MMC
        SD_Type = SD_TYPE_V1;	   
        //如果是V1.0卡,CMD8指令后沒有后續數據
        //片選置高,結束本次命令
        SD_CS=1;
        //多發8個CLK,讓SD結束后續操作
        SPIx_ReadWriteByte(0xFF);	  
        //-----------------SD卡、MMC卡初始化開始-----------------	 
        //發卡初始化指令CMD55+ACMD41
        // 如果有應答,說明是SD卡,且初始化完成
        // 沒有回應,說明是MMC卡,額外進行相應初始化
        retry = 0;
        do
        {
            //先發CMD55,應返回0x01;否則出錯
            r1 = SD_SendCommand(CMD55, 0, 0);
            if(r1 == 0XFF)return r1;//只要不是0xff,就接著發送	  
            //得到正確響應后,發ACMD41,應得到返回值0x00,否則重試200次
            r1 = SD_SendCommand(ACMD41, 0, 0);
            retry++;
        }while((r1!=0x00) && (retry<400));
        // 判斷是超時還是得到正確回應
        // 若有回應:是SD卡;沒有回應:是MMC卡	  
        //----------MMC卡額外初始化操作開始------------
        if(retry==400)
        {
            retry = 0;
            //發送MMC卡初始化命令(沒有測試)
            do
            {
                r1 = SD_SendCommand(1,0,0);
                retry++;
            }while((r1!=0x00)&& (retry<400));
            if(retry==400)return 1;   //MMC卡初始化超時		    
            //寫入卡類型
            SD_Type = SD_TYPE_MMC;
        }
        //----------MMC卡額外初始化操作結束------------	    
        //設置SPI為高速模式
        SPIx_SetSpeed(SPI_SPEED_4);   
		SPIx_ReadWriteByte(0xFF);	 
        //禁止CRC校驗	   
		r1 = SD_SendCommand(CMD59, 0, 0x95);
        if(r1 != 0x00)return r1;  //命令錯誤,返回r1   	   
        //設置Sector Size
        r1 = SD_SendCommand(CMD16, 512, 0x95);
        if(r1 != 0x00)return r1;//命令錯誤,返回r1		 
        //-----------------SD卡、MMC卡初始化結束-----------------

    }//SD卡為V1.0版本的初始化結束	 
    //下面是V2.0卡的初始化
    //其中需要讀取OCR數據,判斷是SD2.0還是SD2.0HC卡
    else if(r1 == 0x01)
    {
        //V2.0的卡,CMD8命令后會傳回4字節的數據,要跳過再結束本命令
        buff[0] = SPIx_ReadWriteByte(0xFF);  //should be 0x00
        buff[1] = SPIx_ReadWriteByte(0xFF);  //should be 0x00
        buff[2] = SPIx_ReadWriteByte(0xFF);  //should be 0x01
        buff[3] = SPIx_ReadWriteByte(0xFF);  //should be 0xAA	    
        SD_CS=1;	  
        SPIx_ReadWriteByte(0xFF);//the next 8 clocks			 
        //判斷該卡是否支持2.7V-3.6V的電壓范圍
        //if(buff[2]==0x01 && buff[3]==0xAA) //不判斷,讓其支持的卡更多
        {	  
            retry = 0;
            //發卡初始化指令CMD55+ACMD41
    		do
    		{
    			r1 = SD_SendCommand(CMD55, 0, 0);
    			if(r1!=0x01)return r1;	   
    			r1 = SD_SendCommand(ACMD41, 0x40000000, 0);
                if(retry>200)return r1;  //超時則返回r1狀態  
            }while(r1!=0);		  
            //初始化指令發送完成,接下來獲取OCR信息		   
            //-----------鑒別SD2.0卡版本開始-----------
            r1 = SD_SendCommand_NoDeassert(CMD58, 0, 0);
            if(r1!=0x00)
			{
				SD_CS=1;//釋放SD片選信號
				return r1;  //如果命令沒有返回正確應答,直接退出,返回應答	 
			}//讀OCR指令發出后,緊接著是4字節的OCR信息
            buff[0] = SPIx_ReadWriteByte(0xFF);
            buff[1] = SPIx_ReadWriteByte(0xFF); 
            buff[2] = SPIx_ReadWriteByte(0xFF);
            buff[3] = SPIx_ReadWriteByte(0xFF);		 
            //OCR接收完成,片選置高
            SD_CS=1;
            SPIx_ReadWriteByte(0xFF);	   
            //檢查接收到的OCR中的bit30位(CCS),確定其為SD2.0還是SDHC
            //如果CCS=1:SDHC   CCS=0:SD2.0
            if(buff[0]&0x40)SD_Type = SD_TYPE_V2HC;    //檢查CCS	 
            else SD_Type = SD_TYPE_V2;	    
            //-----------鑒別SD2.0卡版本結束----------- 
            //設置SPI為高速模式
            SPIx_SetSpeed(SPI_SPEED_4);  
        }	    
    }
    return r1;
}	 																			   
//從SD卡中讀回指定長度的數據,放置在給定位置
//輸入: u8 *data(存放讀回數據的內存>len)
//      u16 len(數據長度)
//      u8 release(傳輸完成后是否釋放總線CS置高 0:不釋放 1:釋放)	 
//返回值:0:NO_ERR
//  	 other:錯誤信息														  
u8 SD_ReceiveData(u8 *data, u16 len, u8 release)
{
    // 啟動一次傳輸
    SD_CS=0;				  	  
	if(SD_GetResponse(0xFE))//等待SD卡發回數據起始令牌0xFE
	{	  
		SD_CS=1;
		return 1;
	}
    while(len--)//開始接收數據
    {
        *data=SPIx_ReadWriteByte(0xFF);
        data++;
    }
    //下面是2個偽CRC(dummy CRC)
    SPIx_ReadWriteByte(0xFF);
    SPIx_ReadWriteByte(0xFF);
    if(release==RELEASE)//按需釋放總線,將CS置高
    {
        SD_CS=1;//傳輸結束
        SPIx_ReadWriteByte(0xFF);
    }											  					    
    return 0;
}																				  
//獲取SD卡的CID信息,包括制造商信息
//輸入: u8 *cid_data(存放CID的內存,至少16Byte)	  
//返回值:0:NO_ERR
//		 1:TIME_OUT
//       other:錯誤信息														   
u8 SD_GetCID(u8 *cid_data)
{
    u8 r1;	   
    //發CMD10命令,讀CID
    r1 = SD_SendCommand(CMD10,0,0xFF);
    if(r1 != 0x00)return r1;  //沒返回正確應答,則退出,報錯  
    SD_ReceiveData(cid_data,16,RELEASE);//接收16個字節的數據	 
    return 0;
}																				  
//獲取SD卡的CSD信息,包括容量和速度信息
//輸入:u8 *cid_data(存放CID的內存,至少16Byte)	    
//返回值:0:NO_ERR
//       1:TIME_OUT
//       other:錯誤信息														   
u8 SD_GetCSD(u8 *csd_data)
{
    u8 r1;	 
    r1=SD_SendCommand(CMD9,0,0xFF);//發CMD9命令,讀CSD
    if(r1)return r1;  //沒返回正確應答,則退出,報錯  
    SD_ReceiveData(csd_data, 16, RELEASE);//接收16個字節的數據 
    return 0;
}  
//獲取SD卡的容量(字節)   
//返回值:0: 取容量出錯 
//       其他:SD卡的容量(字節)														  
u32 SD_GetCapacity(void)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品在线播放| 亚洲成人一区二区在线观看| 欧美精品乱码久久久久久按摩 | 国产在线一区二区| 亚洲一区二区三区三| 亚洲高清久久久| 亚洲成a人在线观看| 日产精品久久久久久久性色| 三级成人在线视频| 美女视频网站黄色亚洲| 久久97超碰色| 国产精品亚洲成人| av电影在线观看不卡| 91影视在线播放| 色婷婷av一区二区三区软件| 在线免费观看一区| 欧美日韩一区 二区 三区 久久精品| 欧美日韩一级大片网址| 欧美日韩1区2区| 精品国产乱码91久久久久久网站| 久久综合九色综合欧美98| 国产亚洲欧美激情| 成人免费小视频| 亚洲综合999| 久久成人免费网站| av电影在线观看不卡| 欧美群妇大交群的观看方式| 欧美成人国产一区二区| 欧美国产日本视频| 性感美女久久精品| 国产一区激情在线| 日本韩国精品在线| 久久综合九色综合欧美就去吻| 国产精品第五页| 午夜精品免费在线观看| 国产精品66部| 欧美系列亚洲系列| 国产午夜精品一区二区三区四区| 一区二区三区中文免费| 精品一区二区久久| 欧美性三三影院| 国产欧美日韩亚州综合 | 国产女同互慰高潮91漫画| 一区二区三区在线不卡| 激情六月婷婷综合| 欧美亚洲图片小说| 中文在线免费一区三区高中清不卡| 亚洲国产综合91精品麻豆| 国产成人自拍高清视频在线免费播放| 欧洲精品一区二区三区在线观看| 久久免费看少妇高潮| 亚洲成人高清在线| 97aⅴ精品视频一二三区| 精品剧情v国产在线观看在线| 亚洲丝袜精品丝袜在线| 国产一区二区三区在线观看精品 | 91麻豆精品在线观看| 精品国产麻豆免费人成网站| 亚洲精品乱码久久久久| proumb性欧美在线观看| 久久久久综合网| 久久精品国产精品青草| 欧美妇女性影城| 亚洲蜜桃精久久久久久久| 国产99一区视频免费| 精品精品国产高清一毛片一天堂| 性欧美大战久久久久久久久| 91丨porny丨中文| 国产欧美日韩另类视频免费观看| 老司机午夜精品99久久| 7777女厕盗摄久久久| 亚洲成人一二三| 欧美麻豆精品久久久久久| 亚洲成人综合网站| 在线观看91视频| 亚洲国产视频在线| 在线观看亚洲成人| 亚洲午夜久久久久久久久电影院| 91免费国产视频网站| 亚洲人一二三区| 91久久精品一区二区三区| 亚洲免费在线观看| 欧美在线观看一二区| 亚洲成av人**亚洲成av**| 欧美日韩大陆在线| 秋霞午夜鲁丝一区二区老狼| 日韩视频免费观看高清完整版| 日韩国产高清在线| 精品久久久久久久人人人人传媒 | 国产91精品一区二区麻豆亚洲| 久久久国际精品| av中文字幕一区| 亚洲青青青在线视频| 欧美日韩免费观看一区二区三区 | 国产激情一区二区三区四区| 国产欧美精品一区aⅴ影院| av一本久道久久综合久久鬼色| 亚洲人成亚洲人成在线观看图片| 欧美网站一区二区| 国模娜娜一区二区三区| 国产精品色在线| 欧美性色aⅴ视频一区日韩精品| 日韩高清一级片| 久久久久9999亚洲精品| 色欧美乱欧美15图片| 日本vs亚洲vs韩国一区三区| 欧美精品一区二区在线播放| www.亚洲色图.com| 午夜精品福利在线| 日本一区二区免费在线观看视频| 91小视频免费观看| 看国产成人h片视频| 成人欧美一区二区三区白人| 9191国产精品| 成人一区二区三区视频| 午夜久久福利影院| 国产精品毛片大码女人| 91精品国产麻豆| 93久久精品日日躁夜夜躁欧美| 日韩精品一区第一页| 国产精品久久夜| 日韩色在线观看| 欧美性色综合网| 99视频精品免费视频| 久久av资源网| 一区二区三区色| 国产午夜亚洲精品午夜鲁丝片| 欧美日韩成人激情| 色综合天天综合网天天看片| 激情综合五月婷婷| 亚洲国产精品人人做人人爽| 中文字幕第一区二区| 日韩一卡二卡三卡四卡| 精品视频色一区| 99国产精品国产精品毛片| 精品一区二区三区影院在线午夜| 亚洲精品你懂的| 国产精品久久久久久久久快鸭 | 国产在线观看一区二区| 亚洲成人动漫av| 亚洲久本草在线中文字幕| 日本一区二区免费在线观看视频| 日韩天堂在线观看| 91精品国产综合久久久久久| 欧美视频中文一区二区三区在线观看| av影院午夜一区| 粉嫩av亚洲一区二区图片| 国产一区美女在线| 国内精品免费在线观看| 裸体健美xxxx欧美裸体表演| 视频一区视频二区中文字幕| 亚洲国产va精品久久久不卡综合| 亚洲精品亚洲人成人网在线播放| 国产精品私人影院| 国产精品免费视频观看| 中文字幕日韩av资源站| 国产精品动漫网站| 综合欧美一区二区三区| 亚洲人成精品久久久久久| 亚洲精品videosex极品| 亚洲一区二区视频| 亚洲成人第一页| 免费欧美高清视频| 看国产成人h片视频| 国产精品综合久久| 成人综合激情网| 成人ar影院免费观看视频| 91在线看国产| 在线观看日韩一区| 91精品啪在线观看国产60岁| 欧美不卡激情三级在线观看| 久久久久九九视频| 亚洲视频你懂的| 亚洲成人av电影| 国产在线播精品第三| 国产传媒欧美日韩成人| 色天天综合色天天久久| 欧美一区二区二区| 国产亚洲一区字幕| 一区二区三区日本| 蜜桃视频在线观看一区二区| 国产69精品久久久久毛片 | 亚洲制服丝袜在线| 亚洲国产人成综合网站| 黄色成人免费在线| 91小视频在线免费看| 日韩欧美视频在线| 国产精品久久久久aaaa| 日韩电影网1区2区| a美女胸又www黄视频久久| 91麻豆精品国产| 国产精品久久毛片av大全日韩| 亚洲一二三区不卡| 国产福利不卡视频| 欧美高清性hdvideosex| 国产精品久久三| 美女尤物国产一区| 91传媒视频在线播放| 国产欧美精品一区二区色综合| 天天av天天翘天天综合网色鬼国产|