//-------------------------------------------------------// // 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; }