CAN通信涉及的结构体与方法 |
您所在的位置:网站首页 › fifo结构体 › CAN通信涉及的结构体与方法 |
一、CAN发送消息结构体 typedef struct { uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. */ 指定标准标识符。取值范围为0 ~ 0x7FF。 uint32_t ExtId; /*!< Specifies the extended identifier. This parameter can be a value between 0 to 0x1FFFFFFF. */ 指定扩展标识符。取值范围为0 ~ 0x1FFFFFFF。 uint8_t IDE; /*!< Specifies the type of identifier for the message that will be received. This parameter can be a value of @ref CAN_identifier_type */ 指定将接收的消息的标识符类型。该参数可以是@ref CAN_identifier_type的值 uint8_t RTR; /*!< Specifies the type of frame for the received message. This parameter can be a value of @ref CAN_remote_transmission_request */ 指定接收消息的帧类型。取值为@ref CAN_remote_transmission_request uint8_t DLC; /*!< Specifies the length of the frame that will be received.This parameter can be a value between 0 to 8 */ 指定将接收的帧的长度。取值范围为0 ~ 8 uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */ 包含要接收的数据。取值范围是0 ~ 0xFF。 uint8_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. This parameter can be a value between 0 to 0xFF */ 指定存储在邮箱中的消息要传递的筛选器的索引。该参数可以是0到0xFF之间的值 } CanRxMsg; 二、CAN_Transmit()/** * @brief Initiates the transmission of a message. // 发起消息的传输。 * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. // 其中x可以是1或2来选择can外设。 * @param TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data. // TxMessage:指向包含CAN Id, CAN DLC和CAN数据的结构的指针。 * @retval The number of the mailbox that is used for transmission or CAN_TxStatus_NoMailBox if there is no empty mailbox. // 用于传输的邮箱数,如果没有空邮箱,则为CAN_TxStatus_NoMailBox */ uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) { uint8_t transmit_mailbox = 0; /* Check the parameters */ assert_param(IS_CAN_ALL_PERIPH(CANx)); // 外设选择 assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); // assert_param(IS_CAN_RTR(TxMessage->RTR)); // 指定接收消息的帧类型 assert_param(IS_CAN_DLC(TxMessage->DLC)); // /* Select one empty transmit mailbox 选择一个空的发送邮箱*/ if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) { transmit_mailbox = 0; } else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) { transmit_mailbox = 1; } else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) { transmit_mailbox = 2; } else { transmit_mailbox = CAN_TxStatus_NoMailBox; } if (transmit_mailbox != CAN_TxStatus_NoMailBox) { /* Set up the Id 设置Id*/ CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; if (TxMessage->IDE == CAN_Id_Standard) { assert_param(IS_CAN_STDID(TxMessage->StdId)); CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId RTR); } else { assert_param(IS_CAN_EXTID(TxMessage->ExtId)); CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId IDE | \ TxMessage->RTR); } /* Set up the DLC 设置DLC */ 指定将接收的帧的长度。取值范围为0 ~ 8 TxMessage->DLC &= (uint8_t)0x0000000F; CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; /* Set up the data field 设置数据字段*/ CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] Data[2] Data[1] Data[0])); CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] Data[6] Data[5] Data[4])); /* Request transmission */ CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; } return transmit_mailbox; } /** @defgroup CAN_transmit_constants CAN传输常量 * @{ */ #define CAN_TxStatus_Failed ((uint8_t)0x00)/*!< CAN transmission failed */ // CAN传输失败 #define CAN_TxStatus_Ok ((uint8_t)0x01) /*!< CAN transmission succeeded */ // CAN传输成功 #define CAN_TxStatus_Pending ((uint8_t)0x02) /*!< CAN transmission pending */ // CAN 传输等待 #define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /*!< CAN cell did not provide an empty mailbox */ // CAN单元没有提供空邮箱 u8 CAN_Send_Msg(u8* msg,u8 len) { u8 mbox; u16 i=0; CanTxMsg TxMessage; TxMessage.StdId=0x12; // 标准标识符为0 TxMessage.ExtId=0x12; // 设置扩展标示符(29位) TxMessage.IDE=0; // 使用扩展标识符 TxMessage.RTR=0; // 消息类型为数据帧,一帧8位 TxMessage.DLC=len; // 发送两帧信息 for(i=0;i |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |