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

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

?? at45db642.c

?? EEPROM存儲(chǔ)器AT45DB642驅(qū)動(dòng)程序
?? C
字號(hào):
Atmal dataflahs AT45DB321B driver for PIC18F452 
Posted: Mon Aug 02, 2004 5:02 pm       

--------------------------------------------------------------------------------
 
bonjour, 

My DataFlash Drivers 

Code: 

//--------------------------------------------------------------------------- 
//  Copyright (c) DVSoft 2004 
//  email dvsoft@club-internet.fr 
// 
//  This program is free software; you can redistribute it and/or modify it 
//  under the terms of the GNU General Public License as published by the 
//  Free Software Foundation. 
// 
//  This program is distributed in the hope it will be useful, but WITHOUT 
//  ANY WARRANTY; without even the implied warranty of MERCHANDIBILITY or 
//  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
//  more details. 
// 
//  Originale Unit Name : DTFDriver.c 
//  Author              : Alain 
//  Date                : 15-Avril-2004 
//  Project             : YA1-LOGGER-V3 
//  Version             : 0.9.0.1 
//  Revision            : 
// 
//---------------------------------------------------------------------------- 
// 
//  DataFlash Driver AT45DB321B for CCS compiler 
//  
//  Inactive Clock Polarity High 
//  level convertor 74F07 Hex inverter/buffer drivers (open-collector) 
//  Pull-Up resistor 2K2 
// 
//  PIC18F452 TQFP        AT45DB321B 
//  
//    RC5 (SDO)      ->   DTF SI       (15) 
//    RC4 (SDI)      <-   DTF SO       (16) 
//    RC3 (SCK)      ->   DTF SCK      (14) 
//    RE2 (/CS)      ->   DTF /CS      (13) 
//    RE1 (WR)       <-   DTF RDY/BUSY (1) 
//                        DTF /RESET    +3.3V 
//                        DTF /WP       +3.3V 
// 
//---------------------------------------------------------------------------- 

//---------------------------------------------------------------------------- 
// Conditional PinDef 
// 
#ifndef __DTF_PIN_DEF__ 
    #define DTF_READY   PIN_E1 
    #define DTF_CS      PIN_E2 
#endif 

//---------------------------------------------------------------------------- 
// Conditional code for the dataflash state in eeprom 
// 
#ifndef __DTF_DATA_STORAGE__ 
    //------------------------------------------------------------------------ 
    // ROM Space free 
    // 
    #define PROGRAM_MEMORY_SIZE   getenv("PROGRAM_MEMORY") 
    #define FLASH_ERASE_SIZE      getenv("FLASH_ERASE_SIZE") 
    #define BUFFER_END            PROGRAM_MEMORY_SIZE-1 
    #define BUFFER_START          (PROGRAM_MEMORY_SIZE-(FLASH_ERASE_SIZE*2)) 

    //----------------------------------------------------------------------- 
    // Config ROM Space (Application not for DataFlash) 
    // 
    #define CFG_BUFFER_START      BUFFER_START 
    #define CFG_BUFFER_LEN        CFG_BUFFER_START+0x000E 

    //----------------------------------------------------------------------- 
    // DataFlash ROM Space 
    // 
    #define DTF_BUFFER_START      (CFG_BUFFER_START+FLASH_ERASE_SIZE) 
    #define DTF_BUFFER_LEN        (DTF_BUFFER_START+0x000E) 

    //----------------------------------------------------------------------- 
    // Rom Configuration 
    // 
    #org CFG_BUFFER_START, CFG_BUFFER_LEN {} 

    //----------------------------------------------------------------------- 
    // DTPageCnt in ROM 
    // 
    #org DTF_BUFFER_START, DTF_BUFFER_LEN {} 
    
    //--------------------------------------------------------------------------- 
    // DataFlash PageCnt in ROM Space 
    // 
    int16 DTFPageCntRomAddress; 

#endif 

