fix: Implement error handling for CAN
parent
85a15dc97f
commit
17131c3a34
|
|
@ -19,6 +19,8 @@ encoding//Debug/ivec_ECU/ivec_ecu_common/src/subdir_rules.mk=UTF-8
|
|||
encoding//Debug/ivec_ECU/ivec_ecu_common/src/subdir_vars.mk=UTF-8
|
||||
encoding//Debug/ivec_ECU/ivec_ecu_uart/src/subdir_rules.mk=UTF-8
|
||||
encoding//Debug/ivec_ECU/ivec_ecu_uart/src/subdir_vars.mk=UTF-8
|
||||
encoding//Debug/ivec_cmplx_gptimer/src/subdir_rules.mk=UTF-8
|
||||
encoding//Debug/ivec_cmplx_gptimer/src/subdir_vars.mk=UTF-8
|
||||
encoding//Debug/makefile=UTF-8
|
||||
encoding//Debug/objects.mk=UTF-8
|
||||
encoding//Debug/sources.mk=UTF-8
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ extern uint16_t idx;
|
|||
uint32_t IntrStatus;
|
||||
static volatile uint8_t u8_MCAN_StatusFlag = IVEC_MCAL_STATUS_ERROR;
|
||||
uint8_t g_CanData[8];
|
||||
volatile DL_MCAN_ProtocolStatus HeaderStat;
|
||||
|
||||
|
||||
/*REQUIRED MCAN CONFIGS*/
|
||||
|
|
@ -272,6 +273,23 @@ static void ErrorHandler()
|
|||
void CANFD0_IRQHandler(void)
|
||||
{
|
||||
IntrStatus = DL_MCAN_getIntrStatus(CANFD0);
|
||||
DL_MCAN_getProtocolStatus(CANFD0, &HeaderStat);
|
||||
|
||||
if(HeaderStat.busOffStatus==1)
|
||||
{
|
||||
DL_MCAN_setOpMode(CANFD0, DL_MCAN_OPERATION_MODE_NORMAL);
|
||||
|
||||
}
|
||||
else if (HeaderStat.lastErrCode == 4) {
|
||||
// Initiate bus-off recovery
|
||||
int status = -1;
|
||||
printf("Attempting recovery...\n");
|
||||
xECU_CanReInit(CANFD0 ,BAUD_500);
|
||||
if(status == 0)
|
||||
{
|
||||
printf("done\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (IntrStatus & DL_MCAN_INTERRUPT_TC){
|
||||
__asm("nop");
|
||||
|
|
@ -323,7 +341,7 @@ void CANFD0_IRQHandler(void)
|
|||
DL_MCAN_getIntrStatus(CANFD0);
|
||||
DL_MCAN_clearIntrStatus(CANFD0, IntrStatus,DL_MCAN_INTR_SRC_MCAN_LINE_1);
|
||||
}
|
||||
ErrorHandler();
|
||||
//ErrorHandler();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -431,6 +449,8 @@ IVEC_McalStatus_e xMCAL_MCANDeInit(MCAN_Regs* MCAN)
|
|||
{
|
||||
assert(MCAN == CANFD0);
|
||||
assert(b_MCAN_InitFlag != 0);
|
||||
DL_MCAN_disableInterrupt(MCAN, (DL_MCAN_MSP_INTERRUPT_LINE1));
|
||||
NVIC_DisableIRQ(CANFD0_INT_IRQn);
|
||||
|
||||
DL_MCAN_disablePower(MCAN);
|
||||
b_MCAN_InitFlag = 0;
|
||||
|
|
@ -451,6 +471,7 @@ IVEC_McalStatus_e xMCAL_MCANTx(MCAN_Regs *MCAN, DL_MCAN_TxBufElement *TxMsg ,uin
|
|||
{
|
||||
assert(MCAN == CANFD0);
|
||||
assert(b_MCAN_InitFlag != 0);
|
||||
int result = -1;
|
||||
|
||||
for(int i=0;i<Bytes;i++)
|
||||
{
|
||||
|
|
@ -460,13 +481,23 @@ IVEC_McalStatus_e xMCAL_MCANTx(MCAN_Regs *MCAN, DL_MCAN_TxBufElement *TxMsg ,uin
|
|||
// uint32_t txPendingStatus;
|
||||
//
|
||||
// //Check if the Tx Buffer is available (no pending request)
|
||||
//txPendingStatus = DL_MCAN_getTxBufReqPend(MCAN);
|
||||
|
||||
// Check if the specified buffer (BufNum) is available
|
||||
// txPendingStatus = DL_MCAN_getTxBufReqPend(MCAN);
|
||||
//
|
||||
// //Check if the specified buffer (BufNum) is available
|
||||
// if ((txPendingStatus & (1 << BufNum)) == 0)
|
||||
// {
|
||||
DL_MCAN_writeMsgRam(MCAN, DL_MCAN_MEM_TYPE_BUF, BufNum , TxMsg);
|
||||
DL_MCAN_TXBufAddReq(MCAN, BufNum);
|
||||
result = DL_MCAN_TXBufAddReq(MCAN, BufNum);
|
||||
if(result == 0)
|
||||
{
|
||||
printf("pass\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("result %d\n",result);
|
||||
printf("fail\n");
|
||||
}
|
||||
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
|
|
|
|||
|
|
@ -48,17 +48,23 @@ IVEC_EcuCommonErr_e xECU_WriteDataOverCAN(uint8_t* pucBuf, uint32_t ulId, int re
|
|||
/* Message Marker. */
|
||||
xFrame.mm = 0xAAU;
|
||||
|
||||
uint16_t TxData[DL_MCAN_MAX_PAYLOAD_BYTES]; // Define a buffer for the CAN payload data
|
||||
uint8_t TxData[DL_MCAN_MAX_PAYLOAD_BYTES]; // Define a buffer for the CAN payload data
|
||||
//
|
||||
// // Copy the data you want to transmit (from pucBuf) into TxData
|
||||
// //memcpy(TxData, &pucBuf[PKT_HEADER], retCode);
|
||||
//
|
||||
// Loop through pucBuf starting at PKT_HEADER and XOR each byte with 0x0000
|
||||
for (int i = 0; i < retCode; i++) {
|
||||
TxData[i] = pucBuf[PKT_HEADER + i];
|
||||
}
|
||||
|
||||
// Copy the data you want to transmit (from pucBuf) into TxData
|
||||
memcpy(TxData, &pucBuf[PKT_HEADER], retCode);
|
||||
|
||||
// Set up the buffer number
|
||||
//uint32_t BufNum = 0; // Example: Use buffer number 0
|
||||
|
||||
// Number of bytes to transmit (retCode holds DLC)
|
||||
int Bytes = retCode;
|
||||
|
||||
printf("bufnum %d\n",BufNum);
|
||||
l_i32Ret = xMCAL_MCANTx(CANFD0, &xFrame, TxData, BufNum, Bytes);
|
||||
if(l_i32Ret == IVEC_MCAL_STATUS_SUCCESS)
|
||||
{
|
||||
|
|
@ -95,6 +101,7 @@ IVEC_EcuCommonErr_e xECU_CanReInit(MCAN_Regs* MCAN,uint16_t speed)
|
|||
l_xFuncStatus = commonECU_DEINIT_FAIL;
|
||||
}
|
||||
//vCanConfigFilter();
|
||||
DL_UART_Main_enablePower(MCAN);
|
||||
l_i32Ret = xMCAL_MCANInit(MCAN,speed);
|
||||
if(l_i32Ret != IVEC_MCAL_STATUS_SUCCESS)
|
||||
{
|
||||
|
|
|
|||
25
main.c
25
main.c
|
|
@ -132,7 +132,7 @@ DL_MCAN_RxBufElement RxMsg;
|
|||
flashStatus_t ret_UID,ret_MID;
|
||||
|
||||
McalUartHandle_s prvUartHandle;
|
||||
|
||||
static volatile int count = 0;
|
||||
|
||||
void UARTDataProcess()
|
||||
{
|
||||
|
|
@ -141,6 +141,7 @@ void UARTDataProcess()
|
|||
uint32_t ulId = 0xffffffff;
|
||||
|
||||
retCode= xECU_ReadCANDataOverUART(&prvUartHandle,pucBuf,&ulId);
|
||||
printf("length %d\n",retCode);
|
||||
if(retCode > -1)
|
||||
{
|
||||
if(ulId == 0x00)
|
||||
|
|
@ -148,7 +149,26 @@ void UARTDataProcess()
|
|||
vECU_InitiateUartToCanTransmit(&prvUartHandle, ulId, pucBuf, 0);
|
||||
}
|
||||
else{
|
||||
xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 0);
|
||||
if(count == 0){
|
||||
xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 0);
|
||||
printf("%d\n",count);
|
||||
count = 1;
|
||||
}
|
||||
else if (count == 1){
|
||||
xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 1);
|
||||
printf("%d\n",count);
|
||||
count = 2;
|
||||
}
|
||||
else if (count == 2){
|
||||
xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 2);
|
||||
printf("%d\n",count);
|
||||
count = 3;
|
||||
}
|
||||
else{
|
||||
xECU_WriteDataOverCAN(pucBuf, ulId, retCode, 3);
|
||||
printf("%d\n",count);
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -165,6 +185,7 @@ void CANDataProcess()
|
|||
//delay(3200000);
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
xMCAL_McuInit();
|
||||
|
|
|
|||
Loading…
Reference in New Issue