⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readflashid.c

📁 读取GPS内存的ID号
💻 C
字号:
#include  <C8051F020.h>

#include  ".\include\hardio.h"
#include  ".\include\system.h"
#include  ".\include\isr.h"
#include  ".\include\main.h"
/*#include 	<C8051F020.h>
#include  	<string.h>
#include    <absacc.h>

#define uint unsigned int
#define uchar unsigned char
*/
code uchar *menu[]= 
{
     "博宇仪器",                          //---0
     "机 号:",                            //---1
     "正在连接...",                       //---2
     "连接失败,请检查",                   //---3
     "机号,FUNC重发,",                    //---4
     "ENTER设置机号!",                    //---5

     "卫 星",                             //---6
     "参 数",                             //---7
     "测 量",                             //---8
     "设 置",                             //---9

     "PDOP: ",                            //---10
     "可视卫星:   颗",                    //---11
     "锁定卫星:   颗",                    //---12
 
     "点  名:     ",                      //---13
     "天线高:      米",                   //---14
     "时段号:  ",                         //---15

     "经度:",                             //---16
     "纬度:",                             //---17
     "高程:       米",                    //---18
     "状态:正在记录",                     //---19
     
     "采样间隔:   秒",                    //---20
     "高 度 角:   度",                    //---21
     "卫星数>=:   颗",                    //---22
     "机号设置",                          //---23
     "提示:FUNC连接",                     //---24
     "ENTER输入新机号",                   //---25
 
     "点名输入",                          //---26
     "天线高输入",                        //---27
     "时段号输入",                        //---28
     "采样间隔输入",                      //---29
     "高度角输入",                        //---30
     "卫星数输入",                        //---31
     "机号输入",                          //---32
	 "出错重新输入",                      //---33
	 "结 束",                             //---34
	 "结束采集",                          //---35
	 "关主机",                             //---36
	 "提示:输入天线高"                     //---37
};

typedef union DOUBLE_TO_LONG
{
    uchar  cBytes[8] ;
	unsigned long  ulValue ;
} DoubleToLong ;


typedef union DOUBLE_TO_FLOAT
{
    uchar  cBytes[8] ;
	float  fValue ;
} DoubleToFloat ;


typedef union BYTE_TO_FLOAT
{
	unsigned char  cBytes[4] ;
			float  fValue ;
} ByteToFloat;

typedef union BYTE_TO_LONG
{
	unsigned char  cBytes[4] ;
	unsigned long  ulValue ;
} ByteToLong;

//CMC functions

extern  void  ConvertToFloat( DoubleToFloat  xdata *  dfPtr ) ;
extern  void  SendCmcCommand( uchar ID,  bit mode ) ;
extern  void  AddCommand( uchar ID ) ;
extern  void  DelCommand( void ) ;
extern  void  InitCommandQueue( void ) ;
extern  void  GetBLH( uchar  cptr ) ;
extern  void  GetSatInfo( uchar cptr ) ;
extern  void  GetGpsInfo( void ) ;
extern  void  ProcessCMCData( void ) ;

sbit   MALE 	 = P2^3 ;
sbit   MCLE 	 = P2^2 ;
sbit   RNB 		 = P2^4 ;
sbit   MSE 		 = P2^1 ;
sbit   MWP       = P2^0 ;
sbit   LED_03    =P1^4;
//sbit   MRE       =P4^6;
//sbit   MWE		 =P4^7;

uint ID1;
uint id;
uchar idata cpInBuffer, cpOutBuffer, tcpOutBuffer ;

uchar xdata databuf[1000];
#define   	FlashIO   	  XBYTE[0xBFFF]		//The Address to access the external Flash
//uint xdata   	MaxFlashBlocks=0;
typedef union INT_TO_BYTE
{
	struct {
		uchar  hByte;
		uchar  lByte;
	} Bytes;
	int  uValue;
} IntToByte ;




bit    bdata    ComBufTxEmpty, CmcBufTxEmpty, CommandFull, CmcDataFull ;
uchar  idata    TimeClick, DataCheckSum, RFTimeClk  ;


