HAL_CAN_Transmit_IT函数声明和定义
时间: 2023-10-06 12:09:31 浏览: 121
函数声明:
```c
HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef *hcan);
```
函数定义:
```c
/**
* @brief Initiates and transmits a CAN frame message with interrupt enabled.
* @param hcan: pointer to a CAN_HandleTypeDef structure that contains
* the configuration information for the specified CAN.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef *hcan)
{
uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
uint32_t tsrflags = READ_REG(hcan->Instance->TSR);
uint32_t transmitrequest = tsrflags & CAN_TSR_TME;
/* Check if there is a free mailbox */
if(transmitrequest != (CAN_TSR_TME | CAN_TSR_TXOK | CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2))
{
transmitmailbox = (tsrflags & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;
}
/* Check if the transmission request can be performed */
if(transmitmailbox != CAN_TXSTATUS_NOMAILBOX)
{
/* Set up transmission parameters */
hcan->pTxMsg->DLC |= (uint32_t)(hcan->pTxMsg->RTR << CAN_RTR_RTR_Pos);
MODIFY_REG(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ, hcan->pTxMsg->StdId << CAN_TI0R_STID_Pos);
if(hcan->pTxMsg->IDE == CAN_ID_EXT)
{
MODIFY_REG(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_IDE | CAN_TI0R_EXID, CAN_TI0R_IDE | (hcan->pTxMsg->ExtId << CAN_TI0R_EXID_Pos));
}
else
{
CLEAR_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_IDE | CAN_TI0R_EXID);
}
WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, hcan->pTxMsg->DLC);
WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, ((uint32_t)hcan->pTxMsg->Data[3] << CAN_TDL0R_DATA3_Pos) |
((uint32_t)hcan->pTxMsg->Data[2] << CAN_TDL0R_DATA2_Pos) |
((uint32_t)hcan->pTxMsg->Data[1] << CAN_TDL0R_DATA1_Pos) |
((uint32_t)hcan->pTxMsg->Data[0] << CAN_TDL0R_DATA0_Pos));
WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, ((uint32_t)hcan->pTxMsg->Data[7] << CAN_TDH0R_DATA7_Pos) |
((uint32_t)hcan->pTxMsg->Data[6] << CAN_TDH0R_DATA6_Pos) |
((uint32_t)hcan->pTxMsg->Data[5] << CAN_TDH0R_DATA5_Pos) |
((uint32_t)hcan->pTxMsg->Data[4] << CAN_TDH0R_DATA4_Pos));
/* Request transmission */
SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
```
该函数用于在中断使能的情况下启动和发送一个CAN帧消息。传输完成后,将会触发CAN总线的发送完成中断。该函数的参数为CAN_HandleTypeDef结构体类型的指针,该结构体包含了CAN的配置信息。函数返回值为HAL_StatusTypeDef类型的值,表示函数执行的状态。具体实现细节可以查看上面的函数定义。