253 lines
8.5 KiB
C
253 lines
8.5 KiB
C
|
/**
|
|||
|
* @copyright 2015 Indie Semiconductor.
|
|||
|
*
|
|||
|
* This file is proprietary to Indie Semiconductor.
|
|||
|
* All rights reserved. Reproduction or distribution, in whole
|
|||
|
* or in part, is forbidden except by express written permission
|
|||
|
* of Indie Semiconductor.
|
|||
|
*
|
|||
|
* @file pdsTask.c
|
|||
|
* @Author: Jack.Pan
|
|||
|
* @E-mail:jack.pan@indiemicro.com
|
|||
|
* @Date: 2020/09/10
|
|||
|
*/
|
|||
|
#include <applicationTask.h>
|
|||
|
#include <pdsTask.h>
|
|||
|
#include <crc32.h>
|
|||
|
#include <meta.h>
|
|||
|
#include <motorControlTask.h>
|
|||
|
#include <flash_device.h>
|
|||
|
#include <flash_sfrs.h>
|
|||
|
#include <linsNodeCfgIdentify.h>
|
|||
|
#include <linStackTask.h>
|
|||
|
#include <linSlaveTask.h>
|
|||
|
#include <crc_sfr.h>
|
|||
|
|
|||
|
uint8_t pds_store(uint8_t index);
|
|||
|
|
|||
|
static SystemParams_t systemParam;
|
|||
|
static Userdata_t userdata;
|
|||
|
static TaskState_t pdsState = TASK_STATE_INIT;
|
|||
|
static PdsStatus_t pdsStatus = PDS_STATUS_USING_NORMAL;
|
|||
|
|
|||
|
#define PDS_ACTIVE_DATA_INDEX (0U)
|
|||
|
#define PDS_ACTIVE_DATA_BACKUP_INDEX (1U)
|
|||
|
|
|||
|
void PDS_PowerONRead_MotorParamfromFlash(uint16_t *buff,uint16_t leng)
|
|||
|
{
|
|||
|
for (uint16_t i = 0U; i < leng; i++){
|
|||
|
*buff = systemParam.info.motorParams.data16[i];
|
|||
|
buff++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void PDS_Init(void)
|
|||
|
{
|
|||
|
uint32_t crcValue;
|
|||
|
uint32_t crcValueuserdata;
|
|||
|
CRC32_Init();
|
|||
|
|
|||
|
Userdata_t *Motorstep= (Userdata_t *)FLASH_START_ADDRESS_USER_DATA;
|
|||
|
crcValueuserdata = CRC32_GetRunTimeCRC32((uint8_t *)&Motorstep->info ,(uint16_t)sizeof(Motorstep->info));
|
|||
|
|
|||
|
if(crcValueuserdata == Motorstep->head.crc32){
|
|||
|
userdata = *Motorstep;
|
|||
|
}else{
|
|||
|
userdata.info.data[0] = 0;
|
|||
|
userdata.info.data[1] = 0;
|
|||
|
}
|
|||
|
|
|||
|
CRC32_Init();
|
|||
|
SystemParams_t *param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA;
|
|||
|
crcValue = CRC32_GetRunTimeCRC32((uint8_t *)¶m->info ,(uint16_t)sizeof(param->info));
|
|||
|
if (crcValue == param->head.crc32){
|
|||
|
systemParam = *param;
|
|||
|
pdsStatus = PDS_STATUS_USING_NORMAL;
|
|||
|
}else{
|
|||
|
param = (SystemParams_t *)FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP;
|
|||
|
crcValue = CRC32_GetRunTimeCRC32((uint8_t *)¶m->info ,(uint16_t)sizeof(param->info));
|
|||
|
if (crcValue == param->head.crc32){
|
|||
|
systemParam = *param;
|
|||
|
pdsStatus = PDS_STATUS_USING_BACKUP;
|
|||
|
}else{
|
|||
|
pdsStatus = PDS_STATUS_USING_DEFAULT;
|
|||
|
}
|
|||
|
}
|
|||
|
pdsStatus = PDS_STATUS_USING_DEFAULT;
|
|||
|
if (pdsStatus == PDS_STATUS_USING_DEFAULT){
|
|||
|
/* **********************fix LIN configuration default value ************************************/
|
|||
|
systemParam.head.index = 0U;
|
|||
|
systemParam.info.linParams.nad = INIT_LINS_NAD_ADDR;
|
|||
|
systemParam.info.linParams.supplierID = LINS_SUPPLIER_ID;
|
|||
|
systemParam.info.linParams.functionID = LINS_FUNCTION_ID;
|
|||
|
systemParam.info.linParams.variant = LINS_VARIANT;
|
|||
|
systemParam.info.linParams.serialNo = LINS_SERIAL_NO;
|
|||
|
systemParam.info.linParams.fwVersion = LINS_FW_VERSION;
|
|||
|
systemParam.info.linParams.hwVersion = LINS_HW_VERSION;
|
|||
|
|
|||
|
systemParam.info.motorParams.Constantspeed = DEFAULT_CONSTANTSPEED;
|
|||
|
systemParam.info.motorParams.startspeed = DEFAULT_STARTSPEED;
|
|||
|
systemParam.info.motorParams.Slowspeed = DEFAULT_SLOWSPEED;
|
|||
|
systemParam.info.motorParams.MotorlockAcoilvoltage = DEFAULT_ACOILVOLTAGE;
|
|||
|
systemParam.info.motorParams.MotorlockBcoilvoltage = DEFAULT_BCOILVOLTAGE;
|
|||
|
systemParam.info.motorParams.ClimbTime = DEFAULT_CLIMBTIME;
|
|||
|
systemParam.info.motorParams.SlowTime = DEFAULT_SLOWTIME;
|
|||
|
|
|||
|
// GetMotorPhyParam[0] = systemParam.info.motorParams.Constantspeed;//Constantspeed us/step
|
|||
|
// GetMotorPhyParam[1] = systemParam.info.motorParams.startspeed;//Motorlock startspeed us/step
|
|||
|
// GetMotorPhyParam[2] = systemParam.info.motorParams.Slowspeed;//Motorlock Slowspeed us/step
|
|||
|
// GetMotorPhyParam[3] = systemParam.info.motorParams.MotorlockAcoilvoltage;//Motorlock Acoil voltage
|
|||
|
// GetMotorPhyParam[4] = systemParam.info.motorParams.MotorlockBcoilvoltage;//Motorlock Bcoil voltage
|
|||
|
// GetMotorPhyParam[5] = systemParam.info.motorParams.ClimbTime + (uint16_t)systemParam.info.motorParams.SlowTime << 8;//ClimbTime: ms low8bit, SlowTime: ms high8bit
|
|||
|
|
|||
|
|
|||
|
LIN_Device_Frame_t volatile *frame = LINS_GetUcndFramesTable(&systemParam.info.linParams.frameIDSize);
|
|||
|
for (uint8_t i = 0; i < systemParam.info.linParams.frameIDSize; i++){
|
|||
|
systemParam.info.linParams.frameInfo[i].frameId = frame[i].frame_id;
|
|||
|
systemParam.info.linParams.frameInfo[i].frameIsValid = TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
ls_set_initialNad(INIT_LINS_NAD_ADDR);
|
|||
|
ls_set_nad(INIT_LINS_NAD_ADDR);
|
|||
|
/* must be call here for init LIN param */
|
|||
|
LNCI_Init();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
uint8_t pds_store(uint8_t index)
|
|||
|
{
|
|||
|
/****************************************************************************************************************/
|
|||
|
static uint16_t motorbuffdata[TransferCNT];
|
|||
|
/*Take out new parameters for the motor through the 3C command*/
|
|||
|
LINS_Transfer3CdataToPDS(motorbuffdata,TransferCNT);
|
|||
|
for(uint8_t n=0;n<TransferCNT;n++){
|
|||
|
systemParam.info.motorParams.data16[n] = motorbuffdata[n];
|
|||
|
}
|
|||
|
|
|||
|
uint16_t wordLength;
|
|||
|
uint32_t *pWord = (uint32_t *)((void *)&systemParam);
|
|||
|
uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(&systemParam.info) ,(uint16_t)sizeof(systemParam.info));
|
|||
|
systemParam.head.crc32 = crcValue;
|
|||
|
systemParam.head.index ++;
|
|||
|
|
|||
|
/* sizeof(SystemParams_t) is the timers of word */
|
|||
|
wordLength = ((uint16_t)sizeof(SystemParams_t) >> 2U);
|
|||
|
|
|||
|
pdsStatus = PDS_STATUS_USING_NORMAL;
|
|||
|
|
|||
|
if (index == PDS_ACTIVE_DATA_INDEX){
|
|||
|
/*write sys data normal*/
|
|||
|
f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA);
|
|||
|
for (uint32_t i = 0; i < wordLength; i+=2){
|
|||
|
f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA +i*4U, pWord[i],pWord[i+1]);
|
|||
|
}
|
|||
|
}else{
|
|||
|
/*write sys data back up*/
|
|||
|
f_FLASH_EraseSector(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP);
|
|||
|
for (uint32_t i = 0; i < wordLength; i++){
|
|||
|
f_FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_SYSTEM_DATA_BACK_UP +i*4U, pWord[i],pWord[i+1]);
|
|||
|
}
|
|||
|
}
|
|||
|
return 0U;
|
|||
|
}
|
|||
|
|
|||
|
void userdatapds_store(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
{
|
|||
|
/****************************************************************************************************************/
|
|||
|
|
|||
|
userdata.info.data[0] = Motor_GetCurrentPosition();
|
|||
|
userdata.info.data[1] = Motor_GetCurrentPosition() >> 16U;
|
|||
|
|
|||
|
uint16_t wordLength;
|
|||
|
uint32_t *pWord = (uint32_t *)((void *)&userdata);
|
|||
|
uint32_t crcValue = CRC32_GetRunTimeCRC32((uint8_t *)(&userdata.info) ,(uint16_t)sizeof(userdata.info));
|
|||
|
userdata.head.crc32 = crcValue;
|
|||
|
userdata.head.index ++;
|
|||
|
|
|||
|
Flash_EraseSector(FLASH_START_ADDRESS_USER_DATA);
|
|||
|
|
|||
|
/* sizeof(Userdata_t) is the timers of word */
|
|||
|
wordLength = ((uint32_t)sizeof(Userdata_t) >> 2U);
|
|||
|
|
|||
|
/*write sys data normal*/
|
|||
|
for (uint32_t i = 0; i < wordLength; i++){
|
|||
|
FLASH_Write2WordsWithECC(FLASH_START_ADDRESS_USER_DATA+i*8U,pWord[i*2],pWord[i*2+1]);
|
|||
|
}
|
|||
|
|
|||
|
// CRC32_Init();
|
|||
|
|
|||
|
// Userdata_t *Motorstep= (Userdata_t *)FLASH_START_ADDRESS_USER_DATA;
|
|||
|
// uint32_t crcValueuserdata = CRC32_GetRunTimeCRC32((uint8_t *)&Motorstep->info ,(uint16_t)sizeof(Motorstep->info));
|
|||
|
|
|||
|
// if(crcValueuserdata == Motorstep->head.crc32){
|
|||
|
// userdata = *Motorstep;
|
|||
|
// }else{
|
|||
|
// userdata.info.data[0] = 0;
|
|||
|
// userdata.info.data[1] = 0;
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
MotorClusterParams_t *PDS_GetMotorParam(void)
|
|||
|
{
|
|||
|
return &systemParam.info.motorParams;
|
|||
|
}
|
|||
|
|
|||
|
LINClusterParams_t *PDS_GetLINParam(void)
|
|||
|
{
|
|||
|
return &systemParam.info.linParams;
|
|||
|
}
|
|||
|
|
|||
|
PdsStatus_t PDS_GetPdsStatus(void)
|
|||
|
{
|
|||
|
return pdsStatus;
|
|||
|
}
|
|||
|
|
|||
|
uint32_t PDS_GetMotorstepnfromflash(void)
|
|||
|
{
|
|||
|
uint32_t motorstepn = 0;
|
|||
|
motorstepn = userdata.info.data[1];
|
|||
|
motorstepn <<= 16U;
|
|||
|
motorstepn += userdata.info.data[0];
|
|||
|
|
|||
|
return motorstepn;
|
|||
|
}
|
|||
|
|
|||
|
void PDS_TaskHandler(void)
|
|||
|
{
|
|||
|
switch(pdsState){
|
|||
|
case TASK_STATE_INIT:
|
|||
|
pdsState = TASK_STATE_ACTIVE;
|
|||
|
break;
|
|||
|
case TASK_STATE_ACTIVE:
|
|||
|
/* storage system parameters */
|
|||
|
(void)pds_store(PDS_ACTIVE_DATA_INDEX);
|
|||
|
pdsState = TASK_STATE_PROCESSING;
|
|||
|
//TM_PostTask(TASK_ID_PDS);
|
|||
|
break;
|
|||
|
case TASK_STATE_PROCESSING:
|
|||
|
/* storage system parameters backup*/
|
|||
|
(void)pds_store(PDS_ACTIVE_DATA_BACKUP_INDEX);
|
|||
|
/* set save parameters flag for lin stack*/
|
|||
|
(void)ls_save_configuration();
|
|||
|
pdsState = TASK_STATE_ACTIVE;
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|