void InitMcuSystem( void )
{
    EMI0CF = 0x24;   	// External Memory Configuration Register *********
	EMI0CN = 0xFF ;

 	XBR0=0x24;    //CEX0,1,2,3
	XBR1=0X14;
	XBR2=0x44;

	P0MDOUT=0xE5;	
	P1MDIN=0xFF;
	P1MDOUT=0xFC;
	P2MDOUT=0x6F;
	P3MDOUT=0xFF; 		//Output Mode
	P74OUT=0xF2;	

	P4 = 0xFF ;
	P5 = 0xFF ;			// Input Mode

	IE	 = 0x12;        //Interrupt Enable
	IP	 = 0x00;        //Interrupt Priority
//	EIE1 = 0x08;        //Extended Interrupt Enable 1
	EIE2 = 0x00;        //Extended Interrupt Enable 2
	EIP1 = 0x00;        //Extended Interrupt Priority 1
	EIP2 = 0x00;        //Extended Interrupt Priority 2
	
	EX1 = 1 ;
	IT1 = 1 ;			//EXT1 Interrupt, High to Low eage Trige
	EMI0TC = 0xDF;		//Interface Timing 

    WDTCN  = 0xDE;       // Disable watchdog timer
    WDTCN  = 0xAD;  

	P6 = 0xFF ;			//Address High Port
	EA=1;
}

void WriteCommand2Flash(uchar  command)
{
	MALE=0;
	MCLE=1;
	FlashIO=command;
	MCLE=0;
}

/*void WriteAddress2Flash(uchar  address)
{
	MALE=1;
	FlashIO=address;
	MALE=0;
}*/

/*void WriteData2Flash(uchar  Data)
{
FlashIO=Data;
}*/
/*uchar read1bytefromflash(void)
{	
	uchar xdata ubyte;
	ubyte=FlashIO;
	return ubyte;
}*/
/*uint  readflashid(void)
{

//uint id;
	P6=P6&0xBF;

	MCLE=1;

	P4=P4&0x7F;
	P7=0x90;
	P4=P4|0x80;
	MCLE=0;
	MALE=1;
	P4=P4&0x7F;
	P7=0x00;
	P4=P4|0x80;
	MALE=0;

	P4=P4&0xBF;
id=FlashIO;

	P4=P4|0x40;
id=id<<8;
	P4=P4&0xBF;
id+=FlashIO ;
	P4=P4|0x40;

return id;
}*/
/*uint  readflashid1(void)
{

uint xdata idd;
	P6=P6&0xBF;

	MCLE=1;

//	P4=P4&0x7F;
	FlashIO=0x90;
//	P4=P4|0x80;
	MCLE=0;
	MALE=1;
	//P4=P4&0x7F;
	FlashIO=0x00;
	//P4=P4|0x80;
	MALE=0;

//	P4=P4&0xBF;
idd=FlashIO;

//	P4=P4|0x40;
idd=idd<<8;
//	P4=P4&0xBF;
idd+=FlashIO ;
//	P4=P4|0x40;

return idd;
}*/
/*uint  readflashid(void)//OK
{
	P6=P6&0xBF;
	WriteCommand2Flash(0x90);
	WriteAddress2Flash(0x00);
	id=read1bytefromflash();
	id<<=8;
	id+=read1bytefromflash();
	P6=P6|0x40;
	return id;
}*/


/*void ReadFlashPage(uint pagenum, uchar *databuf,uint datalen )
{
	uint i;
	P6=P6&0xBF;
	WriteCommand2Flash(0x00);
	WriteAddress2Flash(0x01);
	WriteAddress2Flash((uchar)(pagenum&0x00ff));
	WriteAddress2Flash((uchar)(pagenum>>8));
	for(i=0;i<datalen;i++)
	{
		databuf[i]=read1bytefromflash();
	}
	P6=P6|0x40;
//	return id;
}	*/


