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

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

?? at45d161d.c

?? 這是一個C8051F340的SPI接口驅動AT45DB161D的源碼
?? C
字號:

// AT45D161.C
// ================================== FLASH 驅動函數文件 ================================================
#include  "AT45D161D.h"
#include  "Bos.h"

typedef enum
{
    AT45C_ID                = 0x9f,
	AT45C_STATUS			= 0xd7,
	AT45C_BUF1READ			= 0xd4,
	AT45C_BUF2READ			= 0xd6,
	AT45C_ARRAYREAD			= 0xe8,
	AT45C_PAGEREAD			= 0xd2,
	AT45C_BUF1WRITE			= 0x84,
	AT45C_BUF2WRITE			= 0x87,
	AT45C_PAGEERASE			= 0x81,
	AT45C_BLOCKERASE		= 0x50,
	AT45C_BUF1TOPAGEEW		= 0x83,
	AT45C_BUF2TOPAGEEW		= 0x86,
	AT45C_BUF1TOPAGEW		= 0x88,
	AT45C_BUF2TOPAGEW		= 0x89,
	AT45C_PAGEBUFWRITE1		= 0x82,
	AT45C_PAGEBUFWRITE2		= 0x85,
	AT45C_PAGEREWRITEBUF1	= 0x58,
	AT45C_PAGEREWRITEBUF2	= 0x59,
	AT45C_PAGETOBUF1TRANS	= 0x53,
	AT45C_PAGETOBUF2TRANS	= 0x55,
	AT45C_PAGETOBUF1COMP	= 0x60,
	AT45C_PAGETOBUF2COMP	= 0x61
} AT45CMD;

// 字符轉化函數
unsigned char HalfToASC(unsigned char cCh)
{
    if(cCh >=0x00 && cCh <= 0x09)
		return '0' + cCh;
	else if(cCh >= 0x0a && cCh <= 0x0f)
		return cCh - 0x0a + 'A';
	else return ' ';
}

// 系統對SPI接口&FLASH初始化函數
void FLS_Init(unsigned char cCLKRate)
{
	SPI0CFG = SPI_M_CLK1_POL0;//SPI_M_CLK1_POL1;	
	SPI0CN  = 0x0D;              // NSS,使能SPI
	//SPI_NSS = false;
    SPI0CKR = cCLKRate;          
}

// SPI寫字節函數
void SPI_WriteByte(unsigned char cData)
{
   SPI0DAT  = cData;                   
   while (!SPIF);   
   SPIF = false;  
}

// SPI讀字節函數
unsigned char SPI_ReadByte()
{
   SPI0DAT  = 0x00;                       
   while (!SPIF);   
   SPIF     = false;
   
   return (SPI0DAT);
}

// 讀FLASH的ID號函數
BOOL FLS_ReadID()
{
	unsigned char i;
	unsigned char nID[2] = {0} ;
	
	NSSMD0 = false; 
    SPI_WriteByte(AT45C_ID);

	for(i = 0;i < 2;i++)
        nID[i] = SPI_ReadByte();

	NSSMD0 = true;

	if (*(unsigned int *)&nID[0]  == AT45D161D_ID)		
		return true;
	else
		return false;
}

// 等待FLASH就緒狀態
unsigned char FLS_WaitRDY()
{
	unsigned char cStatus;
	unsigned int nCount;

	for(nCount = 0; nCount < 5000; nCount++)
	{
		cStatus = FLS_GetStatus();
		if (cStatus & AT45DB_RDY)
			break;
	}
	return cStatus;
}

// 查詢狀態寄存器狀態
unsigned char FLS_GetStatus()
{
	unsigned char cStatus = 0;
    
	NSSMD0 = false; 
	SPI_WriteByte(AT45C_STATUS);
	cStatus = SPI_ReadByte();
	NSSMD0 = true; 
	//-----------debug------------------------------
    /*putchar('+');
	putchar(cStatus);
	putchar(SPI0CN);
	putchar(SPI0CFG);
	putchar('+');*/
	//----------------------------------------------
	return cStatus;
}

