/*
 * EERAM48L512.h
 *
 *  Created on: Dec 4, 2020
 *      Author: Ondra
 */

#ifndef INC_EERAM48L512_H_
#define INC_EERAM48L512_H_

#include "stm32f4xx_hal.h"
#include "main.h"

/*	Commands definition	*/
#define	WREN	0x06	//Write Enable
#define	WRDI	0x04	//Write Disable
#define	READ	0x03	//Read from memory
#define	WRITE	0x02	//Write to memory
#define	RDSR	0x05	//Read Status Register
#define	WRSR	0x01	//Write Status Register
#define	RDNUR	0xC3	//Read NV User Space
#define	WRNUR	0xC2	//Write NV User Space

/*	Other Definitions */
#define	MAXWAITTIME	10	//max. doba cekani na READY EERAM
#define	SPITIMEOUT	50	//max. timeout HAL ovladacu SPI
						//!!! pri praci s velkym objemem dat v jednom bloku nutne prodlouzit na max. delku operace

/*  Type definitions	*/
typedef struct{
	SPI_HandleTypeDef	hspi;		//parametry SPI portu
	GPIO_TypeDef*	 	gpioPort;	//gpio port pro CS
	uint16_t 			gpioPin;	//gpio pin pro CS
}spieeram_t;

typedef enum{
	EERAM_OK =0,
	EERAM_ERROR =1,
	DATA_NOT_MATCH=2,
}EERAM_Status;


/*  Functions */

void			EERAM_Init(spieeram_t* param, SPI_HandleTypeDef* hspi, GPIO_TypeDef* CSPort, uint16_t CSPin);	//inicializuje promene knihovny
EERAM_Status	EERAM_ReadStatus(spieeram_t* param, uint8_t* regVal);	//precte hodnotu Status registru pameti
EERAM_Status	EERAM_WriteStatus(spieeram_t* param, uint8_t regVal);	//zapise hodnotu Status registru pameti
EERAM_Status	EERAM_WriteEnable(spieeram_t* param);	//povoli zapis do pameti
EERAM_Status	EERAM_WriteDisable(spieeram_t* param);	//zakaze zapis do pameti
EERAM_Status	EERAM_ReadData(spieeram_t* param, uint8_t* buff, uint16_t adress, uint16_t bytes);
					//precte dany pocet byte od adresy do bufferu
EERAM_Status	EERAM_WriteData(spieeram_t* param, uint8_t* buff, uint16_t adress, uint16_t bytes);
					//zapise dany pocet byte od adresy z bufferu
EERAM_Status	EERAM_ReadUserArea(spieeram_t* param, uint8_t* buff);
					//precte 16byte z NV uzivatelske oblasti
EERAM_Status	EERAM_WriteUserArea(spieeram_t* param, uint8_t* buff);
					//zapise 16byte do NV uzivatelske oblasti
EERAM_Status	EERAM_FillArea(spieeram_t* param, uint8_t fill, uint16_t adress, uint16_t bytes);
					//vyplni dany pocet byte od adresy hodnotou fill
EERAM_Status	EERAM_VerifyData(spieeram_t* param, uint8_t* buff, uint16_t adress, uint16_t bytes);
					//zkontroluje dany pocet byte od adresy EERAM s bufferem bez zmeny bufferu

/*  Private Functions */

//static EERAM_Status	WaitToReady(spieeram_t* param);

#endif /* INC_EERAM48L512_H_ */
