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

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

?? mx25l1605drv.c

?? LPC1114_例程和教程
?? C
字號:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			MX25L1602.c
** Descriptions:		SPI下的SST25VF016B操作函數庫 
**
**------------------------------------------------------------------------------------------------------
** Created by:			Litiantian
** Created date:		2007-04-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			
** Modified date:	
** Version:
** Descriptions:		
********************************************************************************************************/
#include <stdio.h>
#include "LPC11xx.h"			/* LPC11xx 外設寄存器 */
#include "MX25L1605Drv.h"
/* 移植本軟件包時需要修改以下的函數或宏 */
#define		CE_Low()		LPC_GPIO0->DATA &= ~(0x1<<7)			//P0.7=0
#define     CE_High()		LPC_GPIO0->DATA |= (0x1<<7);			//P0.7=0

/* SPI初始化 */
/*******************************************************************************************
** 函數名稱:SPIInit															
** 功能說明:初始化SPI。				
** 入口參數:無																
** 出口參數:無																
*******************************************************************************************/
void  SPIInit(void)
{  
	LPC_SYSCON->PRESETCTRL|=0x01;  		//取消SSP0復位
	LPC_SYSCON->SYSAHBCLKCTRL|=(1<<11);	//打開SSP外設
	LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);	//使能IO配置塊時鐘
	LPC_SYSCON->SSP0CLKDIV =0x01;		//時鐘不分頻
//	LPC_IOCON->PIO0_7=0x01;				//設置CS	片選
	LPC_IOCON->PIO0_7=0x00;				//設置GPIO
	LPC_GPIO0->DIR	|=0x080;			//設置P0_7為輸出	
	LPC_SSP0->CR0 =(0x01<<8)|			//SCR時鐘分頻 	f=PCLK/(CPSDVSRX[SCR+1])
				  (0x00<<7)|			//時鐘輸出相位
				  (0x00<<6)|			//時鐘輸出極性
				  (0x00<<4)|			// FRF幀格式 00=SPI,01=SSI 10=Microwire,11=保留
				  (0x07<<0);			//0111=8bit,0011=4bit,1111=16bit			  
				  
	LPC_SSP0->CR1 =(0x00<<3)|	//從機輸出禁能,1=禁止
				  (0x00<<2)|	//MS選擇,0=主機;1=從機;
				  (0x01<<1)|	//SSP使能
				  (0x00<<0);	//正常模式
	LPC_SSP0->CPSR=0x02;			//PCLK分頻值
	LPC_SSP0->ICR=0x03;			//中斷清除
}

/************************************************************************
** 函數名稱: Send_Byte													
** 函數功能:通過硬件SPI發送一個字節到MX25L1602					
** 入口參數:data															
** 出口參數:無																
************************************************************************/
void Send_Byte(uint8_t data)
{
    LPC_SSP0->DR = data;
    while (LPC_SSP0->SR&0x010!=0);			// 等待BSY=0,即等待數據發送
}

/************************************************************************
** 函數名稱:Get_Byte														
** 函數功能:通過硬件SPI接口接收一個字節到處理器						
** 入口參數:無																
** 出口參數:無																
************************************************************************/
uint8_t Get_Byte(void)
{
	LPC_SSP0->DR = 0xff;			// 發送該數據用以產生時鐘,數據本身沒有用處
    while (LPC_SSP0->SR&0x010!=0);	// 等待BSY=0,即等待數據發送
    return (LPC_SSP0->DR);		// 返回接收到的數據
}