void SetFlashPointer(char area)
{
//	MCLE=1;
	MALE=0;
	if((--area)==0)//B area
	{
		WriteCommand2Flash(0x01);	
		MSE=1;//sequential read excluding mode C area
	}
	else if((--area)==0)
	{
		WriteCommand2Flash(0x50);//C area
		MSE=0;//sequential read mode including C area
	}
	else if((area+2)==0)
	{
		WriteCommand2Flash(0x00);//A area
		MSE=1;//sequential read mode excluding C area
	}
//	MCLE=0;
}

/*void SetFlashPointer( char Area ) 
{
	MCLE=1;
	MALE=0;
	Area--;
	if(Area==0)
		FlashIO=0x01;
	else 
	Area--;
	if(Area==0)
		FlashIO=0x50;
	else
	Area+=2;
	if(Area!=0)
		return;
	else
		FlashIO=0;
	MSE=1;
	MCLE=0;
	return;
}

*/

/*char ProgrammFlashPage(void)
{
	MALE=0;
//	MCLE=1;
	WriteCommand2Flash(cpInBuffer);	
	while(RNB==0);
	WriteCommand2Flash(0x70);	
//加读状态子程
	while(P7&0x40);//加读状态子程
	if(P7&0x01)
	return 1;
else
return 2;
}*/
char   ProgrammFlashPage( );
void   ReadFlashPage( int iCounter );
 char   SetFlashAddress( char cColumn, uint iRow, char Area, bit WMode ) ;
/*SetFlashPointer( char Area ) ;
extern char   SetFlashAddress( char cColumn, uint iRow, char Area, bit WMode ) ;
extern void   ReadFlashPage( int iCounter );
extern char   FlashPageProgramm( void );
extern char   EraseFlashBlock( uint iBlock ) ;
extern char   ReadFlashID( void ) ;
extern void	  ResetFlashMem( void ) ;
extern void   ReadOneBlock( uint uBlock ) ;
extern void   MaskInvalidBlock( void ) ;*/
#define FlashA 0x00
void   ReadOneBlock( uint uBlock )//OK
{ 
	uint xdata uRow; 
	uchar bRow;
	uBlock<<=5;//one block has 32 pages
	uRow=uBlock;
	SetFlashAddress(0,uRow,FlashA,0);
	bRow=0;
	do
	{
		uBlock=0x200;//one page has 512 bytes 
		ReadFlashPage(uBlock);
		bRow++;
	}
	while(bRow<32);
}
/*void   MaskInvalidBlock( void )
{
	uchar cByte;
	uchar Flag;
	uint  uRows,uBlocks=1;
	Flag=0;
	if(MaxFlashBlocks>uBlocks)
	{	
		do
		{
			uRows=uBlocks<<5;
			SetFlashAddress(5,uRows,2,0);
			cByte=FlashIO;
			if(~cByte==0)
			{
				uRows++;
				if(uRows!=0)
				SetFlashAddress(5,uRows,2,0);
				cByte=FlashIO;	
				if(~cByte==0)
					Flag=0;
				else
					Flag=1;				
			}
			else
			{
				Flag=1;
			}
			uBlocks++;
		}		
		while(uBlocks!=0);	
	}	
}*/

void   MaskInvalidBlock( void )
{
	uchar cByte;
	uchar Flag;
	uint  uRows,uBlocks=1;
	Flag=0;
	do
	{
		if(MaxFlashBlocks>uBlocks)
		{	
			uRows=(uBlocks<<5);
			SetFlashAddress(5,uRows,2,0);
			cByte=FlashIO;
			if(~cByte==0)
			{
				uRows++;
				SetFlashAddress(5,uRows,2,0);
				cByte=FlashIO;	
				if(~cByte==0)
					Flag=0;
				else
					Flag=1;				
			}
			else
			{
				Flag=1;
			}
			if(Flag!=0)
			{
				Flag=0;
				uRows=(uBlocks<<5);
				SetFlashAddress(5,uRows,2,0);
				cByte=FlashIO;
				if(cByte!=0x00)
				{
					SetFlashAddress(5,uRows,2,1);
					FlashIO=0x00;
					ProgrammFlashPage();
				}
			}	
			uBlocks++;
		}
		else 
			return;		

	}
	while(MaxFlashBlocks>uBlocks);		
}

