From 1e4fd372c8b1850da01fc2d0fc461ffbe574a257 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/fc7xxx_driver_flexcan.h | 3 +++ Src/fc7xxx_driver_flexcan.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Inc/fc7xxx_driver_flexcan.h b/Inc/fc7xxx_driver_flexcan.h index 48c746a..91a262b 100644 --- a/Inc/fc7xxx_driver_flexcan.h +++ b/Inc/fc7xxx_driver_flexcan.h @@ -458,4 +458,7 @@ void FLEXCAN_IRQHandler(uint8_t u8CanIndex); /** @}*/ + +bool IsTxBufferFree_ByCode(uint8_t canIndex, uint8_t handler); + #endif diff --git a/Src/fc7xxx_driver_flexcan.c b/Src/fc7xxx_driver_flexcan.c index b460761..8bc0ac8 100644 --- a/Src/fc7xxx_driver_flexcan.c +++ b/Src/fc7xxx_driver_flexcan.c @@ -2174,7 +2174,7 @@ FLEXCAN_ErrorType FLEXCAN_TransmitData(uint8_t u8CanIndex, const FLEXCAN_TxMsgTy } // ------------------------------- - +/* if (pTxMsg->bWaitTxCompleted) { u32TempAddr = 0U; @@ -2200,7 +2200,7 @@ FLEXCAN_ErrorType FLEXCAN_TransmitData(uint8_t u8CanIndex, const FLEXCAN_TxMsgTy tRetVal = FLEXCAN_ERROR_TIMEOUT; } } - +*/ // -------------------------- } @@ -2213,6 +2213,31 @@ FLEXCAN_ErrorType FLEXCAN_TransmitData(uint8_t u8CanIndex, const FLEXCAN_TxMsgTy } +bool IsTxBufferFree_ByCode(uint8_t canIndex, uint8_t handler) { + FLEXCAN_Type *pCan = s_aFlexCan_InstanceTable[canIndex]; + FLEXCAN_SettingType *pCurSetting = &s_aFlexCan_Setting_Table[canIndex]; + + if (handler >= pCurSetting->u8TxMbCnt1) { + return false; // Неверный handler + } + + uint8_t realIndex = pCurSetting->u8TxMbStart1 + handler; + + // Читаем код из первого слова MB + uint32_t addr = (uint32_t)FLEXCAN_MB_WORDN_ADDR( + &(pCan->RAM[0U]), realIndex, pCurSetting->eMbDataWidth, 0U); + + uint32_t code = FLEXCAN_MB_CODE_GET(addr); + + // Коды состояния буфера: + // 0x0 = EMPTY (не использовался) - СВОБОДЕН + // 0x8 = INACTIVE (неактивен) - СВОБОДЕН + // 0xC = TRANSMITTING (передаёт) - ЗАНЯТ + // 0x9 = ABORTING (прерывается) - ЗАНЯТ + + return (code == 0x0 || code == 0x8); +} + /** * @brief Process flag after transmit *