исправлен баг с записью во флеш
This commit is contained in:
parent
4fb36f9e64
commit
008a4a2fc0
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* spi_init.c
|
||||
*
|
||||
* Created on: 5 ñåíò. 2023 ã.
|
||||
* Created on: 5 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. 2023 <EFBFBD>.
|
||||
* Author: seklyuts
|
||||
*/
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user