//25LC320 EEPROM

#include <SPI.h>

// Chip Select pin on AVR
#define ROM 		PB2

// INSTRUCTION SET
#define READ		0b00000011	// Read data from memory array beginning at selected address
#define WRITE		0b00000010	// Write data to memory array beginning at selected address
#define WRDI		0b00000100	// Reset the write enable latch (disable write operations)
#define WREN		0b00000110	// Set the write enable latch (enable write operations)
#define RDSR		0b00000101	// Read Status register
#define WRSR		0b00000001	// Write Status register

// Read Status Register
#define WPEN		0b10000000	// Write-Protect Enable
#define BP0			0b00000100	// Block Protection0
#define BP1			0b00001000	// Block Protection1
// address 16bit max 2^12=4096*8bit 128*32byte


void ROMWR(unsigned char addrh, unsigned char addrl)
{
	/*CheckROMBusy();*/
	
	SPI_PORT &= ~(1<<ROM);
	SPIWR(WREN);
	SPI_PORT |= (1<<ROM);
	_delay_us(1);
	
	SPI_PORT &= ~(1<<ROM);
	SPIWR(WRITE);
	SPIWR(addrh);
	SPIWR(addrl);	
}
void ROMRD(unsigned char addrh, unsigned char addrl)
{
	//CheckROMBusy();
	SPI_PORT &= ~(1<<ROM);
	SPIWR(READ);
	SPIWR(addrh);
	SPIWR(addrl);
}
unsigned char ROMRDSR(void)
{
	SPI_PORT &= ~(1<<ROM);			// activate eeprom
	SPIWR(RDSR);					// 0b00000101
	SPDR = 0x00;					// dummy data
	while(!(SPSR & (1<<SPIF)));	// wait until transfer is completed
	_delay_us(1);					// extra delay
	SPI_PORT |= 1<<ROM;				// deacivate eeprom
	_delay_ms(5);
	return(SPDR);					// returning data from SPI register to variable
}
void ROMWRSR(unsigned char data)
{
	SPI_PORT &= ~(1<<ROM);
	SPIWR(WRSR);
	SPIWR(data);
	SPI_PORT |= 1<<ROM;
}
/*void CheckROMBusy(void)
{
	unsigned char datard;
	//unsigned char datacomp;
	//unsigned char datacomppre;
	
	datard = ROMRDSR();
	datacomp = (datard & 00000001);
	datacomppre = datacomp;
	
	while(datard >= 1)
	{
		datard = ROMRDSR();
		datacomppre = datacomp;
		datacomp = (datard & 00000001);
		_delay_us(1);
	}
}*/
void EEPROM_SPI_Init(void)
{
	SPI_DDR |= (1<<SCK)|(1<<MOSI)|(1<<CE)|(1<<CS0)|(1<<CS1)|(1<<CS2)|(1<<CS3);
	SPCR |= (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(1<<SPR0);
	SPCR &= ~(1<<DORD);
	SPSR |= (1<<SPI2X);
}