//---------------------------------------------------------------------------- 
// Dataflash Config 
// 
const int16 DTFBlockSize = 512;       // DTF block Size 
const int16 DTFPageSize  = 528;       // DTF Page Size 
const int16 DTFNbrPage   = 8192;      // DTF Nb Page 

//--------------------------------------------------------------------------- 
// Dataflash Macro 
// 
// see Dataflash AC Characteristics 
// tCSS /CS Setup Time     250 ns 
// 
#define DTFSelect()\ 
        output_low(DTF_CS);\ 
        delay_cycles(3)               // 300 ns PIC18F452 at 40Mhz 

#define DTFUnSelect()\ 
        output_high(DTF_CS);\ 
        delay_cycles(3)               // 300 ns PIC18F452 at 40Mhz 

//--------------------------------------------------------------------------- 
// DataFlash PIN 1 Ready/Busy 
// 
// 
#define DTFIsReady()  (input(DTF_READY)) 

//--------------------------------------------------------------------------- 
// DataFlash PageCount 
// 
int16   DTFPageCnt; 
#byte   DTFPageCnt_L=DTFPageCnt 
#byte   DTFPageCnt_H=DTFPageCnt+1 

//--------------------------------------------------------------------------- 
// DataFlash ByteCount 
// 
int16   DTFByteCnt; 
#byte   DTFByteCnt_L=DTFByteCnt 
#byte   DTFByteCnt_H=DTFByteCnt+1 

//--------------------------------------------------------------------------- 
// DataFlash Address 
// 
int16   DTFAddress; 
#byte   DTFAddress_L=DTFAddress 
#byte   DTFAddress_H=DTFAddress+1 

//--------------------------------------------------------------------------- 
// DataFlash Dump PageCnt 
// 
int16   DTFDumpPageCnt; 

//--------------------------------------------------------------------------- 
// DataFlash Full Flags 
// 
BOOLEAN DTFFull; 

//--------------------------------------------------------------------------- 
// DataFlash Buffer Select for Double Buffering 
// 
BOOLEAN DTF_Buffer_2_Active; 

//--------------------------------------------------------------------------- 
// DataFlash Driver State 
// 
BOOLEAN DTFDriverRun; 

