Обновление
This commit is contained in:
parent
276f0e2f8a
commit
2a992a5fb9
|
|
@ -62,14 +62,14 @@ typedef struct {
|
|||
|
||||
bool reInit;
|
||||
|
||||
uint8_t CountFilter_RX;
|
||||
uint8_t CountSoftFilter_RX;
|
||||
|
||||
FLEXCAN_BaudType canBaudRate;
|
||||
|
||||
uint32_t g_u32RxDataIndex;
|
||||
|
||||
FLEXCAN_RxMbFilterType aRxFiltList[COUNT_QUEUE];
|
||||
FLEXCAN_RxMbFilterType pRxFilterFifoList[COUNT_QUEUE];
|
||||
FLEXCAN_RxMbFilterType pRxFilterList[32];
|
||||
FLEXCAN_RxMbFilterType pRxFilterFifoList[32];
|
||||
|
||||
osMessageQueueId_t rxDataQueue[COUNT_QUEUE];
|
||||
osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE];
|
||||
|
|
@ -87,7 +87,9 @@ typedef struct {
|
|||
uint8_t DMA_BUF_LEN_RX;
|
||||
uint8_t pBufCounter;
|
||||
|
||||
FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX;
|
||||
FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX;
|
||||
|
||||
can_rx_message_type rx_message_struct;
|
||||
|
||||
} tCanSerialPortFrameFlagchip;
|
||||
|
||||
|
|
@ -102,8 +104,13 @@ void vCanSerialPortFrameDMAInit(
|
|||
DMA_RequestSourceType DMA_CHANNEL_REQ_RX, // DMA_REQ_FLEXCAN0
|
||||
const uint8_t *DMA_BUF_RX,
|
||||
uint8_t DMA_BUF_LEN_RX,
|
||||
const FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX,
|
||||
uint8_t CountFilter_RX,
|
||||
|
||||
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
|
||||
uint8_t CountSoftFilter_RX,
|
||||
|
||||
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
||||
uint8_t CountFilterFifo_RX,
|
||||
|
||||
IRQn_Type IRQ_DMA_RX,
|
||||
uint8_t IRQ_DMA_PRIORITY_RX,
|
||||
uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX,
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
#include "memory.h"
|
||||
|
||||
|
||||
#define CAN_USED_NUM 6U
|
||||
#define CAN_RECEIVE_MB_NUM 2
|
||||
#define CAN_USED_NUM 2U // Количество CAN
|
||||
#define CAN_RECEIVE_MB_NUM 32 //
|
||||
static FLEXCAN_RxMsgType s_aaRxDataBuf[CAN_USED_NUM][CAN_RECEIVE_MB_NUM];
|
||||
#define CAN_GET_BUFFER(index) s_aaRxDataBuf[index/2]
|
||||
|
||||
|
|
@ -82,8 +82,13 @@ void vCanSerialPortFrameDMAInit(
|
|||
DMA_RequestSourceType DMA_CHANNEL_REQ_RX, // DMA_REQ_FLEXCAN0
|
||||
const uint8_t *DMA_BUF_RX,
|
||||
uint8_t DMA_BUF_LEN_RX,
|
||||
const FilterTo_FLEXCAN_RxMbFilterType *IdFilter_RX,
|
||||
uint8_t CountFilter_RX,
|
||||
|
||||
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX,
|
||||
uint8_t CountSoftFilter_RX,
|
||||
|
||||
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
|
||||
uint8_t CountFilterFifo_RX,
|
||||
|
||||
IRQn_Type IRQ_DMA_RX,
|
||||
uint8_t IRQ_DMA_PRIORITY_RX,
|
||||
uint8_t IRQ_DMA_CHANNEL_PRIORITY_RX,
|
||||
|
|
@ -102,10 +107,9 @@ void vCanSerialPortFrameDMAInit(
|
|||
env->g_u32RxDataIndex = 0;
|
||||
env->can = CANx;
|
||||
env->CAN_INDEX = CAN_INDEX;
|
||||
env->CountFilter_RX = CountFilter_RX;
|
||||
env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX;
|
||||
env->IdFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *)IdFilter_RX;
|
||||
|
||||
env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX;
|
||||
env->CountSoftFilter_RX = CountSoftFilter_RX;
|
||||
//начало-----------------------------------DMA-RX-------------------------------------------------------------------
|
||||
//начало-----------------------------------DMA-RX-------------------------------------------------------------------
|
||||
//начало-----------------------------------DMA-RX-------------------------------------------------------------------
|
||||
|
|
@ -192,16 +196,18 @@ void vCanSerialPortFrameDMAInit(
|
|||
|
||||
if (tRetVal == FLEXCAN_ERROR_OK) {
|
||||
|
||||
for (uint8_t i = 0; i < CountFilter_RX; ++i) {
|
||||
env->tMbCfg.pRxFilterMBList = NULL;
|
||||
env->tMbCfg.u8RxFilterMBCnt = 0;
|
||||
|
||||
env->pRxFilterFifoList[i].eRxFrameType = IdFilter_RX[i].eRxFrameType;
|
||||
env->pRxFilterFifoList[i].u32RxCanId = IdFilter_RX[i].u32RxCanId;
|
||||
env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilter_RX[i].u32RxCanIdMask;
|
||||
for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) {
|
||||
|
||||
env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType;
|
||||
env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId;
|
||||
env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilterFifo_RX[i].u32RxCanIdMask;
|
||||
}
|
||||
|
||||
env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList;
|
||||
env->tMbCfg.u8RxFilterFifoCnt = CountFilter_RX;
|
||||
env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX;
|
||||
|
||||
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
|
||||
|
||||
|
|
@ -271,7 +277,7 @@ void vCanSerialPortFrameDMAInit(
|
|||
}
|
||||
|
||||
static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can_rx_message_type *rx_message_struct,
|
||||
uint8_t filter) {
|
||||
uint8_t filter) {
|
||||
osMessageQueuePut(env->rxDataQueue[filter], rx_message_struct, 0x0, 0U);
|
||||
|
||||
if (env->rxDataSnifferQueue[filter]) {
|
||||
|
|
@ -280,59 +286,44 @@ static void CanSerialPortFrameAddDataQueue(tCanSerialPortFrameFlagchip *env, can
|
|||
}
|
||||
|
||||
void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf) {
|
||||
can_rx_message_type rx_message_struct;
|
||||
|
||||
// message buffer 1th word
|
||||
uint32_t u32TempAddr = (uint32_t) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 0U);
|
||||
|
||||
uint32_t dlc = FLEXCAN_MB_DLC_GET(u32TempAddr);
|
||||
rx_message_struct.dlc = FLEXCAN_DlcToDataLen(dlc);
|
||||
env->rx_message_struct.dlc = FLEXCAN_DlcToDataLen(dlc);
|
||||
|
||||
rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr);
|
||||
env->rx_message_struct.id_type = FLEXCAN_MB_IDE_GET(u32TempAddr);
|
||||
|
||||
// message buffer 2th word
|
||||
u32TempAddr = (uint32_t)FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 4U);
|
||||
u32TempAddr = (uint32_t) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 4U);
|
||||
|
||||
if (rx_message_struct.id_type == FLEXCAN_ID_STD) {
|
||||
rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr);
|
||||
if (env->rx_message_struct.id_type == FLEXCAN_ID_STD) {
|
||||
env->rx_message_struct.standard_id = FLEXCAN_MB_STDID_GET(u32TempAddr);
|
||||
} else {
|
||||
rx_message_struct.extended_id = FLEXCAN_MB_EXTID_GET(u32TempAddr);
|
||||
env->rx_message_struct.extended_id = FLEXCAN_MB_EXTID_GET(u32TempAddr);
|
||||
}
|
||||
|
||||
// message buffer 3th word
|
||||
uint32_t *pSrc = (uint32_t *) FLEXCAN_MB_WORDN_ADDR(&pBuf[env->pBufCounter << 2], 0U, 8U, 8U);
|
||||
uint32_t *pDest = (uint32_t *) &rx_message_struct.data[0];
|
||||
uint8_t index = 0xFF;
|
||||
|
||||
uint32_t u32WordLen = rx_message_struct.dlc / 4U + (rx_message_struct.dlc % 4U > 0U ? 1U : 0U);
|
||||
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
|
||||
|
||||
for (uint32_t u8Index = 0U; u8Index < u32WordLen; ++u8Index) {
|
||||
REV_BYTES_32(pSrc[u8Index], pDest[u8Index]);
|
||||
}
|
||||
|
||||
rx_message_struct.filter_index = 0;
|
||||
|
||||
for (uint8_t i = 0; i < env->CountFilter_RX; ++i) {
|
||||
|
||||
if ((rx_message_struct.id_type == FLEXCAN_ID_STD) &&
|
||||
(env->IdFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
|
||||
|
||||
if (rx_message_struct.standard_id == env->IdFilter_RX[i].u32RxCanId) {
|
||||
|
||||
rx_message_struct.filter_index = env->IdFilter_RX[i].filter;
|
||||
|
||||
CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i);
|
||||
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
|
||||
|
||||
if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) {
|
||||
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter;
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (rx_message_struct.extended_id == env->IdFilter_RX[i].u32RxCanId) {
|
||||
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) {
|
||||
|
||||
if (rx_message_struct.extended_id == env->IdFilter_RX[i].u32RxCanId) {
|
||||
|
||||
rx_message_struct.filter_index = env->IdFilter_RX[i].filter;
|
||||
|
||||
CanSerialPortFrameAddDataQueue(env, &rx_message_struct, i);
|
||||
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) {
|
||||
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter;
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -342,6 +333,22 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
|
|||
|
||||
}
|
||||
|
||||
if (index != 0xFF) {
|
||||
|
||||
// message buffer 3th word
|
||||
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 u32WordLen = env->rx_message_struct.dlc / 4U + (env->rx_message_struct.dlc % 4U > 0U ? 1U : 0U);
|
||||
|
||||
for (uint32_t u8Index = 0U; u8Index < u32WordLen; ++u8Index) {
|
||||
REV_BYTES_32(pSrc[u8Index], pDest[u8Index]);
|
||||
}
|
||||
|
||||
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, index);
|
||||
|
||||
}
|
||||
|
||||
|
||||
++env->pBufCounter;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue