if (((tsr & CAN_TSR_TME0) != 0U) || ((tsr & CAN_TSR_TME1) != 0U) || ((tsr & CAN_TSR_TME2) != 0U)) { //选择相应的邮箱并填入需要发送的数据 /* Select an empty transmit mailbox */ transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; /* Store the Tx ...
case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0): /* Set CAN error code to BD error */ hcan->ErrorCode |= HAL_CAN_ERROR_BD; break; case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1): /* Set CAN error code to CRC error */ hcan->ErrorCode |= HAL_CAN_ERROR_CRC; break; default: break; } /*...
全文搜索这个宏定义,在HAL_CAN_IRQHandler中找到了__HAL_CAN_DISABLE_IT(CAN_IT_FMP0),关闭了FIFO0的消息挂起中断, 整体代码如下; /*** @brief Handles CAN interrupt request* @paramhcan: pointer to a CAN_HandleTypeDef structure that contains* the configuration information for the specified CAN.* @re...
* @retval None */voidHAL_CAN_IRQHandler(CAN_HandleTypeDef*hcan){uint32_ttmp1=0U,tmp2=0U,tmp3=0U;uint32_terrorcode=HAL_CAN_ERROR_NONE;/* Check Overrun flag for FIFO0 */tmp1=__HAL_CAN_GET_FLAG(hcan,CAN_FLAG_FOV0);tmp2=__HAL_CAN_GET_IT_SOURCE(hcan,CAN_IT_FOV0);if(tmp1...
用户可以设置自动重发,也就是在出现错误后自动重发,直到成功发送出去。如果禁止自动重发,则发送失败后不再重发,会通过发送状态寄存器CAN_TSR相应的位指示错误原因如仲裁丢失或发送错误。 消息发送相关函数 函数HAL_CAN_GetTxMailboxesFreeLevel()用于查询一个CAN模块空闲的发送邮箱个数如果有空闲的发送邮箱,就可以使用函...
}else/*Transmitfailure*/{/*SetCANerrorcodetoTXFAILerror*/errorcode|=HAL_CAN_ERROR_TXFAIL; }/*Cleartransmissionstatusflags(RQCPxandTXOKx)*/SET_BIT(hcan->Instance->TSR,CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2| CAN_FLAG_TXOK0|CAN_FLAG_TXOK1|CAN_FLAG_TXOK2); ...
transmit_mailbox = (register_tsr & CAN_TSR_CODE) >>CAN_TSR_CODE_Pos; if(transmit_mailbox > 2U) { return 1; } //(2.1)判断并设置发送帧为标准帧还是扩展帧 if(DestID <= 0x7FFU) { CAN_ARR[canNo-1]->sTxMailBox[transmit_mailbox].TIR = ((DestID << CAN_TI0R_STID_Pos)|CAN_ID...
用户可以设置自动重发,也就是在出现错误后自动重发,直到成功发送出去。如果禁止自动重发,则发送失败后不再重发,会通过发送状态寄存器CAN_TSR相应的位指示错误原因,如仲裁丢失或发送错误。 用户可以终止邮箱数据的发送,终止发送后邮箱会变成空闲状态。 用户可以设置时间触发通信模式(time triggered communication mode)。在此...
{ /* Set CAN error code to TXFAIL error */ errorcode |= HAL_CAN_ERROR_TXFAIL; } /* Clear transmission status flags (RQCPx and TXOKx) */ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2 | \ CAN_FLAG_TXOK0 | CAN_FLAG_TXOK1 | CAN_FLAG_TX...
函数首先检查传入的CAN_HandleTypeDef结构体中的CAN外设状态和TSR寄存器的值,确认CAN外设处于正确的状态并且至少有一个空闲的发送邮箱。 然后,函数会根据传入的CAN_TxHeaderTypeDef结构体中的参数配置选中的发送邮箱: 设置TIxR寄存器,即设置CAN消息的标识符。根据pHeader的IDE、StdId/ExtId和RTR来设置TIR寄存器的对应位。