MotorControlModuleSDFM_TMS3.../Projects/mem_test/src/Peripherals/ipc_init.c
Eugene 1675ae9fce Выбрана другая ф-ция записи во флеш
В тестовую прогу для CM добавлена ф-ция проверки серии записей
2023-11-28 12:35:49 +03:00

399 lines
14 KiB
C

/*
* ipc_init.c
*
* Created on: 7 íîÿá. 2023 ã.
* Author: seklyuts
*/
//
// Included Files
#include "f28x_project.h"
#include "hw_memmap.h"
#include "ipc.h"
#include "flash_programming_f2838x_c28x.h"
#include "internal_flash.h"
#ifdef CPU1
#include "ZD24C02A.h"
#include "BL25CM1A.h"
#include "GD25Q16ETIGR.h"
#include "emif_init.h"
#endif
//#pragma DATA_SECTION(readData, "MSGRAM_CPU_TO_CM")
//uint32_t readData[10];
#define WRONG_COMMAND 0x10
#define ERROR_VERIFY 0x11
#define FLASH_ERR 0x12
#define FLASH_FAIL 0x13
#define FLASH_ECC_FAIL 0x14
#define WRONG_LENGHT 0x15
#define WRONG_ADDR 0x16
#define WRONG_ID 0x17
#define COMMAND_ACCEPTED 0x20
#define DONE_SUCCESS 0x21
#define INT_FLASH 0xA0
#define EMIF 0xA1
#define BL25CM1A_1M_bit_SPI 0xA2
#define GD25Q16E_16M_bit_SPI 0xA3
#define ZD24C02A_2K_I2C 0xA4
typedef enum
{
READ,
WRITE,
VERIFY,
END = 0xFF
} Command_Type_t;
uint32_t pass, WriteToCm=0, ReadFromCm=0;
IPC_MessageQueue_t messageQueue;
IPC_Message_t TxMsg, RxMsg;
uint16_t IntNum = 0;
uint16_t GetMes[16];
uint16_t PutMes[16] = {2,5,6,8,9,4,2,5,4,3,1,6,4,2,8,6};
uint32_t Command, StartAddr, Data;
uint32_t InCommand,InAddr,InData;
uint16_t BlockWasErased[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint16_t * FlashAddress = (uint16_t *)Bzero_Sector0_start;
void putFlashMessage_to_Cm(uint32_t ReadAddress, uint16_t Num)
{
uint16_t * PutToCmBuff;
uint16_t i;
PutToCmBuff = (uint16_t *)CPUXTOCMMSGRAM0_BASE;
FlashAddress = (uint16_t *)(ReadAddress);
for(i=0; i < Num; i++)
{
PutToCmBuff[i] = FlashAddress[i];
}
}
uint16_t verifyFlashMessage_to_Cm(uint32_t ReadAddress, uint16_t Num)
{
uint16_t * GetFromCmBuff;
uint16_t i, Err = 0;
GetFromCmBuff = (uint16_t *)CMTOCPUXMSGRAM0_BASE;
FlashAddress = (uint16_t *)(ReadAddress);
for(i=0; i < Num; i++)
{
if(GetFromCmBuff[i] != FlashAddress[i]) Err++;
}
return Err;
}
void clear_BlockWasErased(void)
{
uint16_t i;
for(i=0; i < 14; i++)
{
BlockWasErased[i] = 0;
}
}
void getMessage_from_Cm_Flash(void)
{
uint16_t FlashSektorStart = 0;
uint16_t FlashSektorEnd = 0;
uint32_t FactAddressFlash = Bzero_Sector0_start;
uint32_t block1, block2;
uint16_t MemOperationError = 0;
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, INT_FLASH, 0, 0); return;}
if((InAddr+InData) > 0x40000) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, INT_FLASH, 0, 0); return;}
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, INT_FLASH, 0, 0);
FactAddressFlash = InAddr + Bzero_Sector0_start;
switch(InCommand >> 16)
{
case READ:
putFlashMessage_to_Cm(FactAddressFlash, InData);
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); //ñåêòîð â êîòîðîì êîíåö çàïèñè (òîò æå èëè ñëåäóþùèé, òàê êàê ðàçìåð ñåêòîðà áîëüøå ðàçìåðà áóôåðà)
if(!BlockWasErased[FlashSektorStart])
{
MemOperationError = Internal_flash_Erase(FactAddressFlash); // åñëè ñåêòîð ñ êîòîðîãî íà÷èíàåì çàïèñü íå áûë ñò¸ðò, òî ñòèðàåì åãî
if(!MemOperationError) BlockWasErased[FlashSektorStart] = 1;
else {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
}
if(FlashSektorEnd == FlashSektorStart) //åñëè çàêàí÷èâàåì â ýòîì æå ñåêòîðå ÷òî è íà÷àëè, òî ïðîñòî ïèøåì åãî
{
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(FactAddressFlash, InData);
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
}
else //åñëè íà÷àëè â îäíîì ñåêòîðå, à çàêàí÷èâàåì â äðóãîì òî
{
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;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
}
block1 = internal_flash_FlashBankStartAddr(FlashSektorEnd)-FactAddressFlash; //âû÷èñëÿåì ðàçìåð ïåðâîãî êóñêà
block2 = InData - block1; //è ðàçìåð êóñêà äëÿ âòîðîãî ñåêòîðà
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(FactAddressFlash, block1); // è ïèøåì ñïåðâà êóñîê â ïåðâûé ñåêòîð,
if(MemOperationError) {IPC_sendCommand(IPC_CPU1_L_CM_R, MemOperationError, INT_FLASH, 0, 0); return;}//åñëè îøèáêà -- îòïðàâëÿåì ñîîáùåíèå è çàâåðøàåì
MemOperationError = Internal_flash_lib_ProgramUsingDataAndECC(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;
case VERIFY:
MemOperationError = verifyFlashMessage_to_Cm(FactAddressFlash, InData);
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, INT_FLASH, MemOperationError, 0);
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, INT_FLASH, 0, 0);
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);
break;
}
}
#ifdef CPU1
void getMessage_from_Cm_EMIF(void)
{
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) {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);
switch(InCommand >> 16)
{
case READ:
break;
case WRITE:
break;
case VERIFY:
break;
case END:
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, EMIF, 0, 0);
break;
default:
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, EMIF, 0, 0);
break;
}
}
void getMessage_from_Cm_BL25CM1A(void)
{
uint16_t MemOperationError = 0;
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, BL25CM1A_1M_bit_SPI, 0, 0); return;}
if((InAddr+InData) > BL25CM1A0_SIZE) {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();
switch(InCommand >> 16)
{
case READ:
Bl25cm1a_read_data(2*InAddr, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
break;
case WRITE:
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;
case VERIFY:
MemOperationError = Bl25cm1a_verify_data(2*InAddr, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, BL25CM1A_1M_bit_SPI, 0, 0);
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
break;
case END:
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, BL25CM1A_1M_bit_SPI, 0, 0);
break;
default:
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, BL25CM1A_1M_bit_SPI, 0, 0);
break;
}
}
void getMessage_from_Cm_GD25Q16E(void)
{
uint16_t MemOperationError = 0;
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, GD25Q16E_16M_bit_SPI, 0, 0); return;}
if((InAddr+InData) > GD25Q16E_SIZE) {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);
Gpio15outSPI_CS_BL25CM1A(1);
spi_TurnOnCS1_GD25Q16E();
switch(InCommand >> 16)
{
case READ:
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, (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, (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;
case END:
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, GD25Q16E_16M_bit_SPI, 0, 0);
break;
default:
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, GD25Q16E_16M_bit_SPI, 0, 0);
GD25Q16ETIGR_clean_SectorWasErraised();
break;
}
spi_TurnOffCS1_GD25Q16E();
}
void getMessage_from_Cm_ZD24C02A(void)
{
uint16_t MemOperationError = 0;
uint16_t I2CErr = 0;
if((InData > 2048)||(InData == 0)) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_LENGHT, ZD24C02A_2K_I2C, 0, 0); return;}
if((InAddr+InData) > ZD24C02A_SIZE) {IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ADDR, ZD24C02A_2K_I2C, 0, 0); return;}
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0);
switch(InCommand >> 16)
{
case READ:
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, (uint16_t *)CMTOCPUXMSGRAM0_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 VERIFY:
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);
break;
case END:
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, ZD24C02A_2K_I2C, 0, 0);
break;
default:
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, ZD24C02A_2K_I2C, 0, 0);
break;
}
}
#endif
__interrupt void IPC_ISR0()
{
IPC_ackFlagRtoL(IPC_CPU1_L_CM_R, (1<<0));
PieCtrlRegs.PIEACK.all = PIEACK_GROUP11;
if(ReadFromCm == 0) ReadFromCm = 1;
}
//__interrupt void IPC_ISR1()
//{
// getMessage_from_Cm();
// if(WriteToCm != 2)
// {
//putMessage_to_Cm();
//IPC_sendCommand(IPC_CPU1_L_CM_R, 0, 0, Command, Address, Data);
// }
// else WriteToCm = 0;
//
// Acknowledge the flag
//
// IPC_ackFlagRtoL(IPC_CPU1_L_CM_R, (1<<1));
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP11;
//}
void ipc_init(void)
{
//
// Clear any IPC flags if set already
//
IPC_clearFlagLtoR(IPC_CPU1_L_CM_R, IPC_FLAG_ALL);
EALLOW;
PieVectTable.CMTOCPUXIPC0_INT = &IPC_ISR0;
// PieVectTable.CMTOCPUXIPC1_INT = &IPC_ISR1;
EDIS;
IER |= M_INT11;
PieCtrlRegs.PIEIER11.bit.INTx9 = 1;
// PieCtrlRegs.PIEIER11.bit.INTx10 = 1;
//
// Initialize message queue
//
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)
{
if(ReadFromCm == 1)
{
ReadFromCm = 2;
IPC_readCommand(IPC_CPU1_L_CM_R, 0, 0, &InCommand, &InAddr, &InData );
switch(InCommand & 0xFFFF)
{
case INT_FLASH:
getMessage_from_Cm_Flash();
break;
#ifdef CPU1
case EMIF:
getMessage_from_Cm_EMIF();
break;
case BL25CM1A_1M_bit_SPI:
getMessage_from_Cm_BL25CM1A();
break;
case GD25Q16E_16M_bit_SPI:
getMessage_from_Cm_GD25Q16E();
break;
case ZD24C02A_2K_I2C:
getMessage_from_Cm_ZD24C02A();
break;
#endif
default:
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_ID, 0, 0, 0);
break;
}
IPC_setFlagLtoR(IPC_CPU1_L_CM_R,(1<<0));
ReadFromCm = 0;
}
}