// 按頁面讀函數
BOOL FLS_PageRead(unsigned int PageAddr, unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB2 |= ((ByteAddr >> 8) & 0x03);
	AB3 = (ByteAddr) & 0xff;

	NSSMD0 = false;
	
	SPI_WriteByte(AT45C_PAGEREAD);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	SPI_WriteByte(0);   // 4Bytes additional
	SPI_WriteByte(0);
	SPI_WriteByte(0);
	SPI_WriteByte(0);

	while (nCount--)
		*cBuf++ = SPI_ReadByte();

	NSSMD0 = true; 

	return false;
}

// 寫數據到FLASH緩存區1函數
BOOL FLS_Buf1Write(unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;

	AB1 = 0;
	AB2 = (ByteAddr >> 8) & 0x03;
	AB3 = (ByteAddr) & 0xff;

	NSSMD0 = false; 
	SPI_WriteByte(AT45C_BUF1WRITE);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	while (nCount--)
		SPI_WriteByte(*cBuf++);

	NSSMD0 = true; 

	return false;
}

// FLASH頁擦除函數
BOOL FLS_PageErase(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	NSSMD0 = false; 

	SPI_WriteByte(AT45C_PAGEERASE);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	NSSMD0 = true; 

	FLS_WaitRDY();

	return false;
}

// FLASH緩存區1數據寫FLASH頁函數
BOOL FLS_Buf1ToPageW(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	NSSMD0 = false; 

	SPI_WriteByte(AT45C_BUF1TOPAGEW);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	NSSMD0 = true;
	
	FLS_WaitRDY();

	return false;
}

// FLASH頁面數據到緩存區1操作函數
BOOL FLS_PageToBuf1Trans(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	NSSMD0 = false; 
	SPI_WriteByte(AT45C_PAGETOBUF1TRANS);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	NSSMD0 = true; 
	FLS_WaitRDY();

	return false;
}


// FLASH頁面數據和緩存區1的數據比較函數
BOOL FLS_PageToBuf1Comp(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	NSSMD0 = false; 
	SPI_WriteByte(AT45C_PAGETOBUF1COMP);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	NSSMD0 = true; 

	return (FLS_WaitRDY() & AT45DB_COMP) ? false : true;
}


// 系統讀緩存區數據判斷是否需要擦除函數
BOOL FLS_Buf1NeedErase(unsigned long ByteAddr, unsigned char *cData, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;
	unsigned char c1, c2;
	bool bOK;

	AB1 = 0;
	AB2 = (ByteAddr >> 8) & 0x03;
	AB3 = (ByteAddr) & 0xff;

	NSSMD0 = false; 
	SPI_WriteByte(AT45C_BUF1READ);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	SPI_WriteByte(0);				// 1Bytes additional

	for(bOK = false; nCount; nCount--)
	{
		c1 = SPI_ReadByte();
		c2 = *cData++;
		if ((c1 & c2) != c2)	// Compare data
		{
			bOK = true;
			break;
		}
	}

	NSSMD0 = true;
	
	return bOK;
}

unsigned int FLS_Read(unsigned long Address, void *cData, unsigned int nCount)
{
	unsigned int PageAddr, ByteAddr;
	unsigned long xdata  Cnt, RealCnt;
	unsigned char  *p;

	PageAddr = (unsigned int)(Address / AT45D161D_PAGESIZE);
	ByteAddr = (unsigned int)(Address % AT45D161D_PAGESIZE);

	for(p=(unsigned char *)cData,RealCnt=0;nCount;
		RealCnt += Cnt,PageAddr++,ByteAddr=0,p += Cnt,nCount -= Cnt)
	{
		
		Cnt = (AT45D161D_PAGESIZE - ByteAddr);
		Cnt = (Cnt <= nCount) ? Cnt : nCount;

		FLS_PageRead(PageAddr, ByteAddr, (char *)p, Cnt);
	}

	return RealCnt;
}