/* 以下函數在移植時無需修改 */
/************************************************************************
** 函數名稱:MX25L1602_RD																										
** 函數功能:MX25L1602的讀函數,可選擇讀ID和讀數據操作				
** 入口參數:
**			INT32U Dst:目標地址,范圍 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)				
**      	INT32U NByte:	要讀取的數據字節數
**			INT8U* RcvBufPt:接收緩存的指針			
** 出口參數:操作成功則返回OK,失敗則返回ERROR		
** 注	 意:若某功能下,某一入口參數無效,可在該入口參數處填Invalid,該參數將被忽略
************************************************************************/
uint8_t MX25L1602_RD(uint32_t Dst, uint32_t NByte,uint8_t* RcvBufPt)
{
	uint32_t i = 0;
	if ((Dst+NByte > MAX_ADDR)||(NByte == 0))	return (ERROR);	 //	檢查入口參數
	
	CE_Low();			
	Send_Byte(0x0B); 						// 發送讀命令
	Send_Byte(((Dst & 0xFFFFFF) >> 16));	// 發送地址信息:該地址由3個字節組成
	Send_Byte(((Dst & 0xFFFF) >> 8));
	Send_Byte(Dst & 0xFF);
	Send_Byte(0xFF);						// 發送一個啞字節以讀取數據
	for (i = 0; i < NByte; i++)		
	{
		RcvBufPt[i] = Get_Byte();		
	}
	CE_High();			
	return (OK);
}

/************************************************************************
** 函數名稱:MX25L1602_RdID																										
** 函數功能:MX25L1602的讀ID函數,可選擇讀ID和讀數據操作				
** 入口參數:
**			idtype IDType:ID類型。用戶可在Jedec_ID,Dev_ID,Manu_ID三者里選擇
**			INT32U* RcvbufPt:存儲ID變量的指針
** 出口參數:操作成功則返回OK,失敗則返回ERROR		
** 注	 意:若填入的參數不符合要求,則返回ERROR
************************************************************************/
uint8_t MX25L1602_RdID(idtype IDType, uint32_t* RcvbufPt)
{
	uint32_t temp = 0;
	if (IDType == Jedec_ID)
	{
		CE_Low();			
		Send_Byte(0x9F);		 		// 發送讀JEDEC ID命令(9Fh)
    	temp = (temp | Get_Byte()) << 8;// 接收數據 
		temp = (temp | Get_Byte()) << 8;	
		temp = (temp | Get_Byte()); 	// 在本例中,temp的值應為0xBF2541
		CE_High();			
		*RcvbufPt = temp;
		return (OK);
	}
	
	if ((IDType == Manu_ID) || (IDType == Dev_ID) )
	{
		CE_Low();			
		Send_Byte(0x90);				// 發送讀ID命令 (90h or ABh)
    	Send_Byte(0x00);				// 發送地址
		Send_Byte(0x00);				// 發送地址
		Send_Byte(IDType);				// 發送地址 - 不是00H就是01H
		temp = Get_Byte();				// 接收獲取的數據字節
		CE_High();			
		*RcvbufPt = temp;
		return (OK);
	}
	else
	{
		return (ERROR);	
	}
}

/************************************************************************
** 函數名稱:MX25L1602_WR											
** 函數功能:MX25L1602的寫函數,可寫1個和多個數據到指定地址									
** 入口參數:
**			INT32U Dst:目標地址,范圍 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)				
**			INT8U* SndbufPt:發送緩存區指針
**      	INT32U NByte:要寫的數據字節數
** 出口參數:操作成功則返回OK,失敗則返回ERROR		
** 注	 意:若某功能下,某一入口參數無效,可在該入口參數處填Invalid,該參數將被忽略
************************************************************************/
uint8_t MX25L1602_WR(uint32_t Dst, uint8_t* SndbufPt, uint32_t NByte)
{
	uint32_t temp = 0,i = 0,StatRgVal = 0;
	if (( (Dst+NByte-1 > MAX_ADDR)||(NByte == 0) ))
	{
		return (ERROR);	 //	檢查入口參數
	}
   	CE_Low();			 
	Send_Byte(0x05);							// 發送讀狀態寄存器命令
	temp = Get_Byte();							// 保存讀得的狀態寄存器值
	CE_High();								

	CE_Low();			
	Send_Byte(0x50);							// 使狀態寄存器可寫
	CE_High();			
	CE_Low();			
	Send_Byte(0x01);							// 發送寫狀態寄存器指令
	Send_Byte(0);								// 清0BPx位,使Flash芯片全區可寫 
	CE_High();			

		
	for(i = 0; i < NByte; i++)
	{
		CE_Low();			
		Send_Byte(0x06);						// 發送寫使能命令
		CE_High();			

		CE_Low();			
		Send_Byte(0x02); 						// 發送字節數據燒寫命令
		Send_Byte((((Dst+i) & 0xFFFFFF) >> 16));// 發送3個字節的地址信息 
		Send_Byte((((Dst+i) & 0xFFFF) >> 8));
		Send_Byte((Dst+i) & 0xFF);
		Send_Byte(SndbufPt[i]);					// 發送被燒寫的數據
		CE_High();			

		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);					// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();				// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);				// 一直等待,直到芯片空閑
	}

	CE_Low();			
	Send_Byte(0x06);							// 發送寫使能命令
	CE_High();			

	CE_Low();			
	Send_Byte(0x50);							// 使狀態寄存器可寫
	CE_High();			
	CE_Low();			
	Send_Byte(0x01);							// 發送寫狀態寄存器指令
	Send_Byte(temp);							// 恢復狀態寄存器設置信息 
	CE_High();

	return (OK);		
}

