?? extflash.c
字號:
//----------------------------------------------------////-------Institute Of Computing Technology-----------////------------Chinese Academic Science---------------////-----中國科學院計算技術研究所先進測試技術實驗室-----////----------------------------------------------------///** * @copyright:nbicc_lpp * @this is this is extflash support code * @author * zhouqiang (zhouhongren@163.com) * * @data:2005.12.29 * @version:0.0.1 * @updata:$ * */#include "extflash.h"//--------------------------------//FLASH_IN--so//FLASH_OUT--si//FLASH_CLK--sck//FLASH_SELECT----cs//-------------------------------- //OS_SET_FLASH_SELECT_PIN();inline void extflash_ini(void){ OS_MAKE_FLASH_SELECT_OUTPUT(); OS_MAKE_FLASH_OUT_OUTPUT(); OS_MAKE_FLASH_IN_INPUT(); OS_MAKE_FLASH_CLK_OUTPUT(); OS_SET_FLASH_SELECT_PIN(); flash_busy=0; /*another method //---------------------------- //initial uart1 to syn model //---------------------------- UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x03; UCSR1C = 0x41; UBRR1L = 0x22; //set baud rate lo UBRR1H = 0x00; //set baud rate hi UCSR1B = 0x18; //115200 //---------------------------- */}inline static void sendonebyte(uint8_t byte){ uint8_t tempbyte; tempbyte=byte; { os_atomic_t _nesc_atomic = os_atomic_start(); { for (int i=0;i<8;i++) { OS_CLR_FLASH_CLK_PIN(); if (tempbyte&0x80) { PORTD|=_BV(PIND3); } else { PORTD&=~_BV(PIND3); } //printf("\nPD is %02x\n",PORTD); OS_SET_FLASH_CLK_PIN(); tempbyte<<=1; } } os_atomic_end(_nesc_atomic); }}inline static uint8_t readonebyte(void){ uint8_t tempbyte=0; { os_atomic_t _nesc_atomic = os_atomic_start(); { for (int i=0;i<7;i++) { OS_CLR_FLASH_CLK_PIN(); OS_SET_FLASH_CLK_PIN(); //printf("\nPD is %02x\n",PIND); if (PIND&_BV(PIND2)) tempbyte|=0x01; else tempbyte&=0xfe; //OS_CLR_FLASH_CLK_PIN(); tempbyte<<=1; } OS_CLR_FLASH_CLK_PIN(); OS_SET_FLASH_CLK_PIN(); //printf("\nPD is %02x\n",PIND); if (PIND&_BV(PIND2)) tempbyte|=0x01; else tempbyte&=0xfe; //OS_CLR_FLASH_CLK_PIN(); //printf("\ntempbyte is %02x\n",tempbyte); } os_atomic_end(_nesc_atomic); } return tempbyte; }void Continuous_Array_Read(uint16_t address,uint16_t page,uint8_t * buffer,uint16_t numbers){ extflash_head temphead; uint8_t * tempbuffer; tempbuffer=buffer; uint16_t tempnumbers; tempnumbers=numbers; temphead._extflash_head.opcode=Continuou_Array_Read; temphead._extflash_head.page=page&0x07ff; temphead._extflash_head.block_byte=address&0x01ff; //OS_CLR_FLASH_CLK_PIN(); OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); //------------------------------------ sendonebyte(0x00); sendonebyte(0x00); sendonebyte(0x00); sendonebyte(0x00); //------------------------------------ for (uint16_t i=0;i<tempnumbers;i++) { tempbuffer[i]=readonebyte(); } OS_SET_FLASH_SELECT_PIN(); }void Main_Memory_PageRead(uint16_t page,uint16_t address,uint8_t * buffer,uint16_t numbers){ extflash_head temphead; uint8_t * tempbuffer=buffer; uint16_t tempnumbers; tempnumbers=numbers; temphead._extflash_head.opcode=Main_Memory_Page_Read; temphead._extflash_head.page=page&0x07ff; temphead._extflash_head.block_byte=address&0x01ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); //for (int i=0;i<4;i++) // printf("\nsend %02x\n",temphead.v[i]); sendonebyte(0x00); sendonebyte(0x00); sendonebyte(0x00); sendonebyte(0x00); //------------------------------------ for (uint16_t i=0;i<tempnumbers;i++) { tempbuffer[i]=readonebyte(); } OS_SET_FLASH_SELECT_PIN();}void Buffer_Read(uint8_t buffernum,uint16_t address,uint16_t numbers,uint8_t* buffer)//use buffer1_read or buffer2_read{ extflash_head temphead; uint8_t * tempbuffer=buffer; temphead._extflash_head.opcode=buffernum; temphead._extflash_head.page=0x0000; temphead._extflash_head.block_byte=address&0x01ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); //for (int i=0;i<4;i++) // printf("\nsend %02x\n",temphead.v[i]); sendonebyte(0x00); for (int i=0;i<numbers;i++) { tempbuffer[i]=readonebyte(); } OS_SET_FLASH_SELECT_PIN();}uint8_t Status_Register_Get(void){ extflash_head temphead; uint8_t state=0; temphead._extflash_head.opcode=Status_Register_Read; temphead._extflash_head.page=0x0000; temphead._extflash_head.block_byte=0x0000; { os_atomic_t _nesc_atomic = os_atomic_start(); { OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); state=readonebyte(); OS_SET_FLASH_SELECT_PIN(); } os_atomic_end(_nesc_atomic); } return state;}void Buffer_Write(uint8_t buffernum,uint16_t address,uint16_t numbers,uint8_t* buffer )//use buffer1_write or buffer2_write{ extflash_head temphead; uint8_t * tempbuffer=buffer; uint16_t tempnumbers=numbers; temphead._extflash_head.opcode=buffernum; temphead._extflash_head.page=0x0000; temphead._extflash_head.block_byte=address&0x01ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); //for (int i=0;i<4;i++) // printf("\nsend %02x\n",temphead.v[i]); //printf("\nbegin write to buffer\n"); for (int i=0;i<tempnumbers;i++) { sendonebyte(tempbuffer[i]); } OS_SET_FLASH_SELECT_PIN();}void Buffer_To_Main_Erase(uint8_t buffernum,uint16_t page){ extflash_head temphead; temphead._extflash_head.opcode=buffernum; temphead._extflash_head.block_byte=0x0000; temphead._extflash_head.page=page&0x07ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); //for (int i=0;i<4;i++) // printf("\nsend %02x\n",temphead.v[i]); //printf("\nbegin write to buffer\n"); OS_SET_FLASH_SELECT_PIN();}void Buffer_To_Main_noErase(uint8_t buffernum,uint16_t page)//不推薦使用,使用前需要先pageerase{ extflash_head temphead; temphead._extflash_head.opcode=buffernum;//use Buffer1_Main_noErase or Buffer2_Main_noErase temphead._extflash_head.block_byte=0x0000; temphead._extflash_head.page=page&0x07ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); OS_SET_FLASH_SELECT_PIN();}void PageErase(uint16_t page){ extflash_head temphead; temphead._extflash_head.opcode=Page_Erase; temphead._extflash_head.block_byte=0x0000; temphead._extflash_head.page=page&0x07ff; //OS_CLR_FLASH_CLK_PIN(); OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); OS_SET_FLASH_SELECT_PIN();}void Memory_Pageprogram_throuth_Buffer(uint8_t buffernum,uint16_t page,uint16_t address,uint16_t numbers,uint8_t * buffer){ extflash_head temphead; uint16_t tempnumbers=numbers; uint8_t *tempbuffer=buffer; temphead._extflash_head.opcode=buffernum; temphead._extflash_head.block_byte=address&0x01ff; temphead._extflash_head.page=page&0x07ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); for (int i=0;i<tempnumbers;i++) { sendonebyte(tempbuffer[i]); } OS_SET_FLASH_SELECT_PIN();}//-----------------------------------------------------------------------------------////-----------Adiitional_Commands函數完成三個功能://-----------1.main memory page to buffer transfer//-----------2.main memory page to buffer compare//-----------3.auto page rewrite//-----------commandtype list://-------------------------1.Auto_Page_Rewrite_Buffer1 or Auto_Page_Rewrite_Buffer2//-------------------------2.Main_Pageto_Buffer1_compare or Main_Pageto_Buffer2_compare//-------------------------3.Main_Pageto_Buffer1 or Main_Pageto_Buffer2//-----------------------------------------------------------------------------------//void Adiitional_Commands(uint8_t commandtype,uint16_t page){ extflash_head temphead; temphead._extflash_head.opcode=commandtype; temphead._extflash_head.block_byte=0x0000; temphead._extflash_head.page=page&0x07ff; OS_CLR_FLASH_SELECT_PIN();//選通flash sendonebyte(temphead.v[3]); sendonebyte(temphead.v[2]); sendonebyte(temphead.v[1]); sendonebyte(temphead.v[0]); OS_SET_FLASH_SELECT_PIN();}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -