diff --git a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c index b6192e4..be80308 100644 --- a/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c +++ b/Projects/mem_test/src/ExternalEEPROM/BL25CM1A.c @@ -21,10 +21,9 @@ #define RDLS 0b10000011 //Reads the identification page lock status #define LID 0b10000010 //Locks the identification page in read-only mode -#define FIFO_SIZE 8 -uint16_t WaitedTimes = 0; -uint16_t Stat = 1; + + void Bl25cm1a_en(void) { @@ -51,15 +50,15 @@ uint16_t Bl25cm1a_ReadStatus(void) return empty; } -void Bl25cm1a_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte) +void Bl25cm1a_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte) { volatile uint16_t empty, i, j; + uint16_t Stat = 1; Stat = Bl25cm1a_ReadStatus(); while((Stat&0x1) != 0 ) { Stat = Bl25cm1a_ReadStatus(); - WaitedTimes++; } transmitData(READ); @@ -81,16 +80,15 @@ void Bl25cm1a_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte) } } -void Bl25cm1a_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_byte) +void Bl25cm1a_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte) { volatile uint16_t empty, i, j; - + uint16_t Stat = 1; Stat = Bl25cm1a_ReadStatus(); while((Stat&0x1) != 0 ) { Stat = Bl25cm1a_ReadStatus(); - WaitedTimes++; } Bl25cm1a_en(); @@ -114,23 +112,23 @@ void Bl25cm1a_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_byte) } } -uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, char * verify_data, uint16_t num_byte) +uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte) { volatile uint16_t empty, i, j; + uint16_t Stat = 1; Stat = Bl25cm1a_ReadStatus(); while((Stat&0x1) != 0 ) { Stat = Bl25cm1a_ReadStatus(); - WaitedTimes++; } transmitData(READ); transmitData(Addr>>16); transmitData(Addr>>8); transmitData(Addr); - for(i = 0; i 4) { @@ -171,24 +169,24 @@ void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant16, uint16_t * read_data) -uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data) +uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant16, uint16_t * verify_data) { uint32_t i=0; - char addr_vfy_data[8]; + uint16_t addr_vfy_data[8]; - if(quant > 4) + if(quant16 > 4) { - for(i = 0; i < (quant-4); i += 4) + for(i = 0; i < (quant16-4); i += 4) { copy16_to_8(verify_data, addr_vfy_data, 4); if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 8)) return 1; verify_data+=4; } } - if(i < quant) + if(i < quant16) { - copy16_to_8(verify_data, addr_vfy_data, (quant - i)); - if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant - i))) return 1; + copy16_to_8(verify_data, addr_vfy_data, (quant16 - i)); + if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant16 - i))) return 1; } return 0; } @@ -196,7 +194,7 @@ uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_d void Bl25cm1a_write_1_page(uint32_t Addr, uint16_t quant, uint16_t * write_data) { uint32_t i=0; - char addr_write_data[8]; + uint16_t addr_write_data[8]; uint32_t Addressfull8bit; if(quant > 4) @@ -222,7 +220,6 @@ void Bl25cm1a_write_data(uint32_t Addr_8bit, uint16_t quant_16bit, uint16_t * wr uint16_t * addr_write_data = write_data; uint16_t page_quant_8bit = 0; - while( (Addr_8bit&0xFF)+(2*quant_16bit) > BL25CM1A0_PAGE) //если данные выходят за границу текущей страницы { page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы diff --git a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c index 4080025..0881e4a 100644 --- a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c +++ b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.c @@ -8,6 +8,7 @@ #include "spi_init.h" #include "GD25Q16ETIGR.h" +#include "Arr.h" //max adr 0x1FFFFF (2097152 bytes = 2048 Kbytes = 2 Mbyte) #define WriteEnable 0x06 @@ -24,9 +25,30 @@ #define ChipErase 0xC7 //0x60 uint16_t sdata1 = ReadStatusRegister1; // sent data -//uint16_t rdata1[16]; // received data -//uint16_t error1 = 0; -char GD25Q16ETIGR_buffer8bytes[8]; +uint16_t GD25Q16ETIGR_buffer8bytes[8]; + +uint16_t SectorWasErraised[512]; + + +uint16_t GD25Q16ETIGR_Sektor_Addr(uint32_t Addr) +{ + uint16_t sektor; + for (sektor=1; sektor <= 512; sektor++ ) + { + if(Addr < (0x1000*sektor)) return sektor-1; + } + return 511; +} + + +void GD25Q16ETIGR_clean_SectorWasErraised(void) +{ + uint16_t i; + for(i=0; i<512; i++) + { + SectorWasErraised[i] = 0; + } +} void GD25Q16ETIGR_en(void) @@ -40,16 +62,33 @@ void GD25Q16ETIGR_en(void) empty = SpiRegs.SPIRXBUF; } +uint16_t GD25Q16ETIGR_ReadStatus(void) +{ + volatile uint16_t empty; + transmitData(ReadStatusRegister1); + transmitData(0xFF); + while(SpiRegs.SPIFFRX.bit.RXFFST != 2) + { - - -#define FIFO_SIZE 8 + } + empty = SpiRegs.SPIRXBUF; + empty = SpiRegs.SPIRXBUF; + return empty; +} void GD25Q16ETIGR_sector_erase(uint32_t Addr) { volatile uint16_t empty; + uint16_t Stat = 1; + + Stat = GD25Q16ETIGR_ReadStatus(); + while((Stat&0x1) != 0 ) + { + Stat = GD25Q16ETIGR_ReadStatus(); + } + GD25Q16ETIGR_en(); - transmitData(ReadData); + transmitData(SectorErase); transmitData(Addr>>16); transmitData(Addr>>8); transmitData(Addr); @@ -63,9 +102,17 @@ void GD25Q16ETIGR_sector_erase(uint32_t Addr) empty = SpiRegs.SPIRXBUF; } -void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte)//чтение до 8 байт +void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//чтение до 8 байт { volatile uint16_t empty, i, j; + uint16_t Stat = 1; + + Stat = GD25Q16ETIGR_ReadStatus(); + while((Stat&0x1) != 0 ) + { + Stat = GD25Q16ETIGR_ReadStatus(); + } + transmitData(ReadData); transmitData(Addr>>16); transmitData(Addr>>8); @@ -85,15 +132,23 @@ void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byt } } -uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, char * verify_data, uint16_t num_byte)//чтение и проверка до 8 байт +uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//чтение и проверка до 8 байт { volatile uint16_t empty, i, j; + uint16_t Stat = 1; + + Stat = GD25Q16ETIGR_ReadStatus(); + while((Stat&0x1) != 0 ) + { + Stat = GD25Q16ETIGR_ReadStatus(); + } + transmitData(ReadData); transmitData(Addr>>16); transmitData(Addr>>8); transmitData(Addr); - for(i = 0; i>16); @@ -131,73 +194,110 @@ void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_b } } -void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, char * read_data) +void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant16, uint16_t * read_data) { uint32_t i=0; - char * addr_read_data = read_data; + uint32_t Addressfull8bit; + uint16_t addr_read_data[8]; - if(quant > 8) + if(quant16 > 4) { - for(i = 0; i < (quant-8); i += 8) + for(i = 0; i < (quant16-4); i += 4) { + Addressfull8bit = Addr+2*i; GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8); - addr_read_data += 8; + copy8_to_16(addr_read_data, read_data, 4); + read_data+=4; } } - if(i < quant) GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, quant - i); + if(i < quant16) + { + Addressfull8bit = Addr+2*i; + GD25Q16ETIGR_read_8_bytes(Addressfull8bit, addr_read_data, 2*(quant16 - i)); + copy8_to_16(addr_read_data, read_data, (quant16 - i)); + } } -void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant, char * write_data) // запись внутри одной страницы +uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant16, uint16_t * verify_data) { + uint32_t i=0; - char * addr_write_data = write_data; + uint16_t addr_vfy_data[8]; - if(quant > 8) + if(quant16 > 4) { - for(i = 0; i < (quant-8); i += 8) + for(i = 0; i < (quant16-4); i += 4) { - GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8); - addr_write_data += 8; + copy16_to_8(verify_data, addr_vfy_data, 4); + if(GD25Q16ETIGR_verify_8_bytes(Addr+2*i, addr_vfy_data, 8)) return 1; + verify_data+=4; } } - 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) //если данные выходят за границу текущей страницы + if(i < quant16) { - 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; //уменьшаем кол-во данных на величину которую уже записали + copy16_to_8(verify_data, addr_vfy_data, (quant16 - i)); + if(GD25Q16ETIGR_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant16 - i))) return 1; } - 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; } +void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant, uint16_t * write_data) // запись внутри одной страницы +{ + uint32_t i=0; + uint16_t addr_write_data[8]; + uint32_t Addressfull8bit; + + if(quant > 4) + { + for(i = 0; i < (quant-4); i += 4) + { + copy16_to_8(write_data, addr_write_data, 4); + Addressfull8bit = Addr+2*i; + GD25Q16ETIGR_write_8_bytes(Addressfull8bit, addr_write_data, 8); + write_data += 4; + } + } + if(i < quant) + { + copy16_to_8(write_data, addr_write_data, (quant - i)); + Addressfull8bit = Addr+2*i; + GD25Q16ETIGR_write_8_bytes(Addressfull8bit, addr_write_data, 2*(quant - i)); + } +} + +void GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_16bit, uint16_t * write_data) +{ + uint16_t * addr_write_data = write_data; + uint16_t page_quant_8bit = 0; + uint16_t FlashSektorStart = 0; + uint16_t FlashSektorEnd = 0; + uint16_t i=0; + + FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //сектор с которого начинается запись + FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_16bit*2 - 1); //сектор в котором конец записи + + for(i = FlashSektorStart; i <= FlashSektorEnd; i++) + { + if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; GD25Q16ETIGR_sector_erase(i*0x1000);} + } + + while( (Addr_8bit&0xFF)+(2*quant_16bit) > GD25Q16E_PAGE) //если данные выходят за границу текущей страницы + { + page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы + GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //записываем эти данные на текущую страницу + Addr_8bit += page_quant_8bit; //перелистываем страницу внешней памяти + addr_write_data += page_quant_8bit/2; //шагаем на следующие незаписанные данные в буфере (они у нас 16-битными словами) + quant_16bit -= page_quant_8bit/2; //уменьшаем кол-во данных на величину которую уже записали + } + if(quant_16bit > 0) + { + GD25Q16ETIGR_write_1_page(Addr_8bit, quant_16bit, addr_write_data); //если данные для записи остались, то записываем их + } +} + + + uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void) { diff --git a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h index f3ccb4e..1236763 100644 --- a/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h +++ b/Projects/mem_test/src/ExternalEEPROM/GD25Q16ETIGR.h @@ -13,9 +13,10 @@ void GD25Q16ETIGR_en(void); void GD25Q16ETIGR_write(void); -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_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_data); +void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, uint16_t * read_data); +uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data); uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void); +void GD25Q16ETIGR_clean_SectorWasErraised(void); #endif /* SRC_GD25Q16ETIGR_H_ */ diff --git a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c index 048f317..a598920 100644 --- a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c +++ b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.c @@ -9,15 +9,15 @@ #include "ZD24C02A.h" volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS; -char BufferZD24C02A[17]; +uint16_t BufferZD24C02A[17]; -uint16_t ZD24C02A_write_16(char Addr, char * Array, uint16_t quant)// может писать очередями по 16 байт +uint16_t ZD24C02A_write_16(uint16_t Addr, uint16_t * Array, uint16_t quant)// может писать очередями по 16 байт { if(I2CWrite(SlaveAdr, Addr, quant, true, Array)) return 1; else return 0; } -uint16_t ZD24C02A_read_16(char Addr, char * Array, uint16_t quant) +uint16_t ZD24C02A_read_16(uint16_t Addr, uint16_t * Array, uint16_t quant) { if(I2CWrite(SlaveAdr, Addr, 0, false, Array)) return 1; @@ -26,7 +26,7 @@ uint16_t ZD24C02A_read_16(char Addr, char * Array, uint16_t quant) } -uint16_t ZD24C02A_verify_16(char Addr, char * Array, uint16_t quant) +uint16_t ZD24C02A_verify_16(uint16_t Addr, uint16_t * Array, uint16_t quant) { uint16_t VerifyErr = 0; @@ -35,18 +35,18 @@ uint16_t ZD24C02A_verify_16(char Addr, char * Array, uint16_t quant) return VerifyErr; } -uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, char * Array) +uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, uint16_t * Array) { return 0; } -uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data) +uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, uint16_t * read_data) { uint16_t Err_read = 0; uint32_t i=0; - char * addr_read_data = read_data; + uint16_t * addr_read_data = read_data; if(quant > 16) { @@ -62,11 +62,11 @@ uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data) else return 0; } -uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data) +uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, uint16_t * verify_data) { uint16_t Err_read = 0; uint32_t i=0; - char * addr_read_data = verify_data; + uint16_t * addr_read_data = verify_data; if(quant > 16) { @@ -92,7 +92,7 @@ uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data) -void ZD24C02A_read_all(uint16_t byteCount, char * Array) +void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array) { I2CRead(SlaveAdr, byteCount, true, Array); // I2CWriteRead(I2C_SLAVE_ADDRESS, byteCount, true, Array); @@ -100,7 +100,7 @@ void ZD24C02A_read_all(uint16_t byteCount, char * Array) } -void ZD24C02A_test(char * Array) +void ZD24C02A_test(uint16_t * Array) { uint16_t i=0; for(i=0;i<=255;i+=15) diff --git a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h index 3c320b6..d22a051 100644 --- a/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h +++ b/Projects/mem_test/src/ExternalEEPROM/ZD24C02A.h @@ -14,10 +14,10 @@ #define ZD24C02A_SIZE 0x80 -uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, char * Array); -uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data); -void ZD24C02A_test(char * Array); -void ZD24C02A_read_all(uint16_t byteCount, char * Array); -uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data); +uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, uint16_t * Array); +uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, uint16_t * read_data); +void ZD24C02A_test(uint16_t * Array); +void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array); +uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, uint16_t * verify_data); #endif /* SRC_ZD24C02A_H_ */ diff --git a/Projects/mem_test/src/Peripherals/i2c_init.c b/Projects/mem_test/src/Peripherals/i2c_init.c index e56fa5e..3191dbb 100644 --- a/Projects/mem_test/src/Peripherals/i2c_init.c +++ b/Projects/mem_test/src/Peripherals/i2c_init.c @@ -121,7 +121,7 @@ uint16_t j = 0; // // Function to send data over I2C. // -uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, char * I2C_TXdata) +uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata) { // @@ -193,7 +193,7 @@ uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool // uint16_t ttest=0; -uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata) +uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata) { I2caRegs.I2CMDR.bit.NACKMOD = 0x0; // @@ -245,7 +245,7 @@ uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, -uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_Vfdata) +uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_Vfdata) { uint16_t VerErr = 0; I2caRegs.I2CMDR.bit.NACKMOD = 0x0; diff --git a/Projects/mem_test/src/Peripherals/i2c_init.h b/Projects/mem_test/src/Peripherals/i2c_init.h index 0da5e46..f43ac47 100644 --- a/Projects/mem_test/src/Peripherals/i2c_init.h +++ b/Projects/mem_test/src/Peripherals/i2c_init.h @@ -17,10 +17,10 @@ void I2CMasterInit(uint16_t I2CSlave_OwnAddress, uint16_t I2CSlave_Address); -uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, char * I2C_TXdata); -uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata); -uint16_t I2CWriteRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata); -uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_Vfdata); +uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata); +uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata); +uint16_t I2CWriteRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata); +uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_Vfdata); void I2CMasterGpioInit(void); void TimerBaseTimeoutInc(void); void I2CWriteReadOnes(uint16_t slaveAddr); diff --git a/Projects/mem_test/src/Peripherals/ipc_init.c b/Projects/mem_test/src/Peripherals/ipc_init.c index bd41186..e869158 100644 --- a/Projects/mem_test/src/Peripherals/ipc_init.c +++ b/Projects/mem_test/src/Peripherals/ipc_init.c @@ -166,6 +166,7 @@ void getMessage_from_Cm_Flash(void) break; case END: clear_BlockWasErased(); + IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, INT_FLASH, 0, 0); break; default: IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, INT_FLASH, 0, 0); @@ -215,7 +216,6 @@ void getMessage_from_Cm_BL25CM1A(void) IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0); break; case WRITE: - //Bl25cm1a_en(); Bl25cm1a_write_data(2*InAddr, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE); IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0); break; @@ -243,15 +243,15 @@ void getMessage_from_Cm_GD25Q16E(void) switch(InCommand >> 16) { case READ: - GD25Q16ETIGR_read_data(InAddr*2, InData*2, (char *)CPUXTOCMMSGRAM0_BASE); + GD25Q16ETIGR_read_data(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE); IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0); break; case WRITE: - GD25Q16ETIGR_write_data(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + GD25Q16ETIGR_write_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE); IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0); break; case VERIFY: - MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE); if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, GD25Q16E_16M_bit_SPI, 0, 0); else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0); break; @@ -260,6 +260,7 @@ void getMessage_from_Cm_GD25Q16E(void) break; default: IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, GD25Q16E_16M_bit_SPI, 0, 0); + GD25Q16ETIGR_clean_SectorWasErraised(); break; } } @@ -275,17 +276,17 @@ void getMessage_from_Cm_ZD24C02A(void) switch(InCommand >> 16) { case READ: - I2CErr = ZD24C02A_read(InAddr*2, InData*2, (char *)CPUXTOCMMSGRAM0_BASE); + I2CErr = ZD24C02A_read(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE); if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0); else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0); break; case WRITE: - I2CErr = ZD24C02A_write(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + I2CErr = ZD24C02A_write(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE); if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, ZD24C02A_2K_I2C, FLASH_ERR, 0, 0); else IPC_sendCommand(IPC_CPU1_L_CM_R, ZD24C02A_2K_I2C, DONE_SUCCESS, 0, 0); break; case VERIFY: - MemOperationError = ZD24C02A_verify(InData*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE); + MemOperationError = ZD24C02A_verify(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE); if(MemOperationError == 2) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, ZD24C02A_2K_I2C, 0, 0); else if(MemOperationError == 1) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0); else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0); @@ -378,6 +379,9 @@ void ipc_init(void) IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT1, IPC_INT1); IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT0, IPC_INT0); + GD25Q16ETIGR_clean_SectorWasErraised(); + clear_BlockWasErased(); + } void ipc_run(void)