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

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();
for(;;)
{
asm (" NOP");
// asm (" NOP");
ipc_run();
#ifdef CPU1
//#ifdef CPU1
// emif_run();
// frmmstr_run();
#endif
//#endif
}
}

View File

@ -29,6 +29,29 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
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)
{
@ -43,6 +66,7 @@ void GD25Q16ETIGR_clean_SectorWasErraised(void)
void GD25Q16ETIGR_en(void)
{
volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(WriteEnable);
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
{
@ -54,6 +78,7 @@ void GD25Q16ETIGR_en(void)
uint16_t GD25Q16ETIGR_ReadStatus(void)
{
volatile uint16_t empty;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadStatusRegister1);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
@ -93,6 +118,9 @@ uint16_t GD25Q16ETIGR_sector_erase(uint32_t Addr)
if(Err) return Err;
GD25Q16ETIGR_en();
// GD25Q16ETIGR_checkRXFFST();
transmitData(SectorErase);
transmitData(Addr>>16);
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();
if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData);
transmitData(Addr>>16);
transmitData(Addr>>8);
@ -146,6 +176,8 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
Err = GD25Q16ETIGR_WaitStatus();
if(Err) return Err;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadData);
transmitData(Addr>>16);
transmitData(Addr>>8);
@ -161,11 +193,20 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
empty = SpiRegs.SPIRXBUF;
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 байт
{
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;
GD25Q16ETIGR_en();
// GD25Q16ETIGR_checkRXFFST();
transmitData(PageProgram);
transmitData(Addr>>16);
transmitData(Addr>>8);
@ -196,6 +240,53 @@ uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16
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)
{
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)
{ //в этом цикле только полные посылки по 8 байт
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;
write_data += 4;
}
@ -268,7 +360,8 @@ uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * wr
{//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i);
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;
}
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)
{
volatile uint16_t empty, i, j;
// GD25Q16ETIGR_checkRXFFST();
transmitData(ReadManufacturerDeviceID);
for(i = 0; i<5; i++) transmitData(0xFF);

View File

@ -1,7 +1,7 @@
/*
* ipc_init.c
*
* Created on: 7 нояб. 2023 г.
* Created on: 7 нояб. 2023 г.
* 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);
break;
case WRITE:
FlashSektorStart = Internal_flash_Sektor_Addr(FactAddressFlash); //сектор с которого начинается запись
FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //сектор в котором конец записи (тот же или следующий, так как размер сектора больше размера буфера)
FlashSektorStart = Internal_flash_Sektor_Addr(FactAddressFlash); //сектор с которого начинается запись
FlashSektorEnd = Internal_flash_Sektor_Addr(FactAddressFlash + InData - 1); //сектор в котором конец записи (тот же или следующий, так как размер сектора больше размера буфера)
if(!BlockWasErased[FlashSektorStart])
{
MemOperationError = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его
MemOperationError = Internal_flash_Erase(FactAddressFlash); // если сектор с которого начинаем запись не был стёрт, то стираем его
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);
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);
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; //вычисляем размер первого куска
block2 = InData - block1; //и размер куска для второго сектора
MemOperationError = Internal_flash_Program(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор,
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
MemOperationError = Internal_flash_Program(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //вычисляем размер первого куска
block2 = InData - block1; //и размер куска для второго сектора
MemOperationError = Internal_flash_Program(FactAddressFlash, block1); // и пишем сперва кусок в первый сектор,
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//если ошибка -- отправляем сообщение и завершаем
MemOperationError = Internal_flash_Program(internal_flash_FlashBankStartAddr(FlashSektorEnd), block2); // потом кусок во второй
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);
break;
@ -188,7 +188,7 @@ void getMessage_from_Cm_Flash(void)
#ifdef CPU1
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((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);
@ -217,7 +217,7 @@ void getMessage_from_Cm_BL25CM1A(void)
{
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((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);
spi_TurnOffCS1_GD25Q16E();
@ -248,8 +248,10 @@ void getMessage_from_Cm_BL25CM1A(void)
void getMessage_from_Cm_GD25Q16E(void)
{
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((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);
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;
// DevCfgRegs.CPU2RESCTL.all = ((uint32_t)SYSCTL_CPU2RESCTL_RESET |(SYSCTL_REG_KEY & SYSCTL_CPU2RESCTL_KEY_M)); //.bit.RESET = 1;
// 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_setFlagLtoR(IPC_CPU1_L_CM_R,(1<<0));
ReadFromCm = 0;
@ -425,4 +427,3 @@ void ipc_run(void)
ReadFromCm = 0;
}
}

View File

@ -1,7 +1,7 @@
/*
* interrupts.c
*
* Created on: 21 àâã. 2023 ã.
* Created on: 21 <EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
* 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 counter1s=0;
uint16_t FaultABC = 0, FaultABCFix = 0;
uint16_t PwmFlagStartADC = 0;
uint16_t PwmFlagStartCurrentMeashure = 0;
typedef struct
{

View File

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