char   EraseFlashBlock( uint iBlock ) //OK
{	
	uchar ReturnCode;
//	uint uBlock;
 	IntToByte iTob ;
	iTob.uValue=iBlock<<5;
	MALE=0;
	MCLE=1;
	FlashIO=0x60;
	MCLE=0;
	MALE=1;
	FlashIO=iTob.Bytes.lByte;
	FlashIO=iTob.Bytes.hByte;
	MALE=0;
	MCLE=1;
	FlashIO=0xD0;
	MCLE=0;
	while(RNB==0);
	MCLE=1;
	FlashIO=0x70;
	MCLE=0;
	do
	{ReturnCode=FlashIO;}
	while((ReturnCode&0x40)==0);
	if((ReturnCode&0x01)==0)	
		return 1;
	else
		return 0;
}

/*=============Program  Description=============*/
/* Program Name: ReadFlashPage.c				*/
/* Program Function: Read and send to serial	*/
/* Device:AT240160BFIEB							*/
/* Written by zdy.  2003.11.16(BOYU)			*/
/* Modified by  								*/
/*==============================================*/
void   ReadFlashPage( int iCounter )//OK
{
	int iNum=0;
	uchar byte;
	do
	{
	byte=FlashIO;
	SendByteToBuf(byte);
	iNum++;
	}
	while(iNum<iCounter);
}
	


void ResetFlash(void)//OK
{

	MALE=0;
	MCLE=1;
	FlashIO=0xFF;
	MCLE=0;
	while(RNB==0);
}

char   ReadFlashID( void ) //OK
{
	uchar byte1,byte2;
	MALE=0;
	MCLE=1;
	FlashIO=0x90;	//read ID command
	MCLE=0;
	MALE=1;
	FlashIO=0x00;	//address
	MALE=0;
	byte1=FlashIO; //manufacture code 
	byte2=FlashIO; // device code
	if(byte1!=0xEC)
		return 0;
	if(byte2==0x73) // K9F2808
		MaxFlashBlocks=4;
	else if(byte2==0x75)//K9F5608
		MaxFlashBlocks=8;
	else
		MaxFlashBlocks=0;				
	MaxFlashBlocks<<=8;
	return 1;
}



char   ProgrammFlashPage( void )//OK
{
	uchar bstatus=0;
	MALE=0;
	MCLE=1;
	FlashIO=0x10;	
	MCLE=0;
	while(RNB==0);
	MCLE=1;
	FlashIO=0x70;
	MCLE=0;
	do
	{bstatus=FlashIO;}
	while((bstatus&0x40)==0);
	if((bstatus&0x01)==0)		
		return 1;
	else
		return 0;
}
	

char   SetFlashAddress( char cColumn, uint iRow, char Area, bit WMode )//OK
{
	uchar bstatus=0;
 	IntToByte iTob ;
	SetFlashPointer(Area);
	if(WMode==1)//programm flash page
	{
		MCLE=1;
		MALE=0;
		FlashIO=0x80;
		MCLE=0;
	}
	MALE=1;
	P6=0xBF;
	FlashIO=cColumn;//column address
	iTob.uValue=iRow;
	FlashIO = iTob.Bytes.lByte ;//page address
	FlashIO = iTob.Bytes.hByte ;//page address
	if(WMode==0)// read flash
	{
		P6=0xBF;
		MALE=0;
		while(RNB==0);
		MCLE=1;
		FlashIO=0x70;	//read status
		MCLE=0;

		//bstatus=FlashIO;
		/*while((bstatus&0x40)==0)
		{
			bstatus=FlashIO;	
		}*/
		do
		{bstatus=FlashIO;}
		while((bstatus&0x40)==0);//if busy,read again
		if((bstatus&0x01)==0)	// if programm error ,return 0
		{
			SetFlashPointer(Area);
			MALE=0;
			return 1;
		}
		else
			return 0;
	}
	else
	{
		MALE=0;
		return 1;
	}

}

void SysClkInit (void)
{
  register uchar  iN;            

	OSCXCN = 0x66;                      // start external oscillator with
	                                    // 3.6864MHz crystal
	for (iN=0; iN < 254; iN++) ;        // XTLVLD blanking interval (>1ms)
	while (!(OSCXCN & 0x80) ) ;         // Wait for crystal osc. to settle
	OSCICN = 0x88;                      // select external oscillator as SYSCLK
}