/************************************************************************
** 函數名稱:MX25L1602_Erase												
** 函數功能:根據指定的扇區號選取最高效的算法擦除								
** 入口參數:
**			INT32U sec1:起始扇區號,范圍(0~499)
**			INT32U sec2:終止扇區號,范圍(0~499)
** 出口參數:操作成功則返回OK,失敗則返回ERROR		
************************************************************************/
uint8_t MX25L1605_Erase(uint32_t uiStartSect, uint32_t uiEndSect)
{
	uint32_t temp=0;
    uint32_t ucStatus = 0;	  			
	
	/*  檢查入口參數 */
	if ((uiStartSect > SEC_MAX)||(uiEndSect > SEC_MAX))	
	{
		return (ERROR);	
	}
   	if(uiStartSect>uiEndSect)
	{
		temp=uiEndSect;
		uiEndSect=uiStartSect;
	   	uiStartSect=temp;
	}
	ucStatus=_MX25L1605_RDStat();
	__MX25L1605_WrStat(0);
	if(uiStartSect==uiEndSect)
	{
		
	}

   	CE_Low();			 
	Send_Byte(0x05);								// 發送讀狀態寄存器命令
	temp1 = Get_Byte();								// 保存讀得的狀態寄存器值
	CE_High();								

	CE_Low();			
	Send_Byte(0x50);								// 使狀態寄存器可寫
	CE_High();			
	CE_Low();								  	
	Send_Byte(0x01);								// 發送寫狀態寄存器指令
	Send_Byte(0);									// 清0BPx位,使Flash芯片全區可寫 
	CE_High();
	
	CE_Low();			
	Send_Byte(0x06);								// 發送寫使能命令
	CE_High();			

	/* 如果用戶輸入的起始扇區號大于終止扇區號,則在內部作出調整 */
	if (sec1 > sec2)
	{
	   temp2 = sec1;
	   sec1  = sec2;
	   sec2  = temp2;
	} 
	/* 若起止扇區號相等則擦除單個扇區 */
	if (sec1 == sec2)	
	{
	    SecnHdAddr = SEC_SIZE * sec1;				// 計算扇區的起始地址
	    CE_Low();	
    	Send_Byte(0x20);							// 發送扇區擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 發送3個字節的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();					// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空閑
		return (OK);			
	}
	
                     /* 		根據起始扇區和終止扇區間距調用最快速的擦除功能 							*/	
	
	if (sec2 - sec1 == SEC_MAX)	
	{
		CE_Low();			
		Send_Byte(0x60);							// 發送芯片擦除指令(60h or C7h)
		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();					// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空閑
   		return (OK);
	}
	
	no_SecsToEr = sec2 - sec1 +1;					// 獲取要擦除的扇區數目
	CurSecToEr  = sec1;								// 從起始扇區開始擦除
	
	/* 若兩個扇區之間的間隔夠大,則采取16扇區擦除算法 */
	while (no_SecsToEr >= 16)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 計算扇區的起始地址
	    CE_Low();	
	    Send_Byte(0xD8);							// 發送64KB塊擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 發送3個字節的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();					// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空閑
		CurSecToEr  += 16;							// 計算擦除了16個扇區后,和擦除區域相鄰的待擦除扇區號
		no_SecsToEr -=  16;							// 對需擦除的扇區總數作出調整
	}
	/* 若兩個扇區之間的間隔夠大,則采取8扇區擦除算法 */
	while (no_SecsToEr >= 8)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 計算扇區的起始地址
	    CE_Low();	
	    Send_Byte(0x52);							// 發送32KB擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 發送3個字節的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();					// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空閑	
		CurSecToEr  += 8;
		no_SecsToEr -=  8;
	}
	/* 采用扇區擦除算法擦除剩余的扇區 */
	while (no_SecsToEr >= 1)
	{
	    SecnHdAddr = SEC_SIZE * CurSecToEr;			// 計算扇區的起始地址
	    CE_Low();	
    	Send_Byte(0x20);							// 發送扇區擦除指令
	    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16)); // 發送3個字節的地址信息
   		Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
   		Send_Byte(SecnHdAddr & 0xFF);
  		CE_High();			
		do
		{
		  	CE_Low();			 
			Send_Byte(0x05);						// 發送讀狀態寄存器命令
			StatRgVal = Get_Byte();					// 保存讀得的狀態寄存器值
			CE_High();								
  		}
		while (StatRgVal == 0x03);					// 一直等待,直到芯片空閑
		CurSecToEr  += 1;
		no_SecsToEr -=  1;
	}
   /* 擦除結束,恢復狀態寄存器信息							*/
	CE_Low();			
	Send_Byte(0x06);								// 發送寫使能命令
	CE_High();			

	CE_Low();			
	Send_Byte(0x50);								// 使狀態寄存器可寫
	CE_High();			
	CE_Low();			
	Send_Byte(0x01);								// 發送寫狀態寄存器指令
	Send_Byte(temp1);								// 恢復狀態寄存器設置信息 
	CE_High();    
	return (OK);
}




























