最近做的一个项目,我设备有9个can,一个can作主机去循环召唤下面8个can作从机的数据(所有设备能正常收发)。当人为把从机的一个can通讯线给断掉,再把它重新接上之后,会出现主机can发送邮箱已满,无法继续发送的问题,重启一下主机程序之后,就可正常使用了,所以可排除硬件问题(已有匹配电阻)
程序在循环召唤时调用HAL_CAN_AddTxMessage时,一直进入 hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
- HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)
- {
- uint32_t transmitmailbox;
- HAL_CAN_StateTypeDef state = hcan->State;
- uint32_t tsr = READ_REG(hcan->Instance->TSR);
- /* Check the parameters */
- assert_param(IS_CAN_IDTYPE(pHeader->IDE));
- assert_param(IS_CAN_RTR(pHeader->RTR));
- assert_param(IS_CAN_DLC(pHeader->DLC));
- if (pHeader->IDE == CAN_ID_STD)
- {
- assert_param(IS_CAN_STDID(pHeader->StdId));
- }
- else
- {
- assert_param(IS_CAN_EXTID(pHeader->ExtId));
- }
- assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime));
- if ((state == HAL_CAN_STATE_READY) ||
- (state == HAL_CAN_STATE_LISTENING))
- {
- /* Check that all the Tx mailboxes are not full */
- 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;
- /* Check transmit mailbox value */
- if (transmitmailbox > 2U)
- {
- /* Update error code */
- hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL;
- return HAL_ERROR;
- }
- /* Store the Tx mailbox */
- *pTxMailbox = (uint32_t)1 << transmitmailbox;
- /* Set up the Id */
- if (pHeader->IDE == CAN_ID_STD)
- {
- hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) |
- pHeader->RTR);
- }
- else
- {
- hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) |
- pHeader->IDE |
- pHeader->RTR);
- }
- /* Set up the DLC */
- hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC);
- /* Set up the Transmit Global Time mode */
- if (pHeader->TransmitGlobalTime == ENABLE)
- {
- SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT);
- }
- /* Set up the data field */
- WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR,
- ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) |
- ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) |
- ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) |
- ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos));
- WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR,
- ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) |
- ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) |
- ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) |
- ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos));
- /* Request transmission */
- SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
- /* Return function status */
- return HAL_OK;
- }
- else
- {
- /* Update error code */
- hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; <font color="#ff0000">//程序最终来了这里</font>
- return HAL_ERROR;
- }
- }
- else
- {
- /* Update error code */
- hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED;
- return HAL_ERROR;
- }
- }
复制代码
|
波特率是一样的,就是在原有正常通讯的条件下,人为断开其中一个节点的通讯
配置之后的