
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
//-------------------------------------------------------//
// Project Code : V2H6K01-23-ENEMAN
// File Name : EepromLib.cpp
// Created on : 2023. 10. 31.
// Description : EEPROM Library for CAT25512VI-GT3
// Author : "Kim JeongWoo"
// Last modified Date :
//-------------------------------------------------------//
#include "CommonLib.h"
unsigned int EepromAddr = 0x0000;
unsigned int EepromNumofBytes = 100;
//나중에 DMA로 처리 할 것!!!!
//FIFO 적용할 것!!!!!!!!
//지금은 임시!!!!!!!!!!
//코드 컨벤션 및 변수 네이밍 나중에 수정 할 것!!!!!!!!
// SPI EEPROM status
#define MSG_STATUS_READY_M 0x0000 // EEPROM is ready (not busy)
#define MSG_STATUS_WRITE_READY_M 0x0002 // EEPROM
#define MSG_STATUS_BUSY 0xFFFF // EEPROM is busy (internal write)
// Opcodes for the EEPROM (8-bit)
//#define RDSR 0x0500
//#define READ 0x0300
//#define WRITE 0x0200
//#define WREN 0x0600
//#define WRDI 0x0400
//#define WRSR 0x0100
#define RDSR 0x0500 //Read status
#define READ 0x0300 //Read from Memory Array
#define WRITE 0x0200 //Write from Memory Array
#define WREN 0x0600 //Write enable
#define WRDI 0x0400 //Write Disable
#define WRSR 0x0100 //Write status
//
// Defines for Chip Select toggle.
//
#define CS_LOW GPIO_writePin(103, 0)
#define CS_HIGH GPIO_writePin(103, 1)
int FlagReadEeprom = 0;
int FlagWriteEeprom = 0;
//
// Function Prototypes
//
uint16_t ReadEepromStatusReg(void);
void writeData(uint16_t address, uint16_t * data, uint16_t length);
void readData(uint16_t address, uint16_t * data, uint16_t length);
void enableWrite(void);
union FLOAT32_BYTE
{
float wd32;
struct
{
unsigned byte0 :8;
unsigned byte1 :8;
unsigned byte2 :8;
unsigned byte3 :8;
}wdcode;
};
union INT16_BYTE
{
unsigned int wd16;
struct
{
unsigned byte0 :8;
unsigned byte1 :8;
}wdcode;
};
union FLOAT32_BYTE FloatWrBuf;
union FLOAT32_BYTE FloatRdBuf;
union INT16_BYTE IntWrBuf;
union INT16_BYTE IntRdBuf;
uint16_t EepromWrBuf[4] = {0,};
uint16_t EepromRdBuf[4] = {0,};
void InitSpi()
{
GPIO_setMasterCore(100, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_100_SPISIMOC);
GPIO_setDirectionMode(100, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(100, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(100, GPIO_QUAL_ASYNC);
GPIO_setMasterCore(101, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_101_SPISOMIC);
GPIO_setDirectionMode(101, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(101, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(101, GPIO_QUAL_ASYNC);
GPIO_setMasterCore(102, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_102_SPICLKC);
GPIO_setDirectionMode(102, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(102, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(102, GPIO_QUAL_ASYNC);
GPIO_setMasterCore(103, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_103_GPIO103);
GPIO_setDirectionMode(103, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(103, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(103, GPIO_QUAL_ASYNC);
SPI_disableModule(SPIC_BASE);
SPI_setConfig(SPIC_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1, SPI_MODE_MASTER_OD, 1500000, 8);
SPI_enableTalk(SPIC_BASE);
SPI_enableModule(SPIC_BASE);
}
void ReadEeprom(uint16_t address, uint16_t *data, uint16_t length)
{
while(ReadEepromStatusReg() & MSG_STATUS_READY_M == MSG_STATUS_READY_M);
readData(address, data, length);
}
float ReadEepromFloat(uint16_t address, float *Val)
{
ReadEeprom(address * 4, EepromRdBuf, 4);
FloatRdBuf.wdcode.byte0 = EepromRdBuf[0];
FloatRdBuf.wdcode.byte1 = EepromRdBuf[1];
FloatRdBuf.wdcode.byte2 = EepromRdBuf[2];
FloatRdBuf.wdcode.byte3 = EepromRdBuf[3];
*(float *)Val = FloatRdBuf.wd32;
return FloatRdBuf.wd32;
}
int ReadEepromInt(uint16_t address, void *Val)
{
ReadEeprom(address * 4, EepromRdBuf, 4);
IntRdBuf.wdcode.byte0 = EepromRdBuf[0];
IntRdBuf.wdcode.byte1 = EepromRdBuf[1];
//FloatRdBuf.wdcode.byte2 = EEPROM_RdBuf[2];
//FloatRdBuf.wdcode.byte3 = EEPROM_RdBuf[3];
*(int *)Val = IntRdBuf.wd16;
return IntRdBuf.wd16;
}
void WriteEepromFloat(uint16_t Address, float *Val)
{
FloatWrBuf.wd32 = *(float *)Val;
EepromWrBuf[0] = FloatWrBuf.wdcode.byte0;
EepromWrBuf[1] = FloatWrBuf.wdcode.byte1;
EepromWrBuf[2] = FloatWrBuf.wdcode.byte2;
EepromWrBuf[3] = FloatWrBuf.wdcode.byte3;
WriteEeprom(Address * 4, EepromWrBuf, 4);
}
void WriteEepromInt(uint16_t Address, void *Val)
{
IntWrBuf.wd16 = *(int *)Val;
EepromWrBuf[0] = IntWrBuf.wdcode.byte0;
EepromWrBuf[1] = IntWrBuf.wdcode.byte1;
EepromWrBuf[2] = 0;
EepromWrBuf[3] = 0;
WriteEeprom(Address * 4, EepromWrBuf, 4);
}
void WriteEeprom(uint16_t address, uint16_t *data, uint16_t length)
{
while (ReadEepromStatusReg() & MSG_STATUS_READY_M == MSG_STATUS_READY_M);
enableWrite();
while (ReadEepromStatusReg() & MSG_STATUS_WRITE_READY_M == MSG_STATUS_WRITE_READY_M);
writeData(address, data, length);
}
unsigned int EEPROM_Page_Buffer = 128;
int EEPROM_Start_Addr = 0;
void WriteEepromArray(uint16_t address, uint16_t *data, uint16_t length)
{
int NUM_BYTES_Quotient = 0;
int NUM_BYTES_Remain = 0;
int EEPROM_ADDR_Offset = 0;
int i = 0;
NUM_BYTES_Quotient = length / EEPROM_Page_Buffer;
NUM_BYTES_Remain = length % EEPROM_Page_Buffer;
for(i = 0; i < NUM_BYTES_Quotient; i++)
{
EEPROM_ADDR_Offset = i * EEPROM_Page_Buffer;
EEPROM_Start_Addr = address + EEPROM_ADDR_Offset;
WriteEeprom(EEPROM_Start_Addr, data, EEPROM_Page_Buffer);
EEPROM_ADDR_Offset = EEPROM_ADDR_Offset + EEPROM_Page_Buffer;
}
if(NUM_BYTES_Remain != 0 )
{
EEPROM_ADDR_Offset = EEPROM_ADDR_Offset;
EEPROM_Start_Addr = address + EEPROM_ADDR_Offset;
WriteEeprom(EEPROM_Start_Addr, data, NUM_BYTES_Remain);
}
}
uint16_t ReadEepromStatusReg(void)
{
uint16_t temp;
//임시 나중에 STE 레지스터 찾아서 수정 할 것
CS_LOW;
SPI_writeDataBlockingNonFIFO(SPIC_BASE, RDSR);
temp = SPI_readDataBlockingNonFIFO(SPIC_BASE);
SPI_writeDataBlockingNonFIFO(SPIC_BASE, 0x0000);
temp = SPI_readDataBlockingNonFIFO(SPIC_BASE);
CS_HIGH;
return(temp);
}
void enableWrite(void)
{
CS_LOW;
SPI_writeDataBlockingNonFIFO(SPIC_BASE, WREN);
SPI_readDataBlockingNonFIFO(SPIC_BASE);
CS_HIGH;
}
void writeData(uint16_t address, uint16_t * data, uint16_t length)
{
uint16_t i;
CS_LOW;
SPI_writeDataBlockingNonFIFO(SPIC_BASE, WRITE);
SPI_readDataBlockingNonFIFO(SPIC_BASE);
SPI_writeDataBlockingNonFIFO(SPIC_BASE, (address & 0xFF00));
SPI_readDataBlockingNonFIFO(SPIC_BASE);
SPI_writeDataBlockingNonFIFO(SPIC_BASE, address << 8);
SPI_readDataBlockingNonFIFO(SPIC_BASE);
for(i = 0; i < length; i++)
{
SPI_writeDataBlockingNonFIFO(SPIC_BASE, data[i] << 8);
SPI_readDataBlockingNonFIFO(SPIC_BASE);
}
CS_HIGH;
}
void readData(uint16_t address, uint16_t * data, uint16_t length)
{
uint16_t i;
CS_LOW;
SPI_writeDataBlockingNonFIFO(SPIC_BASE, READ);
SPI_readDataBlockingNonFIFO(SPIC_BASE);
SPI_writeDataBlockingNonFIFO(SPIC_BASE, (address & 0xFF00));
SPI_readDataBlockingNonFIFO(SPIC_BASE);
SPI_writeDataBlockingNonFIFO(SPIC_BASE, (address << 8));
SPI_readDataBlockingNonFIFO(SPIC_BASE);
for(i = 0; i < length; i++)
{
SPI_writeDataBlockingNonFIFO(SPIC_BASE, 0x0000);
data[i] = SPI_readDataBlockingNonFIFO(SPIC_BASE);
}
CS_HIGH;
}