//--------------------------------------------------------------------------- 
// Function : DTFReadStatus(void) 
// Input    : 
//      void 
// return   : 
//      int     The Status register value 
// Modify   : 
//      void 
// 
// Note     : 
//      
// 
#separate 
int8 DTFReadStatus(void) 
{ 
    int8 Status; 
    //--- Select 
    DTFSelect(); 
    //--- Command Read Status 
    spi_write(0x57); 
    //--- Status Result 
    Status = spi_read(0); 
    //--- Unselect 
    DTFUnSelect(); 
    return (Status); 
} 
//--------------------------------------------------------------------------- 
// Function : DTFPageToRam(int16 PageNum) 
// Input    : 
//      int16 PageNum       Page index to load in memory buffer 
// return   : 
//      void 
// Modify   : 
//      Load the memory page 'PageNum' in current buffer (1 or 2) 
// 
// Note     : 
//      Change the active buffer1 or Buffer2 
// 
#separate 
void DTFPageToRam(int16 PageNum) 
{ 
    //--- Active buffer to main memory page 
    DTFAddress = (PageNum << 2); 
    while (!DTFIsReady()); 
    //--- Select 
    DTFSelect(); 
    //--- Buffer 2 is Active Buffer 
    if (DTF_Buffer_2_Active) { 
        //--- Memory Page To Buffer 1 
        spi_write(0x53); 
        //--- Set Buffer 1 Active 
        DTF_Buffer_2_Active = FALSE; 
    }// End IF 
    //--- Buffer 1 is Active Buffer 
    else { 
        //--- Memory Page To Buffer 2 
        spi_write(0x55); 
        //--- Set Buffer 2 Active 
        DTF_Buffer_2_Active = TRUE; 
    }// End Else 
    //--- 7 high address bits 
    spi_write(DTFAddress_H); 
    //--- 6 low address bits 
    spi_write(DTFAddress_L); 
    //--- don't care 8 bits 
    spi_write(0x00); 
    //--- Unselect 
    DTFUnSelect(); 
} 
//--------------------------------------------------------------------------- 
// Function : DTFRAMToPage(int16 PageNum) 
// Input    : 
//      int16 PageNum       Page index to store 
// return   : 
//      void 
// Modify   : 
//      Store the current memory buffer in memory page 'PageNum' 
//      Change the active buffer1 or Buffer2 
// 
// Note     : 
// 
#separate 
void DTFRAMToPage(int16 PageNum) 
{ 
    //--- Active buffer to main memory page 
    DTFAddress = (PageNum << 2); 
    //--- Wait DTF_Ready 
    while (!DTFIsReady()); 
    //--- Select 
    DTFSelect(); 
    //--- Use Buffer 2 ? 
    if (DTF_Buffer_2_Active) { 
        //--- Buffer 2 To PAGE With Built In erase 
        spi_write(0x86); 
        //--- Set Buffer 1 Active 
        DTF_Buffer_2_Active = FALSE; 
    }// End IF 
    else { 
        //--- Buffer 1 To PAGE With Built In erase 
        spi_write(0x83); 
        //--- Set Buffer 2 Active 
        DTF_Buffer_2_Active = TRUE; 
    }// End ELse 
    //--- 7 high address bits 
    spi_write(DTFAddress_H); 
    //--- 6 low address bits 
    spi_write(DTFAddress_L); 
    //--- don't care 8 bits 
    spi_write(0x00); 
    //--- Unselect 
    DTFUnSelect(); 
} 
//--------------------------------------------------------------------------- 
// Function : DTFInitDump(void) 
// Input    : 
//      void 
// return   : 
//      void 
// Modify   : 
//      Set the dataflash page dump 'DTFDumpPageCnt' to 0 
//      Load the first memory page in memory buffer 
// 
// Note     : 
// 
#separate 
void DTFInitDump(void) 
{ 
    //--- First page to dump 
    DTFDumpPageCnt = 0; 
    //--- Load first page in memory buffer 
    DTFPageToRam(DTFDumpPageCnt); 
} 
#separate 
//--------------------------------------------------------------------------- 
// Function : DTFDumpPacket(void) 
// Input    : 
//      void 
// return   : 
//      int     0   End off memory pages 
//              1   Some memory pages left 
// 
// Modify   : 
//     increment the dataflash page dump 'DTFDumpPageCnt' 
// 
// Note     : 
//     Load in memory buffer the next memory page 
// 
int DTFDumpNextPage(void) 
{ 
    //--- Next Page 
    DTFDumpPageCnt++; 
    //--- Not in Last Page ? 
    if (DTFDumpPageCnt < DTFPageCnt) { 
        //--- Load in memory buffer 
        DTFPageToRam(DTFDumpPageCnt); 
        //--- OK 
        return 1; 
    }// End If 
    //--- Fin 
    return 0; 
} 
//--------------------------------------------------------------------------- 
// Function : DTFDumpPacket(void) 
// Input    : 
//      void 
// return   : 
//      void 
// 
// Modify   : 
//      void 
// 
// Note     : 
//     Dump the complet buffer to the serial UART 
//     Send only the data in Dataflash buffer 
// 
#separate 
void DTFDumpPacket(void) 
{ 
    int8  TxBuffer; 
    int16 ByteCnt; 
    //--- Wait DTF_Ready 
    while (!DTFIsReady()); 
    //--- Initialisation 
    DTFSelect(); 
    //--- Buffer 2 is Active ? 
    if (DTF_Buffer_2_Active) 
        spi_write(0x56); 
    //--- Buffer 1 is Active 
    else 
        spi_write(0x54); 
    //--- 8 Dont'care Byte 
    spi_write(0x00); 
    //--- High Byte address 
    spi_write(0x00); 
    //--- Low Byte address 
    spi_write(0x00); 
    //--- 8 Dont'care Byte 
    spi_write(0x00); 
    //--- Byte Count 
    ByteCnt = DTFPageSize; 
    //--- Load In Buffer 
    do { 
        //--- Read One Byte 
        TxBuffer = spi_read(0); 
        //--- Put in serial UART 
        putc(TxBuffer); 
    } while (--ByteCnt); 
    //--- Unselect 
    DTFUnSelect(); 
} 
//--------------------------------------------------------------------------- 
// Function : DTFOpen(void) 
// Input    : 
//      void 
// return   : 
//      void 
// 
// Modify   : 
//      Set the flag 'DTFDriverRun' to TRUE  if ok 
//                                   FALSE if not Ok 
//      Set the Flag 'DTFFull' to TRUE if (DTFPageCnt == DTFNbrPage) 
// 
//      Set the Byte Count 'DTFByteCnt' to 0 
// 
//      Set the Dump page counter 'DTFDumpPageCnt' to 0 
// 
// Note     : 
// 
#separate 
void DTFOpen(void) 
{ 
    	int8 Status; 
     
    	setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_4|SPI_SAMPLE_AT_END); //--- Setup du SPI
     	DTF_Buffer_2_Active = FALSE; //--- Buffer 1 Is Active Buffer
    
	#ifndef __DTF_DATA_STORAGE__ 
     	DTFPageCntRomAddress = DTF_BUFFER_START; //--- DataFlash Storage Adresse
    	DTFPageCnt = read_program_eeprom(DTFPageCntRomAddress); //--- DataFlashPageCnt 
	#endif    

     	DTFReadStatus(); //--- Read the status register
    	Status = DTFReadStatus(); //--- Read  2 just in case 
    	
    	//--- Status OK ? 
   	// 
    	//    AT45DB321B  (TABLE 4 and 5 page 8) Using Atmel's DataFlash document 
    	// 
    	//     bit 7      bit6   bit5 bit4 bit3 bit2  bit1 bit0 
    	//    Rdy/Busy  Compare     Density code      reserved 
    	//       1         0      1    1    0    1     0    0 
    	//      
    	
    	if (Status & 0x80) { 
        	//--- i store the lastpage value in eeprom area 
        	// so you must provide this data 
        	// 
        	
        	DTFFull = (DTFPageCnt == DTFNbrPage); 
        	DTFByteCnt = 0;  //--- First Word
         	DTFDumpPageCnt = 0; //--- Dump page Count
         	DTFDriverRun = TRUE; //--- DataFlash OK
    	}// End If 
    	else 
        	//--- DataFlash HS ? 
        	DTFDriverRun = FALSE; 
} 
//--------------------------------------------------------------------------- 
// Function : DTFWriteToFlash(int8 Data) 
// Input    : 
//      int8 Data      Data to flash 
// return   : 
//      void 
// 
// Modify   : 
//      Set the flag DTFFul if last page 
// 
// Note     : 
//      Automatique store to memory area with built-in-erase when the ram buffer 
// is full. Use double bufferring for fast operation 
// 
#separate 
void DTFWriteToFlash(int8 Data) 
{ 
   	if (!DTFDriverRun)  		 //--- Drivers RUN ? 
        	        	return; 
     	if (DTFFull)            		//--- DTF Full
        		return; 
     
    	while (!DTFIsReady()); 		//--- Wait Ready
    
    	DTFSelect();  			//--- Start Write Ram 
   
    	if (DTF_Buffer_2_Active)   		//--- Write To Buffer 1 ?  
        		spi_write(0x87); 
     
    	else      				//--- Write to Buffer 2
        		spi_write(0x84); 
    	spi_write(0x00); 		//--- 8 Don't care Bit 
    	spi_write(DTFByteCnt_H); 	//--- High Byte address 
     	spi_write(DTFByteCnt_L); 	//--- Low Byte address
     	spi_write(Data); 		//--- Write The Value
    	DTFUnSelect();		//--- UnSelect 
     	DTFByteCnt++; 		//--- Next Word Address In DataFlash
    
    	if (DTFByteCnt >= DTFPageSize) {  	//--- Last page Byte ?
         		DTFByteCnt = 0; 		//--- WriteRam Start Addresse
         		DTFRAMToPage(DTFPageCnt);//--- RAM To Memory page with builtin erase
        		DTFPageCnt++;  		//--- Next Page
        		erase_program_eeprom(DTFPageCntRomAddress); //--- Store the Last Page Value in PIC eeprom 
        		write_program_eeprom(DTFPageCntRomAddress,DTFPageCnt); 
         		if (DTFPageCnt >= DTFNbrPage) //--- Last Page ?
           			 DTFFull = TRUE; 
    	}// End IF 
} 
 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品影视av免费| 亚洲aⅴ怡春院| 在线观看欧美黄色| 青青青伊人色综合久久| 中文字幕欧美一| 日韩视频中午一区| 99精品黄色片免费大全| 久久精品国产亚洲高清剧情介绍| 亚洲免费伊人电影| 久久免费国产精品| 欧美日韩国产乱码电影| 成人高清av在线| 精品中文字幕一区二区| 亚洲午夜激情网页| 中文字幕一区二区三区乱码在线 | 精品视频1区2区3区| 国产麻豆成人精品| 日韩av一区二区三区四区| 国产精品高潮呻吟久久| 91精品国产综合久久久久久| av一区二区久久| 国产一区二区三区免费观看| 日产国产欧美视频一区精品| 国产成人自拍网| 日韩中文字幕不卡| 一区二区三区日韩精品| 国产精品网友自拍| 精品88久久久久88久久久| 欧美精品三级在线观看| 欧美少妇xxx| 色国产综合视频| 99精品久久只有精品| 成人精品亚洲人成在线| 国产精品一区二区不卡| 久久www免费人成看片高清| 奇米精品一区二区三区在线观看一 | 欧美性猛交xxxx黑人交| 91免费视频大全| www.日韩精品| 99久久精品久久久久久清纯| 不卡av在线免费观看| 成人免费毛片片v| 成人免费视频一区| jlzzjlzz国产精品久久| 成人激情图片网| 99久久夜色精品国产网站| 成人高清免费在线播放| 色综合久久九月婷婷色综合| 日本乱人伦aⅴ精品| 色婷婷综合在线| 欧美视频精品在线| 欧美一级国产精品| 欧美变态凌虐bdsm| 国产亚洲精品中文字幕| 欧美极品aⅴ影院| 亚洲天堂免费看| 亚洲影视资源网| 奇米一区二区三区| 国产成人午夜精品5599| 成人自拍视频在线| 色综合视频在线观看| 在线观看日产精品| 欧美一级理论片| 国产亚洲成aⅴ人片在线观看| 中文字幕一区二区三区在线观看 | 亚洲成人免费在线观看| 爽好久久久欧美精品| 久久国产日韩欧美精品| 国产成人午夜视频| 日本精品裸体写真集在线观看| 欧美日韩中文精品| 欧美v亚洲v综合ⅴ国产v| 欧美国产日韩亚洲一区| 亚洲久本草在线中文字幕| 丝袜美腿成人在线| 国产高清成人在线| 欧美三日本三级三级在线播放| 欧美一区二区人人喊爽| 国产午夜精品一区二区三区视频| 一区二区三区在线不卡| 免费久久99精品国产| 丁香婷婷综合激情五月色| 欧日韩精品视频| 欧美精品一区二区三区一线天视频 | 精品电影一区二区三区| ㊣最新国产の精品bt伙计久久| 亚洲国产色一区| 国产一二精品视频| 欧美无乱码久久久免费午夜一区| 精品久久久久一区| 一区二区三区成人| 国产综合色视频| 欧美日韩国产小视频| 国产三级精品视频| 日本免费新一区视频| av电影天堂一区二区在线| 91精品国产91久久久久久一区二区 | 欧美日韩精品欧美日韩精品一综合| 欧美精品一区二区三区高清aⅴ| 亚洲另类一区二区| 国产精品资源在线看| 欧美日韩在线播放一区| 国产精品剧情在线亚洲| 看片的网站亚洲| 91激情五月电影| 国产精品久久久久影院| 美女www一区二区| 欧洲av一区二区嗯嗯嗯啊| 中文字幕在线一区免费| 免费成人性网站| 欧美日韩成人一区| 亚洲三级在线观看| 国产91在线观看| 欧美成人性福生活免费看| 亚洲五月六月丁香激情| 色先锋资源久久综合| 亚洲欧洲av在线| 国产aⅴ精品一区二区三区色成熟| 日韩亚洲欧美成人一区| 亚洲一二三四在线| 91麻豆高清视频| 国产精品麻豆网站| 国产精品乡下勾搭老头1| 欧美一级片免费看| 天天影视涩香欲综合网| 91福利资源站| 亚洲精品国产一区二区精华液 | 欧美性xxxxxxxx| 亚洲欧美国产三级| 99精品在线观看视频| 国产色产综合色产在线视频| 国产美女娇喘av呻吟久久| 欧美成人aa大片| 国产真实乱偷精品视频免| 2欧美一区二区三区在线观看视频| 日本视频中文字幕一区二区三区| 欧美日韩在线不卡| 天堂蜜桃一区二区三区| 欧美放荡的少妇| 日韩精品1区2区3区| 91精品婷婷国产综合久久竹菊| 午夜欧美2019年伦理| 欧美一区二区久久| 美日韩黄色大片| 欧美tickling挠脚心丨vk| 久久国产综合精品| 久久久久久一级片| 国产成人精品影院| 中文字幕欧美日韩一区| 成人久久久精品乱码一区二区三区| 国产精品美女一区二区| 97aⅴ精品视频一二三区| 亚洲美女视频在线观看| 欧美日韩久久久一区| 天天色图综合网| 欧美变态tickling挠脚心| 国产美女av一区二区三区| 最近日韩中文字幕| 欧美午夜不卡视频| 蜜臀av一区二区| 亚洲国产精品成人综合色在线婷婷| 99国产麻豆精品| 五月天国产精品| 精品国产伦一区二区三区免费| 国产精品综合网| 亚洲欧美另类图片小说| 欧美精品丝袜中出| 国产精品乡下勾搭老头1| 亚洲免费看黄网站| 欧美日韩激情一区二区| 久久国内精品自在自线400部| 国产精品色在线观看| 一本色道久久综合亚洲91| 日韩电影免费在线观看网站| 精品国产免费久久| 色一情一乱一乱一91av| 麻豆精品久久精品色综合| 国产欧美一区二区精品性色超碰| av亚洲产国偷v产偷v自拍| 亚洲成人动漫av| 国产亚洲一区二区在线观看| 欧美主播一区二区三区| 国产精品一区不卡| 亚洲一卡二卡三卡四卡无卡久久| 久久这里只有精品首页| 色94色欧美sute亚洲线路一久| 美女视频一区二区| 中文字幕一区在线观看视频| 日韩欧美自拍偷拍| 99re热视频精品| 看电视剧不卡顿的网站| 亚洲欧美一区二区三区极速播放 | 中文在线一区二区| 欧美精品第一页| 国产69精品一区二区亚洲孕妇| 亚洲国产另类av| 国产婷婷色一区二区三区 | 欧美一区二区三区视频在线观看| 大胆亚洲人体视频| 五月开心婷婷久久|