#include "eeprom.h"
char read(char addrh, char addrl)
{
//Set DDR's
DDRA(DATA_IN);
DDRB(DATA_OUT);
DDRC(DATA_OUT);
DDRD(DATA_OUT);
RB = addrh;
RC = addrl;
RD = 00001000b; //CE, OE, rest off
return RA;
}
void write(char data, char addrh, char addrl)
{
//long addr_dest@0x06;
//Set DDR's
DDRA(DATA_OUT);
DDRB(DATA_OUT);
DDRC(DATA_OUT);
DDRD(DATA_OUT);
// $5555 on addr
RB = 0x15;
RC = 0x55;
RD = 01011000b;
//$AA on data
RA = 0xAA;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$2AAA on addr
RB = 0x0A;
RC = 0xAA;
//RD = 10011000b;
asm clrb RD.6
asm setb RD.7
//$55 on data
RA = 0x55;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 01011000b;
asm clrb RD.7
asm setb RD.6
//$A0 on data
RA = 0xA0;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$addr on addr
//addr_dest = addr;
RB = addrh;
RC = addrl;
//RD = 00011000b;
asm clrb RD.6
//$data on data
RA = data;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//Should be programming, spin till done
//datasheet says up to 20us...
delay_us(20);
return;
}
void erase_chip(void)
{
//Set DDR's
DDRA(DATA_OUT);
DDRB(DATA_OUT);
DDRC(DATA_OUT);
DDRD(DATA_OUT);
//$5555 on addr
RB = 0x15;
RC = 0x55;
RD = 01011000b;
//$AA on data
RA = 0xAA;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$2AAA on addr
RB = 0x0A;
RC = 0xAA;
//RD = 10011000b;
asm clrb RD.6
asm setb RD.7
//$55 on data
RA = 0x55;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 01011000b;
asm clrb RD.7
asm setb RD.6
//$80 on data
RA = 0x80;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 10011000b;
asm setb RD.6
asm clrb RD.7
//$AA on data
RA = 0xAA;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$2AAA on addr
RB = 0x0A;
RC = 0xAA;
//RD = 10011000b;
asm clrb RD.6
asm setb RD.7
//$55 on data
RA = 0x55;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 01011000b;
asm clrb RD.7
asm setb RD.6
//$10 on data
RA = 0x10;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//Should be programming, spin till done
//datasheet says up to 100ms...
delay_ms(100);
return;
}
//Actual sector is sector*4
void erase_sector(char sector)
{
//Set DDR's
DDRA(DATA_OUT);
DDRB(DATA_OUT);
DDRC(DATA_OUT);
DDRD(DATA_OUT);
//$5555 on addr
RB = 0x15;
RC = 0x55;
RD = 01011000b;
//$AA on data
RA = 0xAA;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$2AAA on addr
RB = 0x0A;
RC = 0xAA;
//RD = 10011000b;
asm clrb RD.6
asm setb RD.7
//$55 on data
RA = 0x55;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 01011000b;
asm clrb RD.7
asm setb RD.6
//$80 on data
RA = 0x80;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$5555 on addr
RB = 0x15;
RC = 0x55;
//RD = 10011000b;
asm setb RD.6
asm clrb RD.7
//$AA on data
RA = 0xAA;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//$2AAA on addr
RB = 0x0A;
RC = 0xAA;
//RD = 10011000b;
asm clrb RD.6
asm setb RD.7
//$55 on data
RA = 0x55;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//sector = sector*4;
asm
{
rl param00_erase_sector
rl param00_erase_sector
}
RB = sector;
RC = 0;
asm clrb RD.7;
//$30 on data
RA = 0x30;
//pulse we#
//RD = 01010000b;
//RD = 01011000b;
asm clrb RD.3
asm setb RD.3
//Should be programming, spin till done
//datasheet says up to 25ms...
delay_ms(25);
return;
}