diff --git a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c index 6059390..1098b77 100644 --- a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c +++ b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c @@ -7,6 +7,8 @@ #include "f28x_project.h" #include "spi_init.h" +#include "BL25CM1A.h" + #define WREN 0b00000110 //Enable Write Operations #define WRDI 0b00000100 //Disable Write Operations #define RDSR 0b00000101 //Read Status Register @@ -47,17 +49,18 @@ void Bl25cm1a_write(void) rdata2[1] = SpiRegs.SPIRXBUF; } -#define quant 8 +#define FIFO_SIZE 8 -void Bl25cm1a_read_data(uint32_t Addr) + +void Bl25cm1a_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte) { volatile uint16_t empty, i, j; transmitData(READ); transmitData(Addr>>16); transmitData(Addr>>8); transmitData(Addr); - for(i = 0; i>16); transmitData(Addr>>8); transmitData(Addr); - for(i = 0; i>16); + transmitData(Addr>>8); + transmitData(Addr); + for(i = 0; i 8) + { + for(i = 0; i < (quant-8); i += 8) + { + Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, 8); + addr_read_data += 8; + } + } + if(i < quant) Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, quant - i); +} + + + +uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, char * verify_data) +{ + uint32_t i=0; + char * addr_read_data = verify_data; + + if(quant > 8) + { + for(i = 0; i < (quant-8); i += 8) + { + if(Bl25cm1a_verify_8_bytes(Addr+i, addr_read_data, 8)) return 1; + addr_read_data += 8; + } + } + if(i < quant) if(Bl25cm1a_verify_8_bytes(Addr+i, addr_read_data, quant - i)) return 1; + return 0; +} + +void Bl25cm1a_write_1_page(uint32_t Addr, uint16_t quant, char * write_data) +{ + uint32_t i=0; + char * addr_write_data = write_data; + + if(quant > 8) + { + for(i = 0; i < (quant-8); i += 8) + { + Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, 8); + addr_write_data += 8; + } + } + if(i < quant) Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, quant - i); +} + +void Bl25cm1a_write_data(uint32_t Addr, uint16_t quant, char * write_data) +{ + char * addr_write_data = write_data; + uint16_t page_quant = 0; + + while( (Addr&0xFF)+quant > BL25CM1A0_PAGE) //если данные выходят за границу текущей страницы + { + page_quant = BL25CM1A0_PAGE - (Addr&0xFF); //вычисляем кол-во данных до конца текущей страницы + Bl25cm1a_write_1_page(Addr, page_quant, addr_write_data); //записываем эти данные на текущую страницу + Addr += page_quant; //перелистываем страницу внешней памяти + addr_write_data += page_quant; //шагаем на следующие незаписанные данные в буфере + quant -= page_quant; //уменьшаем кол-во данных на величину которую уже записали + } + if(quant > 0) Bl25cm1a_write_1_page(Addr, quant, addr_write_data); //если данные для записи остались, то записываем их +} diff --git a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.h b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.h index ae98c51..eae37c8 100644 --- a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.h +++ b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.h @@ -8,11 +8,12 @@ #ifndef SRC_BL25CM1A_H_ #define SRC_BL25CM1A_H_ -#define BL25CM1A0_SIZE 0x10000 //16 bit lenght +#define BL25CM1A0_SIZE 0x10000 //16 bit lenght +#define BL25CM1A0_PAGE 0x100 void Bl25cm1a_en(void); void Bl25cm1a_write(void); -void Bl25cm1a_write_data(uint32_t Addr); -void Bl25cm1a_read_data(uint32_t Addr); - +void Bl25cm1a_write_data(uint32_t Addr, uint16_t quant, char * write_data); +void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant, char * read_data); +uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, char * verify_data); #endif /* SRC_BL25CM1A_H_ */ diff --git a/Projects/mem_test/src/ExternalEEPROM/ExtEEPROM.c b/Projects/mem_test/src/ExternalEEPROM/ExtEEPROM.c index 6b18c2f..978b00d 100644 --- a/Projects/mem_test/src/ExternalEEPROM/ExtEEPROM.c +++ b/Projects/mem_test/src/ExternalEEPROM/ExtEEPROM.c @@ -57,11 +57,11 @@ void ExtEEPROM_run(void) break; case 3: GD25Q16ETIGR_en(); - GD25Q16ETIGR_write_data(SpiAdr); + //GD25Q16ETIGR_write_data(SpiAdr); sendNowSPIGD25 = 0; break; case 4: - GD25Q16ETIGR_read_data(SpiAdr); + //GD25Q16ETIGR_read_data(SpiAdr); sendNowSPIGD25 = 0; break; case 5: @@ -83,11 +83,11 @@ void ExtEEPROM_run(void) break; case 3: Bl25cm1a_en(); - Bl25cm1a_write_data(SpiAdr); + //Bl25cm1a_write_data(SpiAdr); sendNowSPIBL25 = 0; break; case 4: - Bl25cm1a_read_data(SpiAdr); + //Bl25cm1a_read_data(SpiAdr); sendNowSPIBL25 = 0; break; case 5: diff --git a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c index 5b2c465..f8d1faf 100644 --- a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c +++ b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c @@ -7,6 +7,8 @@ #include "f28x_project.h" #include "spi_init.h" +#include "GD25Q16ETIGR.h" + //max adr 0x1FFFFF (2097152 bytes = 2048 Kbytes = 2 Mbyte) #define WriteEnable 0x06 #define WriteDisable 0x04 @@ -50,51 +52,141 @@ void GD25Q16ETIGR_write(void) rdata1[1] = SpiRegs.SPIRXBUF; } -#define quant 8 +#define FIFO_SIZE 8 -void GD25Q16ETIGR_read_data(uint32_t Addr) +void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte)//чтение до 8 байт { - volatile uint16_t empty, i, j; - transmitData(ReadData); - transmitData(Addr>>16); - transmitData(Addr>>8); - transmitData(Addr); - for(i = 0; i>16); + transmitData(Addr>>8); + transmitData(Addr); + for(i = 0; i>16); + transmitData(Addr>>8); + transmitData(Addr); + for(i = 0; i>16); + transmitData(Addr>>8); + transmitData(Addr); + for(i = 0; i 8) + { + for(i = 0; i < (quant-8); i += 8) + { + GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8); + addr_read_data += 8; + } + } + if(i < quant) GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, quant - i); } -void GD25Q16ETIGR_write_data(uint32_t Addr) +void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant, char * write_data) // запись внутри одной страницы { - volatile uint16_t empty, i, j; - transmitData(PageProgram); - transmitData(Addr>>16); - transmitData(Addr>>8); - transmitData(Addr); - for(i = 0; i 8) + { + for(i = 0; i < (quant-8); i += 8) + { + GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8); + addr_write_data += 8; + } + } + if(i < quant) GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, quant - i); +} + +void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, char * write_data) +{ + char * addr_write_data = write_data; + uint16_t page_quant = 0; + + while( (Addr&0xFF)+quant > GD25Q16E_PAGE) //если данные выходят за границу текущей страницы + { + page_quant = GD25Q16E_PAGE - (Addr&0xFF); //вычисляем кол-во данных до конца текущей страницы + GD25Q16ETIGR_write_1_page(Addr, page_quant, addr_write_data); //записываем эти данные на текущую страницу + Addr += page_quant; //перелистываем страницу внешней памяти + addr_write_data += page_quant; //шагаем на следующие незаписанные данные + quant -= page_quant; //уменьшаем кол-во данных на величину которую уже записали + } + if(quant > 0) GD25Q16ETIGR_write_1_page(Addr, quant, addr_write_data); //если данные для записи остались, то записываем их +} + + +uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, char * verify_data) +{ + uint32_t i=0; + char * addr_read_data = verify_data; + + if(quant > 8) //если кол-во байт больше 8, то читаем кусками по 8 + { + for(i = 0; i < (quant-8); i += 8) //если осталось больше восьми читаем кусками дальше + { + if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_read_data, 8)) return 1; + addr_read_data += 8; + } + } //тут останется меньше 8ми + if(i < quant) if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_read_data, quant - i)) return 1; //читаем что осталось если оно осталось + return 0; } diff --git a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h index 17f6932..0fa8ebf 100644 --- a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h +++ b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h @@ -9,11 +9,13 @@ #define SRC_GD25Q16ETIGR_H_ #define GD25Q16E_SIZE 0x100000 // 16 bit lenght +#define GD25Q16E_PAGE 0x100 void GD25Q16ETIGR_en(void); void GD25Q16ETIGR_write(void); -void GD25Q16ETIGR_write_data(uint32_t Addr); -void GD25Q16ETIGR_read_data(uint32_t Addr); +void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, char * write_data); +void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, char * read_data); +uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, char * verify_data); void GD25Q16ETIGR_ReadManufacturerDeviceID(void); #endif /* SRC_GD25Q16ETIGR_H_ */ diff --git a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c index e5cea94..21630fa 100644 --- a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c +++ b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c @@ -25,7 +25,7 @@ void ZD24C02A_read(uint16_t byteCount, char * Array) -void ZD24C02A_verify(uint16_t byteCount, char * Array) +uint16_t ZD24C02A_verify(uint16_t byteCount, char * Array) { } diff --git a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h index 4f7e4ad..93fdfa9 100644 --- a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h +++ b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h @@ -18,6 +18,6 @@ void ZD24C02A_write(uint16_t byteCount, char * Array); void ZD24C02A_read(uint16_t byteCount, char * Array); void ZD24C02A_test(char * Array); void ZD24C02A_read_all(uint16_t byteCount, char * Array); -void ZD24C02A_verify(uint16_t byteCount, char * Array); +uint16_t ZD24C02A_verify(uint16_t byteCount, char * Array); #endif /* SRC_ZD24C02A_H_ */ diff --git a/Projects/mem_test/src/Peripherals/ipc_init.c b/Projects/mem_test/src/Peripherals/ipc_init.c index 186ad0a..00c3292 100644 --- a/Projects/mem_test/src/Peripherals/ipc_init.c +++ b/Projects/mem_test/src/Peripherals/ipc_init.c @@ -112,9 +112,9 @@ void getMessage_from_Cm_Flash(void) uint16_t FlashSektorEnd = 0; uint32_t FactAddressFlash = Bzero_Sector0_start; uint32_t block1, block2; - uint16_t FlashErr = 0; + uint16_t MemOperationError = 0; - if(InData > 2048) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} + if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} if((InAddr+InData) > 0x40000) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_ADDR, 0, 0); return;} IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); @@ -131,35 +131,35 @@ void getMessage_from_Cm_Flash(void) FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //сектор в котором конец записи (тот же или следующий, так как размер сектора больше размера буфера) if(!BlockWasErased[FlashSektorStart]) { - FlashErr = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его - if(!FlashErr) BlockWasErased[FlashSektorStart] = 1; - else {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, FlashErr, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем + MemOperationError = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его + if(!MemOperationError) BlockWasErased[FlashSektorStart] = 1; + else {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, MemOperationError, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем } if(FlashSektorEnd == FlashSektorStart) //если заканчиваем в этом же секторе что и начали, то просто пишем его { - FlashErr = Internal_flash_Program_AutoECC(FactAddressFlash, InData); - if(FlashErr) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, FlashErr, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем + MemOperationError = Internal_flash_Program_AutoECC(FactAddressFlash, InData); + if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, MemOperationError, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем } else //если начали в одном секторе, а заканчиваем в другом то { if(!BlockWasErased[FlashSektorEnd])//стираем второй сектор если он не был стёрт ранее { - FlashErr = Internal_flash_Erase(FactAddressFlash+InData); - if(!FlashErr)BlockWasErased[FlashSektorEnd] = 1; - else {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, FlashErr, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем + MemOperationError = Internal_flash_Erase(FactAddressFlash+InData); + if(!MemOperationError)BlockWasErased[FlashSektorEnd] = 1; + else {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, MemOperationError, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем } block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //вычисляем размер первого куска block2 = InData - block1; //и размер куска для второго сектора - FlashErr = Internal_flash_Program_AutoECC(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор, - if(FlashErr) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, FlashErr, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем - FlashErr = Internal_flash_Program_AutoECC(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй - if(FlashErr) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, FlashErr, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем + MemOperationError = Internal_flash_Program_AutoECC(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор, + if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, MemOperationError, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем + MemOperationError = Internal_flash_Program_AutoECC(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй + if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, MemOperationError, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем } IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case VERIFY: - FlashErr = verifyFlashMessage_to_Cm(FactAddressFlash, InData); - if(FlashErr) IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, ERROR_VERIFY, FlashErr, 0); + MemOperationError = verifyFlashMessage_to_Cm(FactAddressFlash, InData); + if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, ERROR_VERIFY, MemOperationError, 0); else IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case END: @@ -174,7 +174,8 @@ void getMessage_from_Cm_Flash(void) #ifdef CPU1 void getMessage_from_Cm_EMIF(void) { - if(InData > 2048) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} + uint16_t MemOperationError = 0; + if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} if((InAddr+InData) > 0x100000) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_ADDR, 0, 0); return;} IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); @@ -199,7 +200,8 @@ void getMessage_from_Cm_EMIF(void) void getMessage_from_Cm_BL25CM1A(void) { - if(InData > 2048) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} + uint16_t MemOperationError = 0; + if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} if((InAddr+InData) > BL25CM1A0_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_ADDR, 0, 0); return;} IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); @@ -207,15 +209,19 @@ void getMessage_from_Cm_BL25CM1A(void) { case READ: Bl25cm1a_en(); - + Bl25cm1a_read_data(InAddr*2, InData, (char *)CPUXTOCMMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case WRITE: Bl25cm1a_en(); - + Bl25cm1a_write_data(InAddr*2, InData, (char *)CMTOCPUXMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case VERIFY: Bl25cm1a_en(); - + MemOperationError = Bl25cm1a_verify_data(InAddr*2, InData, (char *)CMTOCPUXMSGRAM0_BASE); + if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, ERROR_VERIFY, MemOperationError, 0); + else IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); case END: IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); break; @@ -227,7 +233,8 @@ void getMessage_from_Cm_BL25CM1A(void) void getMessage_from_Cm_GD25Q16E(void) { - if(InData > 2048) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} + uint16_t MemOperationError = 0; + if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} if((InAddr+InData) > GD25Q16E_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_ADDR, 0, 0); return;} IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); @@ -235,15 +242,19 @@ void getMessage_from_Cm_GD25Q16E(void) { case READ: GD25Q16ETIGR_en(); - + GD25Q16ETIGR_read_data(InAddr*2, InData, (char *)CPUXTOCMMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case WRITE: GD25Q16ETIGR_en(); - + GD25Q16ETIGR_write_data(InAddr*2, InData, (char *)CMTOCPUXMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case VERIFY: GD25Q16ETIGR_en(); - + MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData, (char *)CMTOCPUXMSGRAM0_BASE); + if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, ERROR_VERIFY, MemOperationError, 0); + else IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); case END: IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); break; @@ -255,7 +266,8 @@ void getMessage_from_Cm_GD25Q16E(void) void getMessage_from_Cm_ZD24C02A(void) { - if(InData > 2048) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} + uint16_t MemOperationError = 0; + if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_LENGHT, 0, 0); return;} if((InAddr+InData) > ZD24C02A_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, WRONG_ADDR, 0, 0); return;} IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); @@ -263,12 +275,16 @@ void getMessage_from_Cm_ZD24C02A(void) { case READ: ZD24C02A_read(InData*2, (char *)CPUXTOCMMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case WRITE: ZD24C02A_write(InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); break; case VERIFY: - ZD24C02A_verify(InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + MemOperationError = ZD24C02A_verify(InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, ERROR_VERIFY, MemOperationError, 0); + else IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, DONE_SUCCESS, 0, 0); case END: IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, COMMAND_ACCEPTED, 0, 0); break;