📄 readflashid.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 + -