CAN通信涉及的结构体与方法

您所在的位置:网站首页 fifo结构体 CAN通信涉及的结构体与方法

CAN通信涉及的结构体与方法

#CAN通信涉及的结构体与方法| 来源: 网络整理| 查看: 265

 

一、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