исправлен баг с записью во флеш

This commit is contained in:
seklyuts 2024-05-16 09:50:13 +03:00
parent 4fb36f9e64
commit 008a4a2fc0
5 changed files with 128 additions and 31 deletions

View File

@ -28,13 +28,13 @@ void main(void)
InitPerif(); InitPerif();
for(;;) for(;;)
{ {
asm (" NOP"); // asm (" NOP");
ipc_run(); ipc_run();
#ifdef CPU1 //#ifdef CPU1
// emif_run(); // emif_run();
// frmmstr_run(); // frmmstr_run();
#endif //#endif
} }
} }

View File

@ -29,6 +29,29 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
uint16_t SectorWasErraised[512]; uint16_t SectorWasErraised[512];
uint16_t writeVerify = 1;
void delay(void)
{
uint32_t i;
for(i=0;i<100000;i++)
{
asm (" NOP");
}
}
void GD25Q16ETIGR_checkRXFFST(void)
{
volatile uint16_t empty;
while(SpiRegs.SPIFFRX.bit.RXFFST > 0)
{
empty = SpiRegs.SPIRXBUF;
}
}
void GD25Q16ETIGR_clean_SectorWasErraised(void) void GD25Q16ETIGR_clean_SectorWasErraised(void)
{ {
@ -43,6 +66,7 @@ void GD25Q16ETIGR_clean_SectorWasErraised(void)
void GD25Q16ETIGR_en(void) void GD25Q16ETIGR_en(void)
{ {
volatile uint16_t empty; volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(WriteEnable); transmitData(WriteEnable);
while(SpiRegs.SPIFFRX.bit.RXFFST != 1) while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
{ {
@ -54,6 +78,7 @@ void GD25Q16ETIGR_en(void)
uint16_t GD25Q16ETIGR_ReadStatus(void) uint16_t GD25Q16ETIGR_ReadStatus(void)
{ {
volatile uint16_t empty; volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadStatusRegister1); transmitData(ReadStatusRegister1);
transmitData(0xFF); transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2) while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
@ -93,6 +118,9 @@ uint16_t GD25Q16ETIGR_sector_erase(uint32_t Addr)
if(Err) return Err; if(Err) return Err;
GD25Q16ETIGR_en(); GD25Q16ETIGR_en();
// GD25Q16ETIGR_checkRXFFST();
transmitData(SectorErase); transmitData(SectorErase);
transmitData(Addr>>16); transmitData(Addr>>16);
transmitData(Addr>>8); transmitData(Addr>>8);
@ -117,6 +145,8 @@ uint16_t GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t
Err = GD25Q16ETIGR_WaitStatus(); Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err; if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData); transmitData(ReadData);
transmitData(Addr>>16); transmitData(Addr>>16);
transmitData(Addr>>8); transmitData(Addr>>8);
@ -146,6 +176,8 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
Err = GD25Q16ETIGR_WaitStatus(); Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err; if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData); transmitData(ReadData);
transmitData(Addr>>16); transmitData(Addr>>16);
transmitData(Addr>>8); transmitData(Addr>>8);
@ -161,11 +193,20 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
empty = SpiRegs.SPIRXBUF; empty = SpiRegs.SPIRXBUF;
for(j = 0; j<num_byte; j++) for(j = 0; j<num_byte; j++)
{ {
if(verify_data[j] != SpiRegs.SPIRXBUF) return 1; if(verify_data[j] != SpiRegs.SPIRXBUF) Err++;
} }
return 0;
// GD25Q16ETIGR_checkRXFFST();
return Err;
} }
uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись до 8 байт uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись до 8 байт
{ {
volatile uint16_t empty, i, j; volatile uint16_t empty, i, j;
@ -176,6 +217,9 @@ uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16
if(Err) return Err; if(Err) return Err;
GD25Q16ETIGR_en(); GD25Q16ETIGR_en();
// GD25Q16ETIGR_checkRXFFST();
transmitData(PageProgram); transmitData(PageProgram);
transmitData(Addr>>16); transmitData(Addr>>16);
transmitData(Addr>>8); transmitData(Addr>>8);
@ -196,6 +240,53 @@ uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16
return 0; return 0;
} }
uint32_t ErrAdr[8];
uint16_t GD25Q16ETIGR_write_veryfy_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись и проверка до 8 байт
{
uint16_t addr_write_data[8];
uint16_t addr_read_data[8];
uint16_t i, Err = 0, DoneOK = 0;
for(i = 0; i<num_byte; i++)
{
addr_write_data[i] = write_data[i];
}
Err = GD25Q16ETIGR_write_8_bytes(Addr, addr_write_data, num_byte);
if(Err) return Err;
Err = GD25Q16ETIGR_read_8_bytes(Addr, addr_read_data, num_byte);
if(Err) return Err;
for(i = 0; i<num_byte; i++)
{
if(addr_write_data[i] == addr_read_data[i])
{
DoneOK++;
}
else
{
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data+i, 1);
if(Err) return Err;
Err = GD25Q16ETIGR_read_8_bytes(Addr, addr_read_data, num_byte);
if(Err) return Err;
if(addr_write_data[i] == addr_read_data[i])
{
DoneOK++;
}
else
{
ErrAdr[Err] = Addr+i;
Err++;
}
}
}
return 0;
}
uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data) uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
{ {
uint32_t i=0; uint32_t i=0;
@ -259,7 +350,8 @@ uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * wr
for(i = 0; i < (quant8-8); i += 8) for(i = 0; i < (quant8-8); i += 8)
{ //в этом цикле только полные посылки по 8 байт { //в этом цикле только полные посылки по 8 байт
copy16_to_8(write_data, addr_write_data, 4); copy16_to_8(write_data, addr_write_data, 4);
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8); if(!writeVerify) Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
else Err = GD25Q16ETIGR_write_veryfy_8_bytes(Addr+i, addr_write_data, 8);
if(Err) return Err; if(Err) return Err;
write_data += 4; write_data += 4;
} }
@ -268,7 +360,8 @@ uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * wr
{//тут м.б. от 1 до 8 байт {//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i); quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16); copy16_to_8(write_data, addr_write_data, quant16);
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i)); if(!writeVerify) Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
else Err = GD25Q16ETIGR_write_veryfy_8_bytes(Addr+i, addr_write_data, (quant8 - i));
if(Err) return Err; if(Err) return Err;
} }
return 0; return 0;
@ -314,6 +407,9 @@ uint16_t GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void) uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void)
{ {
volatile uint16_t empty, i, j; volatile uint16_t empty, i, j;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadManufacturerDeviceID); transmitData(ReadManufacturerDeviceID);
for(i = 0; i<5; i++) transmitData(0xFF); for(i = 0; i<5; i++) transmitData(0xFF);

View File

@ -1,7 +1,7 @@
/* /*
* ipc_init.c * ipc_init.c
* *
* Created on: 7 нояб. 2023 г. * Created on: 7 нояб. 2023 г.
* Author: seklyuts * Author: seklyuts
*/ */
@ -140,33 +140,33 @@ void getMessage_from_Cm_Flash(void)
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
break; break;
case WRITE: case WRITE:
FlashSektorStart = Internal_flash_Sektor_Addr(FactAddressFlash); //сектор с которого начинается запись FlashSektorStart = Internal_flash_Sektor_Addr(FactAddressFlash); //сектор с которого начинается запись
FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //сектор в котором конец записи (тот же или следующий, так как размер сектора больше размера буфера) FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //сектор в котором конец записи (тот же или следующий, так как размер сектора больше размера буфера)
if(!BlockWasErased[FlashSektorStart]) if(!BlockWasErased[FlashSektorStart])
{ {
MemOperationError = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его MemOperationError = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его
if(!MemOperationError) BlockWasErased[FlashSektorStart] = 1; if(!MemOperationError) BlockWasErased[FlashSektorStart] = 1;
else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
} }
if(FlashSektorEnd == FlashSektorStart) //если заканчиваем в этом же секторе что и начали, то просто пишем его if(FlashSektorEnd == FlashSektorStart) //если заканчиваем в этом же секторе что и начали, то просто пишем его
{ {
MemOperationError = Internal_flash_Program(FactAddressFlash, InData); MemOperationError = Internal_flash_Program(FactAddressFlash, InData);
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
} }
else //если начали в одном секторе, а заканчиваем в другом то else //если начали в одном секторе, а заканчиваем в другом то
{ {
if(!BlockWasErased[FlashSektorEnd])//стираем второй сектор если он не был стёрт ранее if(!BlockWasErased[FlashSektorEnd])//стираем второй сектор если он не был стёрт ранее
{ {
MemOperationError = Internal_flash_Erase(FactAddressFlash+InData); MemOperationError = Internal_flash_Erase(FactAddressFlash+InData);
if(!MemOperationError)BlockWasErased[FlashSektorEnd] = 1; if(!MemOperationError)BlockWasErased[FlashSektorEnd] = 1;
else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
} }
block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //вычисляем размер первого куска block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //вычисляем размер первого куска
block2 = InData - block1; //и размер куска для второго сектора block2 = InData - block1; //и размер куска для второго сектора
MemOperationError = Internal_flash_Program(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор, MemOperationError = Internal_flash_Program(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор,
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
MemOperationError = Internal_flash_Program(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй MemOperationError = Internal_flash_Program(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
} }
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
break; break;
@ -188,7 +188,7 @@ void getMessage_from_Cm_Flash(void)
#ifdef CPU1 #ifdef CPU1
void getMessage_from_Cm_EMIF(void) void getMessage_from_Cm_EMIF(void)
{ {
uint16_t MemOperationError = 0; // uint16_t MemOperationError = 0;
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, EMIF, 0, 0); return;} if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, EMIF, 0, 0); return;}
if((InAddr+InData) > 0x100000*2) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, EMIF, 0, 0); return;} if((InAddr+InData) > 0x100000*2) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, EMIF, 0, 0); return;}
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, EMIF, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, EMIF, 0, 0);
@ -217,7 +217,7 @@ void getMessage_from_Cm_BL25CM1A(void)
{ {
uint16_t MemOperationError = 0; uint16_t MemOperationError = 0;
if((InData > 2048*2)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, BL25CM1A_1M_bit_SPI, 0, 0); return;} if((InData > 2048*2)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, BL25CM1A_1M_bit_SPI, 0, 0); return;}
if((InAddr+InData) > (BL25CM1A0_SIZE*2)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, BL25CM1A_1M_bit_SPI, 0, 0); return;} if( ((InAddr+InData) > (BL25CM1A0_SIZE*2))||((InAddr) > (BL25CM1A0_SIZE*2)) ){IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, BL25CM1A_1M_bit_SPI, 0, 0); return;}
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, BL25CM1A_1M_bit_SPI, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, BL25CM1A_1M_bit_SPI, 0, 0);
spi_TurnOffCS1_GD25Q16E(); spi_TurnOffCS1_GD25Q16E();
@ -248,8 +248,10 @@ void getMessage_from_Cm_BL25CM1A(void)
void getMessage_from_Cm_GD25Q16E(void) void getMessage_from_Cm_GD25Q16E(void)
{ {
uint16_t MemOperationError = 0; uint16_t MemOperationError = 0;
uint32_t EndOfAdr = (InAddr+InData);
if((InData > (2048*2))||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, GD25Q16E_16M_bit_SPI, 0, 0); return;} if((InData > (2048*2))||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, GD25Q16E_16M_bit_SPI, 0, 0); return;}
if((InAddr+InData) > (GD25Q16E_SIZE*2)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, GD25Q16E_16M_bit_SPI, 0, 0); return;} if( (EndOfAdr > (GD25Q16E_SIZE*2)) || (InAddr > (GD25Q16E_SIZE*2)) ) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, GD25Q16E_16M_bit_SPI, 0, 0); return;}
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, GD25Q16E_16M_bit_SPI, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, GD25Q16E_16M_bit_SPI, 0, 0);
Gpio_SPI_CS_BL25CM1A(1); Gpio_SPI_CS_BL25CM1A(1);
@ -390,7 +392,7 @@ void ipc_run(void)
// CmConfRegs.CMRESCTL.all = SYSCTL_CMRESCTL_RESET | SYSCTL_REG_KEY;//.bit.RESETSTS = 1; // CmConfRegs.CMRESCTL.all = SYSCTL_CMRESCTL_RESET | SYSCTL_REG_KEY;//.bit.RESETSTS = 1;
// DevCfgRegs.CPU2RESCTL.all = ((uint32_t)SYSCTL_CPU2RESCTL_RESET |(SYSCTL_REG_KEY & SYSCTL_CPU2RESCTL_KEY_M)); //.bit.RESET = 1; // DevCfgRegs.CPU2RESCTL.all = ((uint32_t)SYSCTL_CPU2RESCTL_RESET |(SYSCTL_REG_KEY & SYSCTL_CPU2RESCTL_KEY_M)); //.bit.RESET = 1;
// EDIS; // EDIS;
CpuSysRegs.SIMRESET.all = ((uint32_t)SYSCTL_REG_KEY | (uint32_t)1);//программный сброс всех контроллеров CpuSysRegs.SIMRESET.all = ((uint32_t)SYSCTL_REG_KEY | (uint32_t)1);//программный сброс всех контроллеров
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0); IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0);
IPC_setFlagLtoR(IPC_CPU1_L_CM_R,(1<<0)); IPC_setFlagLtoR(IPC_CPU1_L_CM_R,(1<<0));
ReadFromCm = 0; ReadFromCm = 0;
@ -425,4 +427,3 @@ void ipc_run(void)
ReadFromCm = 0; ReadFromCm = 0;
} }
} }

View File

@ -1,7 +1,7 @@
/* /*
* interrupts.c * interrupts.c
* *
* Created on: 21 àâã. 2023 ã. * Created on: 21 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: seklyuts * Author: seklyuts
*/ */
@ -21,7 +21,7 @@ volatile uint16_t PWM_out = 2500;
uint16_t Fault = 0, Fault_fix = 0, Ready = 0, Ready_Fix = 0; uint16_t Fault = 0, Fault_fix = 0, Ready = 0, Ready_Fix = 0;
uint16_t counter1s=0; uint16_t counter1s=0;
uint16_t FaultABC = 0, FaultABCFix = 0; uint16_t FaultABC = 0, FaultABCFix = 0;
uint16_t PwmFlagStartADC = 0; uint16_t PwmFlagStartCurrentMeashure = 0;
typedef struct typedef struct
{ {

View File

@ -1,7 +1,7 @@
/* /*
* spi_init.c * spi_init.c
* *
* Created on: 5 ñåíò. 2023 ã. * Created on: 5 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* Author: seklyuts * Author: seklyuts
*/ */