extern void  ClearRam(uchar Layer);
extern  void ResponseCommand(void);
extern bit SynchObservation(uchar cPtr);
extern void  Rst_Lcd(void);
extern void  Lcd_Init(void);
extern void delay(uint num);
uchar  xdata   	bSerialBuffer[256];
#define     LcdCommandIO   XBYTE[0XDFFF]
#define     LcdDataIO   XBYTE[0XDEFF]
extern void Circle(char cirx,char ciry,uchar r);
extern void x_line(uchar x,uchar y,uchar state,uchar length);
extern void y_line(uchar x,uchar y,uchar state,uchar high);
extern void rectangle(uchar x,uchar y,uchar state,uchar length,uchar high);
extern void  Point(uchar x,uchar y,uchar bflag);
extern void  outhz12(uchar x,uchar y, char *str);
extern void  SetDisplay(uchar mode);
extern void  outhz121(uchar x,uchar y, char *str);
extern void Block(uchar x,uchar y,uchar state,uchar length,uchar high);
extern void ResponseCommand(void);
extern void ReadFilePage(void);
extern void  CreateRecordFile( uchar dLen );
void main()
{
uchar cha[2]="深";
//uint datalen=10;
DoubleToFloat xdata dtof2; 
dtof2.cBytes[1]=0x34;
dtof2.cBytes[2]=0x44;
dtof2.cBytes[5]=0x66;
dtof2.cBytes[3]=0x64;
dtof2.cBytes[4]=0x78;
dtof2.cBytes[6]=0x44;
dtof2.cBytes[7]=0x45;
dtof2.cBytes[0]=0x23;
//Lcd_Init();
//ClearRam1(0);
//ClearRam(0);
//ClearRam1(1);
//ClearRam(1);
//ClearRam1(2);
//ClearRam(2);
//	ConvertToFloat( &dtof2 ) ;
//ResponseCommand();
//SynchObservation(65);

	//SysClkInit();	
CreateRecordFile( 44 );
ReadFilePage();
InitMcuSystem( );
MSE = 0 ;    	MWP = 1 ;
	MALE = 0 ;      MCLE = 0 ;			
	RNB = 1;
	Point(3,5,8);
Rst_Lcd();
Lcd_Init();
ClearRam(0);
ClearRam(1);
ClearRam(2);
	LcdCommandIO=0x59;
LcdDataIO=0x54;
  rectangle(150,5,8,76,138); 
  x_line(48,23,0x00,180);
  x_line(48,33,0x00,190);
  x_line(48,43,0x04,160);
  x_line(48,53,0x08,170);
y_line(138,13,0,20);
y_line(128,33,0x04,20);
y_line(143,43,0x08,20);
Block(56,70,0,50,12);
outhz121(36,20,"深圳博宇仪");
  outhz12(56,70,menu[0]);
  Circle(70,70,12,60);
rectangle(4,4,00,39,48);
ClearRam(0);
ClearRam(1);
ClearRam(2);
//SetDisplay(0);
ResponseCommand();
while(1)
{uchar cByte;

	ResetFlash();
//	ID1=readflashid();
ProcessCMCData( );
if(cByte==1)
EraseFlashBlock( 0x00 );
ReadFlashID( );
SetFlashAddress( 5,0x40,0,1);
FlashIO=0x00;
FlashIO=0x10;
FlashIO=0x11;
FlashIO=0x15;
ProgrammFlashPage( );
SetFlashAddress( 5,0x40,0,0);
cByte=FlashIO;
cByte=FlashIO;
cByte=FlashIO;
cByte=FlashIO;
//EraseFlashBlock( 2 );
ReadFlashID( );
MaskInvalidBlock( );
MaskInvalidBlock();
ReadOneBlock( 2);
ReadFlashPage(343);
SetFlashAddress( 4,244,2,0);
SetFlashAddress( 5,244,0,1);
ProgrammFlashPage( );

}

}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -