Обновление
This commit is contained in:
parent
a58f53ebe2
commit
cd30cb58d9
|
|
@ -4,7 +4,8 @@
|
||||||
#include <SystemDelayInterface.h>
|
#include <SystemDelayInterface.h>
|
||||||
#include "CanSerialPortFrame.h"
|
#include "CanSerialPortFrame.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "candb.h"
|
||||||
|
#include "CanPorts.h"
|
||||||
|
|
||||||
#define CAN_USED_NUM 2U // Количество CAN
|
#define CAN_USED_NUM 2U // Количество CAN
|
||||||
#define CAN_RECEIVE_MB_NUM 128 // Количество mailbox на один CAN
|
#define CAN_RECEIVE_MB_NUM 128 // Количество mailbox на один CAN
|
||||||
|
|
@ -300,64 +301,55 @@ static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg) {
|
void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, FLEXCAN_RxMsgType *pRxCfg) {
|
||||||
if (pRxCfg->eDataType == FLEXCAN_FRAME_DATA) {
|
if (pRxCfg->eDataType != FLEXCAN_FRAME_DATA) {
|
||||||
|
return; // Ранний выход
|
||||||
|
}
|
||||||
|
|
||||||
env->rx_message_struct.dlc = pRxCfg->u32DataLen;
|
// Копируем основные данные один раз
|
||||||
|
const uint32_t rx_id = pRxCfg->u32CanId;
|
||||||
|
const uint8_t dlc = pRxCfg->u32DataLen;
|
||||||
|
const FLEXCAN_IdType id_type = pRxCfg->eFrameType;
|
||||||
|
|
||||||
if (env->rx_message_struct.id_type == FLEXCAN_ID_STD) {
|
// Заполняем структуру
|
||||||
env->rx_message_struct.standard_id = pRxCfg->u32CanId;
|
can_rx_message_type *pMsg = &env->rx_message_struct;
|
||||||
} else {
|
pMsg->dlc = dlc;
|
||||||
env->rx_message_struct.extended_id = pRxCfg->u32CanId;
|
pMsg->id_type = id_type;
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t index = 0xFF;
|
if (id_type == FLEXCAN_ID_STD) {
|
||||||
|
pMsg->standard_id = rx_id;
|
||||||
|
} else {
|
||||||
|
pMsg->extended_id = rx_id;
|
||||||
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
|
// Быстрый поиск по ID (можно использовать switch или бинарный поиск)
|
||||||
|
uint8_t filter_index = 0xFF;
|
||||||
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
|
const uint8_t count = env->CountSoftFilter_RX;
|
||||||
|
|
||||||
if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
|
||||||
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
|
|
||||||
env->rx_message_struct.id_type = pRxCfg->eFrameType;
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
|
||||||
|
|
||||||
if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
|
||||||
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
|
|
||||||
env->rx_message_struct.id_type = pRxCfg->eFrameType;
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Самый быстрый вариант: если ID совпадает с UDS
|
||||||
|
if (rx_id == Diag_To_CCU_CANID || rx_id == Diag_Functional_CANID) {
|
||||||
|
filter_index = PROTOCOL_CAN_UDS;
|
||||||
|
pMsg->filter_index = filter_index;
|
||||||
|
} else {
|
||||||
|
// Линейный поиск по остальным ID (только если нужно)
|
||||||
|
for (uint8_t i = 0; i < count; i++) {
|
||||||
|
if (rx_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
||||||
|
filter_index = env->IdHardSoftFilter_RX[i].filter;
|
||||||
|
pMsg->filter_index = filter_index;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если ID найден или фильтров нет
|
||||||
if (index != 0xFF) {
|
if (filter_index != 0xFF || count == 0) {
|
||||||
memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen);
|
memcpy(pMsg->data, pRxCfg->aData, dlc);
|
||||||
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter);
|
CanSerialPortFrameAddDataQueue(env, pMsg, filter_index != 0xFF ? filter_index : 0);
|
||||||
}
|
|
||||||
|
|
||||||
if (env->CountSoftFilter_RX == 0) {
|
|
||||||
memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen);
|
|
||||||
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) {
|
void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) {
|
||||||
|
|
||||||
// message buffer 1th word
|
// message buffer 1th word
|
||||||
|
|
@ -381,7 +373,8 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
|
||||||
|
|
||||||
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
|
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
|
||||||
|
|
||||||
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
|
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) &&
|
||||||
|
(env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
|
||||||
|
|
||||||
if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
|
||||||
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
|
env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
|
||||||
|
|
@ -422,7 +415,7 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (env->CountSoftFilter_RX == 0) {
|
if (env->CountSoftFilter_RX == 0) {
|
||||||
// message buffer 3th word
|
// message buffer 3th word
|
||||||
uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U);
|
uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U);
|
||||||
uint32_t *pDest = (uint32_t *) &env->rx_message_struct.data[0];
|
uint32_t *pDest = (uint32_t *) &env->rx_message_struct.data[0];
|
||||||
|
|
@ -491,7 +484,8 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u
|
||||||
// : 0;
|
// : 0;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr, uint8_t canType, uint32_t timeout) {
|
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr,
|
||||||
|
uint8_t canType, uint32_t timeout) {
|
||||||
|
|
||||||
uint16_t sent = 0;
|
uint16_t sent = 0;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue