
#define MEM_OE P2_0 
#define MEM_WE P2_1 
#define MEM_RY_BY P2_2 
#define MEM_RESET P2_3 
#define MEM_CE P2_4 
#define LATCH1 P2_5 
#define LATCH2 P2_6 
#define LATCH3 P2_7 
#define MDATA P0 

void hardware_rst(void) // takes flash into reading array mode 
{ 
MEM_CE = 1; 
MEM_OE = 1; 

MEM_RESET = 0; 
_asm 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
_endasm; 
MEM_RESET = 1; 
_asm 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
_endasm; 

while(!MEM_RY_BY); 
} 


// MEMORY FUNCTION T0 LATCH ADDRESS TO FLASH 
void latch_address(unsigned long address) 
{ 
unsigned char lda1,lda2,lda3; 

lda3 = (address & 0x00ff0000)>>16; 
lda2 = (address & 0x0000ff00)>>8; 
lda1 = address & 0x000000ff; 
LATCH1 = 0; 
LATCH2 = 0; 
LATCH3 = 0; 

MDATA = lda1; //lsb 

_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH1 = 1; 
_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH1 = 0; 

MDATA = lda2; 
_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH2 = 1; 
_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH2 = 0; 

MDATA = lda3; //msb 
_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH3 = 1; 
_asm 
nop 
nop 
nop 
nop 
_endasm; 
LATCH3 = 0; 
} 


//FUNCTION TO READ ARRAY DATA FROM FLASH 
unsigned char flash_read(unsigned long address) 
{ 
unsigned char datta; 

latch_address(address); 
P0 = 0xff; 
MEM_WE = 1; //WRITE ENABLE 
MEM_CE = 0; //CHIP ENABLE 
MEM_OE = 0; // OUTPUT ENABLE 
_asm 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
_endasm; 
datta = MDATA; 
MEM_OE = 1; 
MEM_CE = 1; 
return(datta); 

} 

void write_command(unsigned long address,unsigned char cmd) 
{ 

MEM_RESET = 1; 

latch_address(address); 
MEM_CE = 0; 
MEM_OE = 1; 
MEM_WE = 0; 
MDATA = cmd; 
_asm 
nop 
nop 
_endasm; 
MEM_WE = 1; 
MEM_CE = 1; 
} 

void flash_eraseall(void) 
{ 
//hardware_rst(); 

while(!MEM_RY_BY); 

write_command(0x00000555,0xAA); 
write_command(0x000002AA,0x55); 
write_command(0x00000555,0x80); 
write_command(0x00000555,0xAA); 
write_command(0x000002AA,0x55); 
write_command(0x00000555,0x10); 
while(MEM_RY_BY); 
while(!MEM_RY_BY); 


} 

void flash_write(unsigned long address,unsigned char dat) 
{ 
hardware_rst(); 
while(!MEM_RY_BY); 
write_command(0x00000555,0xAA); 
write_command(0x000002AA,0x55); 
write_command(0x00000555,0xA0); 
write_command(address,dat); 
while(MEM_RY_BY); 
while(!MEM_RY_BY); 
} 


void main(void) 
{ 

unsigned char j; 
unsigned int i; 

unsigned long mempointer; 

for(j=0;j<200;j++) // VCC setup time (>50us) for flash 
// memory (AM290F016D)-Tvcs 
{ 
_asm 
nop 
nop 
_endasm; 
} 



// Serial port configuration 
TH1 = 256 - ((FCLK / 384)/BAUD);//1200 baudrate 
TMOD = 0x20; //8 bit auto reload 
TR1 = 1; 
SCON = 0x50; //8bit UART set by TIMER1 for serial_0 

RI = 0; 

//Flash memory defaults for TTL standby state 
hardware_rst(); 
MEM_CE = 1; 
MEM_RESET = 1; 

TI = 0; 
SBUF = 'R'; 
while(!TI); 

flash_eraseall(); 
mempointer = 0x00000000; 

// ********flash write loop************* 
for(i=0;i<255;i++) //<<<<<<< problem is here<<<<< 
flash_write(mempointer++,i); 

TI = 0; 
SBUF = 'S'; 
while(!TI); 


while(1); 

} 

