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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flash.c

?? SPI接口的Data Flash at45db的C驅(qū)動(dòng)
?? C
字號(hào):
//*------------------------------------------------------------------------------------------------
//* 文件名			   : flash.c
//* 功能描述		   : FLASH讀寫驅(qū)動(dòng)
//* 作者    		   : 焦海波
//* 版本			   : 0.1
//* 建立日期、時(shí)間	   : 2008/05/04 16:04
//* 最近修改日期、時(shí)間 : 
//* 修改原因		   : 
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 頭文件 ----------------------------------------------
#include	"/at91sam7x256/include/AT91SAM7X256.h"
#include	"/uCOS-II/ucos_ii.h"
#include	"spi.h"

#define	OS_GLOBALS 
#include	"flash.h"
//*---------------------------------------- 變量定義區(qū) --------------------------------------------
static ST_SPI_DEV_RW stFlash;
//*================================================================================================
//*                     函 數(shù) 區(qū)
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : FlashInitCfg
//* 功能描述 : 外部FLASH初始設(shè)置,實(shí)際完成與FLASH相連的SPI接口的初始設(shè)置工作
//* 入口參數(shù) : 無
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
void FlashInitCfg(void)
{
	//* 復(fù)位FLASH
	AT91C_BASE_RSTC->RSTC_RMR = 0xA5000000 | (0x09 << 8);
	AT91C_BASE_RSTC->RSTC_RCR = 0xA5000000 | AT91C_RSTC_EXTRST;

	//* 等待NRST引腳恢復(fù)為高電平
	while(!(AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL));

	//* 使能FLASH設(shè)備的片選線
	AT91C_BASE_PIOA->PIO_IDR = FLASH_NPCS;
	AT91C_BASE_PIOA->PIO_PPUDR = FLASH_NPCS;
	AT91C_BASE_PIOA->PIO_ASR = FLASH_NPCS;
	AT91C_BASE_PIOA->PIO_PDR = FLASH_NPCS;

	//* 設(shè)定為SPI模式0(CPOL:0,NCPHA:1),波特率為1MHz,片選有效之后延時(shí)12/MCK時(shí)間之后輸出SPCK,
	//* 兩個(gè)連續(xù)傳輸之間等待(32*1)/MCK時(shí)間
	FLASH_BASE->SPI_CSR[FLASH_NPCS_IDX] = AT91C_SPI_NCPHA | ((MCK/FLASH_RW_BAUD_RATE) << 8)| ((unsigned int)12 << 16) | ((unsigned int)1 << 24);
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : __SendOptFlashCode
//* 功能描述 : 向FLASH發(fā)送操作碼
//* 入口參數(shù) :        <pbCmd>[in] 指向操作指令的指針
//*          :     <u8CmdLen>[in] 操作指令的長(zhǎng)度
//*          :       <pbData>[in] 指向具體的操作數(shù)據(jù)的指針
//*          :   <u32DataLen>[in] 具體的操作數(shù)據(jù)的長(zhǎng)度
//*          : <pfunCallBack>[in] 回調(diào)函數(shù)指針
//*          :        <pvArg>[in] 傳遞給回調(diào)函數(shù)的參數(shù)
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
static void __SendOptFlashCode(INT8U *pbCmd, INT8U u8CmdLen, INT8U *pbData, 
                               INT32U u32DataLen, PFUN_CALLBACK pfunCallBack, void *pvArg)
{
	memset(&stFlash, 0, sizeof(ST_SPI_DEV_RW));
	stFlash.u8SPIPort = SPI0;
	stFlash.u8NPCSPin = FLASH_NPCS_IDX;
	stFlash.pbCmd = pbCmd;
	stFlash.u8CmdLen = u8CmdLen;
	stFlash.pbData = pbData;
	stFlash.u32DataLen = u32DataLen;
	stFlash.pfunCallBack = pfunCallBack;
	stFlash.pvArg = pvArg;
	
	ReadAndWriteSPIDev(&stFlash);
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : __GetFlashStatus
//* 功能描述 : 獲得外部Flash狀態(tài)
//* 入口參數(shù) : 無
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
static INT8U __GetFlashStatus(void)
{
	INT8U __bCmd = FLASH_CMD_READ_STATUS;
	INT8U __bStatus = 0x00;
	
	__SendOptFlashCode(&__bCmd, 1, &__bStatus, 1, NULL, NULL);
	
	macWaitSPIRecvEnd();
	
	return __bStatus;
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : CheckFlashID
//* 功能描述 : 外部FLASH初始設(shè)置,實(shí)際完成與FLASH相連的SPI接口的初始設(shè)置工作
//* 入口參數(shù) : 無
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
void CheckFlashID(void)
{	
	while(FLASH_ID != (__GetFlashStatus() & FLASH_ID_MASK));
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : FlashRead
//* 功能描述 : 從指定頁面的指定位置讀取數(shù)據(jù)
//* 入口參數(shù) :  <u16PageIdx>[in] 指定要讀取的頁面
//*          : <u16ByteAddr>[in] 指定數(shù)據(jù)在頁面中的讀取地址
//*          :      <pbData>[in] 指向接收緩沖區(qū)的指針
//*          :  <u32DataLen>[in] 要讀取數(shù)據(jù)的長(zhǎng)度
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
void FlashRead(INT16U u16PageIdx, INT16U u16ByteAddr, INT8U *pbData, INT32U u32DataLen)
{
	__align(4) INT8U __bCmd[8];
	U_FLASH_OPT_CODE __uFOptCode;
	INT8U __u8Err;

    memset(__bCmd, 0, sizeof(__bCmd));
    
    //* 按照嚴(yán)格的格式組裝操作指令
    __uFOptCode.bstOptCode.bitByteAddr = u16ByteAddr;
    __uFOptCode.bstOptCode.bitPageAddr = u16PageIdx;
    __uFOptCode.bstOptCode.bitReserved = 0;
    __uFOptCode.bstOptCode.bitCmd = FLASH_CMD_CONTINUOUS_READ;
    *((unsigned int*)&__bCmd[0]) = macHighToLowSwitch(__uFOptCode.u32OptCode);
    
    OSMutexPend(hSPI0, 0, &__u8Err);
    {
    	__SendOptFlashCode(__bCmd, 8, pbData, u32DataLen, NULL, NULL);
    
	    macWaitSPIRecvEnd();
    }
    OSMutexPost(hSPI0);
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : __IsErased
//* 功能描述 : 判斷指定頁面是否已經(jīng)被擦除
//* 入口參數(shù) : <u16PageIdx>[in] 指定要檢查的頁面號(hào)
//* 出口參數(shù) : OS_TRUE - 已擦除
//*          : OS_FALSE - 未擦除或未擦除干凈
//*------------------------------------------------------------------------------------------------
static BOOLEAN __IsErased(INT16U u16PageIdx)
{
	INT32U i;
	__align(4) INT8U __bFBuf[FLASH_BUF_SIZE];
	
	memset(__bFBuf, 0, sizeof(__bFBuf));
    
    FlashRead(u16PageIdx, 0, __bFBuf, sizeof(__bFBuf));
    
    for(i=0; i<FLASH_PAGE_SIZE/4; i++)
    {
    	if(((unsigned int*)__bFBuf)[i] != 0xFFFFFFFF)
    		return OS_FALSE;
    }
    
    return OS_TRUE;
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : __FlashErase
//* 功能描述 : 擦除指定頁面
//* 入口參數(shù) : <u16PageIdx>[in] 指定要擦除的頁面
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
static BOOLEAN __FlashErase(INT16U u16PageIdx)
{
	INT8U i = 0;
	__align(4) INT8U __bCmd[4];	
	U_FLASH_OPT_CODE	__uFOptCode;
    
    while(i++ < 3)
    {
    	if(__IsErased(u16PageIdx))
    		return OS_TRUE;
    	else
    	{
    		memset(__bCmd, 0, sizeof(__bCmd));
    		
    		//* 按照嚴(yán)格的格式組裝操作指令
		    __uFOptCode.bstOptCode.bitByteAddr = 0;
		    __uFOptCode.bstOptCode.bitPageAddr = u16PageIdx;
		    __uFOptCode.bstOptCode.bitReserved = 0;
		    __uFOptCode.bstOptCode.bitCmd = FLASH_CMD_PAGE_ERASE;
		    *((unsigned int*)&__bCmd[0]) = macHighToLowSwitch(__uFOptCode.u32OptCode);
    		__SendOptFlashCode(__bCmd, 4, NULL, 0, NULL, NULL);
            macWaitSPIRecvEnd();
            while(!(__GetFlashStatus() & FLASH_IS_RDY));
    	}
    }
    
    return OS_FALSE;
}
//*------------------------------------------------------------------------------------------------
//* 函數(shù)名稱 : FlashWrite
//* 功能描述 : 向指定頁面的指定位置寫入數(shù)據(jù)
//* 入口參數(shù) :  <u16PageIdx>[in] 指定要擦除的頁面
//*          : <u16ByteAddr>[in] 指定數(shù)據(jù)在頁面中的寫入地址
//*          :      <pbData>[in] 指向?qū)懭霐?shù)據(jù)的指針
//*          :  <u16DataLen>[in] 寫入數(shù)據(jù)的長(zhǎng)度
//* 出口參數(shù) : 無
//*------------------------------------------------------------------------------------------------
BOOLEAN FlashWrite(INT16U u16PageIdx, INT16U u16ByteAddr, INT8U *pbData, INT16U u16DataLen)
{
	__align(4) INT8U __bCmd[4];	
	INT8U __bFBuf[FLASH_BUF_SIZE];
	U_FLASH_OPT_CODE __uFOptCode;
	INT16U	i;
	INT8U __u8Err;
	
	if(u16DataLen > FLASH_BUF_SIZE)
		return OS_FALSE;
		
	memcpy(__bFBuf, pbData, u16DataLen);

	
	//* 首先進(jìn)行頁面擦除
	if(!__FlashErase(u16PageIdx))
		return OS_FALSE;
	
	//* 向FLASH寫入數(shù)據(jù)
	memset(__bCmd, 0, sizeof(__bCmd));
    		
    //* 按照嚴(yán)格的格式組裝操作指令
	__uFOptCode.bstOptCode.bitByteAddr = u16ByteAddr;
	__uFOptCode.bstOptCode.bitPageAddr = u16PageIdx;
    __uFOptCode.bstOptCode.bitReserved = 0;
    __uFOptCode.bstOptCode.bitCmd = FLASH_CMD_PAGE_WRITE;
    *((unsigned int*)&__bCmd[0]) = macHighToLowSwitch(__uFOptCode.u32OptCode);
    
	OSMutexPend(hSPI0, 0, &__u8Err);
	{
		__SendOptFlashCode(__bCmd, 4, __bFBuf, u16DataLen, NULL, NULL);
	    macWaitSPIRecvEnd();
	    while(!(__GetFlashStatus() & FLASH_IS_RDY));
	}
	OSMutexPost(hSPI0);
    
    FlashRead(u16PageIdx, u16ByteAddr, __bFBuf, sizeof(__bFBuf));
    
    for(i=0; i<u16DataLen; i++)
    {
    	if(__bFBuf[i] != pbData[i])
    		return OS_FALSE;
    }
		
	return OS_TRUE;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜视频免费看| 色老头久久综合| 日韩av在线播放中文字幕| 亚洲精品欧美专区| 18成人在线观看| 亚洲丝袜另类动漫二区| 亚洲视频一区在线| 亚洲精品成人悠悠色影视| 亚洲人成在线观看一区二区| 综合欧美一区二区三区| 亚洲精品自拍动漫在线| 一区二区三区在线观看国产| 一区二区三区精品在线观看| 亚洲一区在线电影| 午夜影院久久久| 青青草原综合久久大伊人精品优势 | 9191成人精品久久| 欧美二区三区的天堂| 日韩欧美一区二区久久婷婷| 欧美电影免费提供在线观看| 久久色.com| 国产精品免费av| 亚洲免费毛片网站| 亚洲第一福利一区| 久久不见久久见中文字幕免费| 国产又粗又猛又爽又黄91精品| 国产成人精品1024| 93久久精品日日躁夜夜躁欧美| 欧洲精品一区二区| 欧美一区二区三区在线看| 精品国免费一区二区三区| 欧美激情一区二区三区不卡 | 国产精品麻豆一区二区| 国产精品卡一卡二卡三| 一区二区成人在线| 美女网站视频久久| 成人高清在线视频| 欧美亚日韩国产aⅴ精品中极品| 制服丝袜亚洲色图| 国产欧美精品一区二区色综合| 亚洲私人影院在线观看| 日韩中文欧美在线| 成人一区在线观看| 欧美亚洲丝袜传媒另类| 欧美成人a∨高清免费观看| 成人欧美一区二区三区| 日本91福利区| av在线不卡网| 日韩一区二区三区免费看| 国产欧美中文在线| 亚洲777理论| 懂色av一区二区三区免费观看 | 欧美一级理论片| 久久久久久久久久久久久久久99| 亚洲欧美成人一区二区三区| 日韩av不卡一区二区| 成人激情av网| 91精品国产色综合久久不卡蜜臀| 中文在线免费一区三区高中清不卡| 亚洲国产精品一区二区久久恐怖片| 国产精品综合一区二区| 欧美日韩精品一区二区天天拍小说| 亚洲国产精品t66y| 日本不卡视频在线| 色婷婷av一区二区三区gif | 精品在线免费观看| 日本韩国精品在线| 精品剧情在线观看| 调教+趴+乳夹+国产+精品| 懂色av一区二区三区免费观看| 日韩欧美另类在线| 亚洲一区二区在线视频| 国产99精品国产| 精品欧美乱码久久久久久1区2区| 亚洲午夜久久久| 91蜜桃视频在线| 国产三级精品在线| 美女视频第一区二区三区免费观看网站| 97久久精品人人做人人爽50路| 久久综合99re88久久爱| 日韩高清在线电影| 在线观看亚洲精品视频| 中文字幕在线一区免费| 国产精华液一区二区三区| 日韩一区二区三区在线| 亚洲成av人片www| 一本久久a久久免费精品不卡| 国产精品欧美一级免费| 国产精品资源在线| 欧美成人猛片aaaaaaa| 日av在线不卡| 欧美一卡2卡3卡4卡| 一区二区成人在线| 91麻豆swag| 亚洲日本在线天堂| 成人动漫中文字幕| 欧美极品xxx| 福利一区福利二区| 久久精品一区二区三区不卡| 激情亚洲综合在线| 精品久久久久一区| 极品瑜伽女神91| 精品剧情在线观看| 国产一区二区三区| 国产女同性恋一区二区| 国产精品99久久久| 国产日韩三级在线| 成人的网站免费观看| 国产精品黄色在线观看| 成人看片黄a免费看在线| 国产精品天干天干在线综合| 成人激情午夜影院| 日韩毛片视频在线看| 91丨porny丨中文| 亚洲免费观看高清| 欧美体内she精视频| 日日嗨av一区二区三区四区| 91精品国产色综合久久久蜜香臀| 久久精品国产成人一区二区三区 | 久久精品免费在线观看| 国产精品自拍毛片| 国产精品色在线观看| 成人18精品视频| 亚洲精品高清在线| 在线精品亚洲一区二区不卡| 亚洲国产aⅴ成人精品无吗| 91国偷自产一区二区三区观看| 亚洲精品中文字幕乱码三区| 欧美日韩的一区二区| 奇米色777欧美一区二区| 久久久久久夜精品精品免费| 成人久久视频在线观看| 亚洲综合一区在线| 日韩小视频在线观看专区| 国产精品羞羞答答xxdd| 亚洲视频在线观看一区| 91精品国产一区二区三区蜜臀| 国产在线视频一区二区三区| 国产精品初高中害羞小美女文| 欧美三级资源在线| 精品亚洲免费视频| 国产精品欧美一区二区三区| 欧美日韩国产色站一区二区三区| 麻豆精品精品国产自在97香蕉| 久久精品在线观看| 在线观看成人免费视频| 久久99国内精品| 亚洲视频 欧洲视频| 欧美一区二区三区人| 成人午夜短视频| 性做久久久久久| 日本一区二区三区久久久久久久久不 | 国产成人高清视频| 亚洲精品中文字幕在线观看| 欧美成人官网二区| 在线亚洲一区二区| 国产一二精品视频| 亚洲专区一二三| 国产性天天综合网| 欧美伦理电影网| 成人av网站在线观看免费| 日韩精品免费视频人成| 中文字幕在线不卡国产视频| 日韩女优视频免费观看| 91美女福利视频| 国模冰冰炮一区二区| 亚洲小说欧美激情另类| 国产婷婷色一区二区三区在线| 欧美日韩精品免费观看视频| 成人av资源在线| 久久国产精品99精品国产 | 美日韩一区二区| 亚洲黄色尤物视频| 欧美高清在线精品一区| 91精品国产美女浴室洗澡无遮挡| 成人精品视频一区二区三区尤物| 日本亚洲三级在线| 尤物av一区二区| 欧美激情中文字幕| 精品sm捆绑视频| 欧美精品电影在线播放| 91浏览器入口在线观看| 国产激情一区二区三区四区| 日本欧美韩国一区三区| 亚洲va欧美va人人爽午夜| 亚洲日本在线视频观看| 国产日产精品1区| 精品精品国产高清a毛片牛牛| 欧美日韩国产综合一区二区三区| 色噜噜久久综合| 91在线观看高清| 成人美女在线视频| 国产精品69毛片高清亚洲| 国产中文字幕一区| 蜜桃91丨九色丨蝌蚪91桃色| 丝袜脚交一区二区| 午夜欧美在线一二页| 亚洲小少妇裸体bbw| 亚洲成人在线免费| 一区二区三区不卡视频|