EEPROM code for SX (eeprom.c)

SX interfacing with with a flash eeprom (2mbit currently...uses the JEDEC standard command sequences).




#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;

}




Copyright© 2003 Pavel Baranov.