//-----------------------------------------------------------------------------------
unsigned int FLS_Write(unsigned long Address, void *cData, unsigned int nCount)
{	
	bool bNeedErase;
	unsigned int PageAddr, ByteAddr;
	unsigned long xdata Cnt, RealCnt;
	unsigned char *p;

	PageAddr = (unsigned int)(Address / AT45D161D_PAGESIZE);
	ByteAddr = (unsigned int)(Address % AT45D161D_PAGESIZE);

	for(p=(unsigned char *)cData,RealCnt=0;nCount;
		RealCnt+=Cnt,PageAddr++,ByteAddr=0,p+=Cnt,nCount-=Cnt)
	{
		Cnt = (AT45D161D_PAGESIZE - ByteAddr);
		Cnt = (Cnt <= nCount) ? Cnt : nCount;

		FLS_PageToBuf1Trans(PageAddr);
		bNeedErase = FLS_Buf1NeedErase(ByteAddr, p, Cnt);
		FLS_Buf1Write(ByteAddr, (unsigned char *)p, Cnt);
		if (bNeedErase)
			FLS_PageErase(PageAddr);
		FLS_Buf1ToPageW(PageAddr);
		if (!FLS_PageToBuf1Comp(PageAddr))
			break;
	}

	return RealCnt;
}

