From 385e9ac58b075fc770e4ada509103419e5c97b90 Mon Sep 17 00:00:00 2001
From: darya
Date: Wed, 24 Jun 2026 13:58:08 +0300
Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B8=D0=B5=2023.06.2026?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Inc/CanSerialPortFrame.h | 4 ++-
Src/CanSerialPortFrame.c | 67 +++++++++++++++++++++++++++++++++++-----
2 files changed, 62 insertions(+), 9 deletions(-)
diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h
index 3b3acc3..bacd1e9 100644
--- a/Inc/CanSerialPortFrame.h
+++ b/Inc/CanSerialPortFrame.h
@@ -38,8 +38,10 @@ typedef struct {
this parameter can be a value between 0 to 0xFF */
} can_rx_message_type;
+#define COUNT_TX_CAN_HANDLER 24
-#define COUNT_TX_HANDLER 3
+
+#define COUNT_TX_HANDLER 24
#define COUNT_QUEUE 4
typedef struct {
diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c
index 8328501..6163f5d 100644
--- a/Src/CanSerialPortFrame.c
+++ b/Src/CanSerialPortFrame.c
@@ -214,7 +214,7 @@ bool vCanSerialPortFrameDMAInit(
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
// tx config
- env->tMbCfg.u8TxMsgCnt = 3U; // tx occupy 3 mb
+ env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN_HANDLER; // 3U
tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg);
@@ -713,26 +713,77 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u
// : 0;
//}
+uint8_t max_i = 0;
+uint8_t tx_init[COUNT_TX_CAN_HANDLER] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+
FLEXCAN_ErrorType TransmitCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *tTxMsg) {
+/*
+ for (uint32_t j = 0; j < 500000; ++j) {
+
+ for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
+ uint8_t ready = FLEXCAN_TransmitProcess(env->CAN_INDEX, i);
+
+ if ((ready) || (tx_init[i])) {
+ tx_init[i] = 0;
+ tTxMsg->u8TxHandler = i;
+ break;
+ } else {
+ if (i > max_i) {
+ max_i = i;
+ }
+ asm("nop");
+ }
+
+ }
+ }
+*/
+
+
+ uint8_t ready = 0;
+
+ while (ready == 0) {
+
+ for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
+ ready = IsTxBufferFree_ByCode(env->CAN_INDEX, i);
+
+ if ((ready)) {
+ tTxMsg->u8TxHandler = i;
+ break;
+ } else {
+ if (i > max_i) {
+ max_i = i;
+ }
+
+ if (max_i >= COUNT_TX_CAN_HANDLER) {
+ asm("nop");
+ }
+ }
+ }
+
+ }
+
+
FLEXCAN_ErrorType tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, tTxMsg);
if (tRetval != FLEXCAN_ERROR_OK) {
FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg->u8TxHandler);
} else {
-/*
- if (tTxMsg->bWaitTxCompleted) {
+
+ if (tTxMsg->bWaitTxCompleted) {
+/*
uint8_t u8TxHandler;
- if (osMessageQueueGet(env->txDataQueueCan[tTxMsg->u8TxHandler], &u8TxHandler, NULL, tTxMsg->bWaitTxCompleted) == osOK) {
+ if (osMessageQueueGet(env->txDataQueueCan[tTxMsg->u8TxHandler], &u8TxHandler, NULL, 50) == osOK) {
tRetval = FLEXCAN_ERROR_OK;
} else {
tRetval = FLEXCAN_ERROR_TIMEOUT;
}
-
- }
*/
- FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg->u8TxHandler);
+ }
+
+// FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg->u8TxHandler);
+
}
return tRetval;
@@ -765,7 +816,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
tTxMsg.eDataType = FLEXCAN_FRAME_DATA;
tTxMsg.eFrameType = (FLEXCAN_IdType) env->canTypeFrame;
tTxMsg.bWaitTxCompleted = 1U;
- tTxMsg.u16WaitTxTimeout = 50000;
+ tTxMsg.u16WaitTxTimeout = 50;
uint16_t len = 0;