/*=====================================================================
File name	: SPISE2P.H                   
                    
Originator	: Settu Duraisamy
			  C2000 Applications Team
		      Texas Instruments

Description	:  
			  Header file containing  object definitions, proto type 
			  declaration and default object initializers for 
			  SPI Serial EEPROM driver using VSPI
			  
Date		: 30/6/2003 (DD/MM/YYYY)
=======================================================================*/

#ifndef __SPISE2P_H__

#define __SPISE2P_H__ 

//	Ёмкость памати в байтах
#define SEEPROM_LEN	0x10000

#define NULL	0    

#define SIXTEEN_BIT			15
#define EIGHT_BIT			07
 																
/***************************************************************/ 
/* Configurable Parameter for SPI bus Serial EEPROM	           */ 
/***************************************************************/
#define SPISE2P_DATA_WIDTH	SIXTEEN_BIT//EIGHT_BIT
#define SPISE2P_ADDR_WIDTH	SIXTEEN_BIT 
#define SPIBAUD_REG_VAL		1//12
#define SPICLK_PHASE		1			  
#define SPICLK_POLARITY		0   			

#define SPIBAUD_RATE		100000
//10000000

/**************************************************************/
/**************************************************************/
 
/* Serial EEPROM Command words, left justified				  */
#define SPISE2P_READ_CMD	0x0300
#define SPISE2P_WRITE_CMD	0x0200
#define SPISE2P_WRDI_CMD	0x0400
#define SPISE2P_WREN_CMD	0x0600
#define SPISE2P_RDSR_CMD	0x0500
#define SPISE2P_WRSR_CMD	0x0100

#define SPISE2P_RDID_CMD    0x0A00
 
#define SPISE2P_DUMMY_DATA	0x0000
#define SPISE2P_BUSY_MASK	0x01

/* Symbolic constant for SPICCR to transfer 8bit or 16 bit value*/
#define SPISE2P_TFR16BIT	0x80|(SPICLK_POLARITY<<6)|SIXTEEN_BIT
#define SPISE2P_TFR8BIT		0x80|(SPICLK_POLARITY<<6)|EIGHT_BIT
  
/* Status valus 												*/
#define SPISE2P_WRRQ		1		/* Write Requset			*/
#define SPISE2P_RDRQ		2		/* Read request				*/  
#define SPISE2P_WRIP		4       /* Write in progress		*/
#define SPISE2P_RDIP		8		/* Read in progress			*/ 

/* Message declaration											*/
typedef struct { 
		unsigned int *dataPtr;		/* Data pointer				*/
		unsigned long nrData;		/* number of data			*/
		unsigned long se2pAddr;		/* se2pAddr					*/
	  	}SE2P_DATA; 


/* Object declaration											*/
typedef struct { 
		SE2P_DATA *msgPtr;
		unsigned int csr;			/* control/status register	*/
		void (*init)(void *); 					
	  	void (*tick)(void *);
		void (*csset)(void); 					
	  	void (*csclr)(void);	  	 
	  	}SPISE2P_DRV; 
  	
#define SPISE2P_DRV_DEFAULTS { NULL,\
		0,\
		(void (*)(void *))SPISE2P_DRV_init,\
	    (void (*)(void *))SPISE2P_DRV_tick,\
	    (void (*)(void))SPISE2P_DRV_csset,\
	    (void (*)(void))SPISE2P_DRV_csclr}  
	    
typedef SPISE2P_DRV *SPISE2P_DRV_handle;

void SPISE2P_DRV_init(SPISE2P_DRV * ); 
void SPISE2P_DRV_tick(SPISE2P_DRV *);
void SPISE2P_DRV_csset(void); 
void SPISE2P_DRV_csclr(void);

unsigned int spiSe2pFree(SPISE2P_DRV *se2p);
void spiSe2pWrite(SPISE2P_DRV *se2p,  SE2P_DATA *data);
void spiSe2pRead(SPISE2P_DRV *se2p,  SE2P_DATA *data);

#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
	#define PROM_LEN 0x8000
	#define PAGE_LEN 0x20
	#define WORD_LEN 2
#else
	#define PROM_LEN 0x4000
	#define PAGE_LEN 0x40
	#define WORD_LEN 1
#endif

/*	Установка драйвера сериальной EEPROM.				**
**	Инициализациа SPI и проч. Также настройка таймера.	**
**	Драйвер работает на прерываниах от таймера 2!		*/
void Init_Seeprom(void);

/*	Запись блока в SEEPROM. Параметры таковы:			**
**	adres - адрес в епромке, куда писать.				**
**	adres = 0..0x8000, если длина слова 8 бит			**
**	adres = 0..0x4000, если длина слова 16 бит			**
**	buf - указатель на памать, откуда писать.			**
**	size - длина блока в байтах. По-любому в байтах!	*/
void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int size);

/*	Чтение блока из SEEPROM. Параметры таковы:			**
**	adres - адрес в епромке, откуда читать.				**
**	adres = 0..0x8000, если длина слова 8 бит			**
**	adres = 0..0x4000, если длина слова 16 бит			**
**	buf - указатель на памать, куда читать.				**
**	size - длина блока в байтах. По-любому в байтах!	*/
void Seeprom_read(unsigned int adres, unsigned int buf[], unsigned int size);

#endif
        