//==================================== 備份函數 =============================================
// AT45DBXX 讀緩存1函數
/*BOOL FLS_Buf1Read(unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;

	AB1 = 0;
	AB2 = (ByteAddr >> 8) & 0x03;
	AB3 = (ByteAddr) & 0xff;

	SPI_WriteByte(AT45C_BUF1READ);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	SPI_WriteByte(0);// 1Bytes additional

	while (nCount--)
		*cBuf++ = SPI_ReadByte();

	return false;
}

// AT45DBXX 讀緩存2函數
BOOL FLS_Buf2Read(unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;

	AB1 = 0;
	AB2 = (ByteAddr >> 8) & 0x03;
	AB3 = (ByteAddr) & 0xff;

	SPI_WriteByte(AT45C_BUF2READ);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	SPI_WriteByte(0);// 1Bytes additional

	while (nCount--)
		*cBuf++ = SPI_ReadByte();

	return false;
} 

// 連續隊列讀函數
BOOL FLS_ArrayRead(unsigned int PageAddr, unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB2 |= ((ByteAddr >> 8) & 0x03);
	AB3 = (ByteAddr) & 0xff;

	SPI_WriteByte(AT45C_ARRAYREAD);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	SPI_WriteByte(0);   // 4Bytes additional
	SPI_WriteByte(0);
	SPI_WriteByte(0);
	SPI_WriteByte(0);
	
	while (nCount--)
		*cBuf++ = SPI_ReadByte();

	return false;
}

  // 寫數據到FLASH緩存區2函數
BOOL FLS_Buf2Write(unsigned int ByteAddr, unsigned char *cBuf, unsigned int nCount)
{
	char AB1, AB2, AB3;

	AB1 = 0;
	AB2 = (ByteAddr >> 8) & 0x03;
	AB3 = (ByteAddr) & 0xff;

	SPI_WriteByte(AT45C_BUF2WRITE);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);
	
	while (nCount--)
		SPI_WriteByte(*cBuf++);

	return false;
}

// FLASH塊擦除函數
BOOL AT45_BlockErase(unsigned int nBlock)
{
	unsigned char AB1, AB2, AB3;

	nBlock <<= 5;
	AB1 = (nBlock >> 8) & 0x3f;
	AB2 = (nBlock) & 0xe0;
	AB3 = 0;

	SPI_WriteByte(AT45C_BLOCKERASE);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	FLS_WaitRDY();

	return false;
}

 // 帶擦除功能的緩存區1數據寫FLASH函數
BOOL FLS_Buf1ToPageEW(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	SPI_WriteByte(AT45C_BUF1TOPAGEEW);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	FLS_WaitRDY();

	return false;
}
  // 帶擦除功能的緩存區2數據寫FLASH函數
BOOL FLS_Buf2ToPageEW(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	SPI_WriteByte(AT45C_BUF2TOPAGEEW);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	FLS_WaitRDY();

	return false;
}

// FLASH頁面數據和緩存區2的數據比較函數
BOOL FLS_PageToBuf2Comp(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	SPI_WriteByte(AT45C_PAGETOBUF2COMP);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	return (FLS_WaitRDY() & AT45DB_COMP) ? false : true;
}

// FLASH頁面數據到緩存區2操作函數
BOOL FLS_PageToBuf2Trans(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	SPI_WriteByte(AT45C_PAGETOBUF2TRANS);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	FLS_WaitRDY();

	return false;
}

// FLASH緩存區1數據寫FLASH頁函數
BOOL FLS_Buf2ToPageW(unsigned int PageAddr)
{
	unsigned char AB1, AB2, AB3;

	PageAddr <<= 2;
	AB1 = (PageAddr >> 8) & 0x3f;
	AB2 = (PageAddr) & 0xfc;
	AB3 = 0;

	SPI_WriteByte(AT45C_BUF2TOPAGEW);
	SPI_WriteByte(AB1);
	SPI_WriteByte(AB2);
	SPI_WriteByte(AB3);

	FLS_WaitRDY();

	return false;
}


*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产91九色蝌蚪| 色综合咪咪久久| 久久久国产一区二区三区四区小说 | 欧美日韩一区二区三区四区五区| 一区二区三区国产精华| 欧美日韩国产另类不卡| 首页欧美精品中文字幕| 日韩午夜激情视频| 国产成人午夜精品影院观看视频| 国产精品国产三级国产aⅴ无密码| 日本道色综合久久| 免费欧美日韩国产三级电影| 久久精品日产第一区二区三区高清版 | 久久99蜜桃精品| 国产欧美一区在线| 色屁屁一区二区| 久久国产成人午夜av影院| 国产精品视频你懂的| 欧美影视一区二区三区| 国产美女在线精品| 夜夜精品视频一区二区| 日韩一区二区电影在线| 成人av中文字幕| 婷婷激情综合网| 欧美国产精品专区| 91精品国产高清一区二区三区蜜臀| 国产精品中文字幕日韩精品| 亚洲乱码一区二区三区在线观看| 欧美群妇大交群的观看方式| 91精品国产91综合久久蜜臀| 国产成人综合在线| 日韩福利视频导航| 中文天堂在线一区| 欧美一区二区性放荡片| av中文字幕亚洲| 免费视频一区二区| 亚洲一区影音先锋| 国产欧美日韩精品在线| 欧美精品久久天天躁| av亚洲精华国产精华| 捆绑紧缚一区二区三区视频| 夜夜精品浪潮av一区二区三区| 久久久久久久综合日本| 欧美一区二区高清| 色8久久人人97超碰香蕉987| 成人午夜av影视| 韩国女主播成人在线观看| 日韩专区欧美专区| 亚洲一区二区中文在线| 中文字幕亚洲欧美在线不卡| 久久久亚洲欧洲日产国码αv| 欧美日韩不卡一区二区| 在线观看亚洲专区| 91丝袜美女网| 成人一级视频在线观看| 国内精品伊人久久久久av一坑| 丝袜诱惑制服诱惑色一区在线观看| 中文字幕亚洲综合久久菠萝蜜| 久久亚洲二区三区| 91精选在线观看| 这里是久久伊人| 91.麻豆视频| 欧美一区二区三区在线电影| 欧美性生活久久| 在线观看日韩毛片| 在线观看视频一区| 欧美亚洲动漫制服丝袜| 在线观看一区不卡| 欧美在线免费播放| 欧美日韩一区二区三区不卡| 在线免费观看日本欧美| 欧美影视一区在线| 欧美日韩精品一二三区| 欧美日韩日本视频| 欧美一区在线视频| 欧美一区二区三区在线观看| 日韩午夜激情免费电影| 精品1区2区在线观看| 337p日本欧洲亚洲大胆色噜噜| 精品国产伦理网| 久久精品一二三| 国产精品国模大尺度视频| 中文字幕中文乱码欧美一区二区| 国产欧美日韩另类视频免费观看| 国产精品嫩草99a| 亚洲精品视频在线观看免费| 亚洲综合一区在线| 亚洲va欧美va人人爽| 日本不卡视频一二三区| 久久99精品国产| av毛片久久久久**hd| 色婷婷综合中文久久一本| 欧美日韩一区二区不卡| 亚欧色一区w666天堂| 青草av.久久免费一区| 国产麻豆精品在线观看| 99久久久国产精品免费蜜臀| 色94色欧美sute亚洲线路一久| 在线不卡中文字幕| 久久综合九色综合97_久久久 | 欧美成人福利视频| 国产女人18毛片水真多成人如厕| 亚洲色图另类专区| 日韩和的一区二区| 高清视频一区二区| 欧美性受xxxx| 久久久久久久久久电影| 国产视频一区在线播放| 一区二区在线观看av| 久久国产免费看| 成人精品gif动图一区| 欧美情侣在线播放| 中文字幕第一区| 天天色天天操综合| 成人福利视频网站| 欧美一级在线观看| 成人免费视频在线观看| 美女高潮久久久| 91精彩视频在线观看| 精品sm捆绑视频| 一区二区三区成人| 久久精工是国产品牌吗| 91成人看片片| 国产日韩欧美综合在线| 亚洲国产成人va在线观看天堂| 国产自产v一区二区三区c| 欧美怡红院视频| 国产精品色噜噜| 美女视频黄频大全不卡视频在线播放| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美激情综合五月色丁香 | 久久久久久日产精品| 一区二区日韩电影| 粉嫩aⅴ一区二区三区四区五区| 欧美一区二区三区日韩视频| 专区另类欧美日韩| 国产白丝网站精品污在线入口 | 欧美大片一区二区| 亚洲午夜电影在线| 色综合天天综合在线视频| 久久综合久久99| 麻豆精品一区二区av白丝在线| 欧美午夜宅男影院| 亚洲美女视频一区| 99re热这里只有精品视频| 国产亚洲欧美激情| 国产一区欧美二区| 精品国产sm最大网站免费看| 青青青爽久久午夜综合久久午夜 | 亚洲第一福利一区| 国产成人在线观看| 欧美一区二区三区视频| 亚洲18色成人| 国产精品不卡视频| 国产九色sp调教91| 欧美大片国产精品| 蜜桃av一区二区在线观看| 欧美乱妇23p| 亚洲午夜在线视频| 欧美日韩在线播放一区| 亚洲国产成人高清精品| 在线观看日韩精品| 亚洲一区二区视频在线| 欧美亚洲一区二区在线观看| 一区二区三区不卡视频| 91久久一区二区| 一级日本不卡的影视| 91久久精品日日躁夜夜躁欧美| 亚洲色图欧美在线| 91年精品国产| 亚洲黄色小说网站| 欧美日韩国产高清一区二区| 视频一区视频二区中文| 欧美一区二区在线免费观看| 蜜桃在线一区二区三区| 久久毛片高清国产| av资源网一区| 亚洲狠狠爱一区二区三区| 91精品午夜视频| 精品一区二区三区久久| 久久九九久久九九| 91视频一区二区| 五月天久久比比资源色| 精品国产一区二区三区久久影院 | 99re这里只有精品首页| 夜夜精品浪潮av一区二区三区| 欧美精品国产精品| 国产呦萝稀缺另类资源| 国产精品成人在线观看| 欧美日韩一区在线| 国产在线精品不卡| 国产精品成人免费在线| 欧美麻豆精品久久久久久| 精品综合久久久久久8888| 国产精品人成在线观看免费 | 久久久精品蜜桃| 色哟哟日韩精品| 久久精品国产精品亚洲精品| 国产精品免费久久| 欧美日韩日日夜夜|