?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级日韩三级| 亚洲一区在线观看免费| 亚洲日本在线视频观看| 免费成人在线观看视频| 91蜜桃视频在线| 国产色产综合色产在线视频| 日本人妖一区二区| 色婷婷精品大视频在线蜜桃视频| 久久久久亚洲蜜桃| 免费高清成人在线| 欧美日韩免费电影| 亚洲自拍偷拍麻豆| 99视频在线观看一区三区| 精品国产精品一区二区夜夜嗨| 亚洲自拍偷拍九九九| 99久免费精品视频在线观看 | 亚洲国产精品一区二区久久恐怖片 | 国产精品国产三级国产三级人妇 | 亚洲成人资源在线| av午夜一区麻豆| 中文字幕高清不卡| 精品一区中文字幕| 91精品欧美一区二区三区综合在| 亚洲美女屁股眼交3| av在线不卡免费看| 国产精品天天摸av网| 国产suv一区二区三区88区| 欧美成人a∨高清免费观看| 蜜臀精品一区二区三区在线观看| 在线播放国产精品二区一二区四区| 一区二区三区精品视频| 在线亚洲+欧美+日本专区| 亚洲精品久久嫩草网站秘色| 91激情五月电影| 亚洲一级在线观看| 欧美精品日韩一区| 久久av老司机精品网站导航| 欧美一级片在线看| 国产毛片一区二区| 国产精品久久综合| 91九色02白丝porn| 视频一区二区不卡| 精品国偷自产国产一区| 国产一区二区调教| 国产精品久久久久久福利一牛影视| 成人h动漫精品一区二区| 国产精品传媒入口麻豆| 91在线视频官网| 亚洲午夜成aⅴ人片| 欧美一级夜夜爽| 国产成人综合亚洲91猫咪| 国产精品你懂的在线欣赏| 91啪亚洲精品| 奇米一区二区三区| 国产精品污污网站在线观看 | 粉嫩av一区二区三区粉嫩| 成人欧美一区二区三区白人| 欧美综合欧美视频| 蜜桃av一区二区三区| 国产欧美视频一区二区| 欧美综合天天夜夜久久| 久久精工是国产品牌吗| 中文字幕一区二区在线播放| 欧美性生活大片视频| 国精品**一区二区三区在线蜜桃| 日韩一区有码在线| 91精品国产色综合久久ai换脸| 国产精品综合二区| 亚洲第一精品在线| 久久精品视频一区| 欧美日韩电影一区| 国产成人午夜精品影院观看视频| 樱花影视一区二区| 久久夜色精品一区| 欧美日韩一区不卡| 成人晚上爱看视频| 秋霞午夜av一区二区三区| 国产精品不卡视频| 日韩欧美专区在线| 欧洲av一区二区嗯嗯嗯啊| 精品一区二区三区视频| 亚洲乱码国产乱码精品精可以看| 26uuu国产在线精品一区二区| 欧美性一二三区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 成人午夜看片网址| 日韩精品一级中文字幕精品视频免费观看 | 在线一区二区三区四区五区| 国产在线精品免费| 天堂一区二区在线| 亚洲一卡二卡三卡四卡无卡久久| 国产精品三级久久久久三级| 精品国产精品网麻豆系列| 6080yy午夜一二三区久久| 91浏览器打开| 大陆成人av片| 国产精品99精品久久免费| 蜜桃在线一区二区三区| 亚洲国产精品影院| 亚洲免费在线观看视频| 国产三级一区二区| 久久综合色播五月| 欧美www视频| 欧美成人综合网站| 日韩午夜激情电影| 777奇米四色成人影色区| 91国产免费看| 色综合天天综合网国产成人综合天| 懂色av一区二区三区免费观看| 国产在线视频一区二区| 国产一区二区三区不卡在线观看| 精品中文字幕一区二区小辣椒| 丝袜a∨在线一区二区三区不卡| 亚洲一区二区三区四区不卡| 亚洲美女区一区| 亚洲线精品一区二区三区 | 国产精品久久久久久久岛一牛影视 | 亚洲r级在线视频| 亚洲妇熟xx妇色黄| 亚洲成人你懂的| 日韩影院精彩在线| 久久99在线观看| 国产高清不卡一区二区| 成熟亚洲日本毛茸茸凸凹| 成人三级在线视频| 99精品国产91久久久久久| 91在线观看污| 欧美视频日韩视频在线观看| 欧美另类高清zo欧美| 日韩一区二区精品| 国产亚洲一二三区| 中文字幕在线不卡一区二区三区| 亚洲色图一区二区三区| 亚洲一区二区精品视频| 日韩精品一二三| 国产一区二区在线观看免费| av不卡免费在线观看| 欧美无砖砖区免费| 精品日韩99亚洲| 国产精品久久久久久久第一福利| 亚洲精品视频自拍| 日本网站在线观看一区二区三区| 国产精品综合一区二区三区| 91婷婷韩国欧美一区二区| 91精品国产麻豆国产自产在线| 精品国产一区二区在线观看| 国产精品不卡在线| 欧美a级理论片| 成人中文字幕在线| 精品视频在线免费看| 国产三级久久久| 日韩精品免费专区| 大胆亚洲人体视频| 欧美一区永久视频免费观看| 国产日产欧美一区| 亚洲成a人片在线观看中文| 国产精品中文欧美| 欧美日韩性生活| 中文字幕 久热精品 视频在线| 日韩在线观看一区二区| 91在线国产福利| 久久精品夜色噜噜亚洲aⅴ| 亚洲综合久久久| 成人一区二区三区在线观看| 欧美日本韩国一区二区三区视频| 中文在线一区二区| 麻豆高清免费国产一区| 91高清视频免费看| 国产精品久线在线观看| 精品一区二区三区不卡| 欧美性大战久久| 中文字幕佐山爱一区二区免费| 精品一区二区三区久久久| 欧美电影一区二区| 一区二区激情视频| 高清成人在线观看| 日韩欧美高清dvd碟片| 午夜在线成人av| 色婷婷精品久久二区二区蜜臂av| 中文字幕av在线一区二区三区| 精品一区二区久久| 日韩视频免费观看高清完整版在线观看 | 亚洲a一区二区| 91小视频免费看| 国产精品久久久久久久久免费丝袜| 国产精品自拍av| 91精品国产全国免费观看| 亚洲成人免费看| 欧美色倩网站大全免费| 一区二区三区在线视频免费 | 91麻豆精品国产91久久久资源速度 | 日韩高清一区二区| 欧美在线视频全部完| 亚洲免费av网站| 91精品福利在线| 亚洲一区二区三区四区在线| 色婷婷激情综合| 亚洲电影一区二区| 欧美精选一区二区| 日日摸夜夜添夜夜添亚洲女人|