/** ****************************************************************************** * @file can.c * @author AMG Energy Solution Team * @version V1.0.0 * @date 07-Feb-2022 * @brief This file provides all the codes of CAN communication functions. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2022 AMG

****************************************************************************** */ /** @addtogroup mBMS2 * @{ */ /* Includes ------------------------------------------------------------------*/ #include "can.h" #include "string.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* CAN channel definition */ /* CAN baudrate definition */ #define CAN_BAUDRATE (250000ul) /* CAN RX Port/Pin definition */ #define CAN_RX_PORT (PortE) #define CAN_RX_PIN (Pin01) #define CAN_RX_FUNC (Func_Can1_Rx) /* CAN TX Port/Pin definition */ #define CAN_TX_PORT (PortE) #define CAN_TX_PIN (Pin00) #define CAN_TX_FUNC (Func_Can1_Tx) #define TX_BUFFER_SIZE 10 #define RX_BUFFER_SIZE 320 /* Private macro -------------------------------------------------------------*/ typedef struct { volatile uint16_t RxInPos, RxOutPos; volatile uint32_t RxOverflowCount; uint16_t TxInPos, TxOutPos; stc_can_rxframe_t RxBuf[RX_BUFFER_SIZE]; stc_can_txframe_t TxBuf[TX_BUFFER_SIZE]; } CAN_Info; /* Private variables ---------------------------------------------------------*/ CAN_Info Can; /* Private function prototypes -----------------------------------------------*/ void CAN_RxIrqCallBack(void); /* Private functions ---------------------------------------------------------*/ // Initializes CAN Port void can_init(uint32_t CAN_Baud_Rate) { stc_can_init_config_t stcCanInitCfg; stc_can_filter_t stcFilter; stc_irq_regi_conf_t stcIrqRegiConf; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcCanInitCfg); MEM_ZERO_STRUCT(stcFilter); MEM_ZERO_STRUCT(stcIrqRegiConf); MEM_ZERO_STRUCT(stcPortInit); MEM_ZERO_STRUCT(Can); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enExInt = Disable; stcPortInit.enPullUp = Enable; /* SPI Port/Pin initialization */ PORT_Init(CAN_TX_PORT, CAN_TX_PIN, &stcPortInit); stcPortInit.enPinMode = Pin_Mode_In; PORT_Init(CAN_RX_PORT, CAN_RX_PIN, &stcPortInit); // PORT_Init(PortB, Pin03, &stcPortInit); PORT_Init(PortB, Pin04, &stcPortInit); //<TCMD_f.TPE != 0) && (--timeout > 0)) { __NOP(); } if (timeout == 0) { M4_CAN->TCMD |= CanPTBTxAbortCmd; } CAN_SetFrame(packet); en_can_tx_buf_status_t txSts = CAN_TransmitCmd(CanPTBTxCmd); switch (txSts) { case CanTxBufEmpty: // = 0, ///< TTEN=0 or TTTBM=0: STB is empty // printf("CanTxBufEmpty \r\n"); break; ///< TTEN=1 and TTTBM=1: PTB and STB are empty case CanTxBufnotHalfFull: // = 1, ///< TTEN=0 or TTTBM=0: STB is less than or equal to half full // printf("CanTxBufnotHalfFull \r\n"); break; ///< TTEN=1 and TTTBM=1: PTB and STB are not empty and not full case CanTxBufHalfFull: // = 2, ///< TTEN=0 or TTTBM=0: STB is more than half full // printf("CanTxBufHalfFull \r\n"); break; ///< TTEN=1 and TTTBM=1: None case CanTxBufFull: // = 3, ///< TTEN=0 or TTTBM=0: STB is full // printf("CanTxBufFull \r\n"); break; } // CAN_IrqCmd(CanRxIrqEn, Enable); } /*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/