⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_can.c

📁 stm32f10xx的中文译文例程
💻 C
📖 第 1 页 / 共 3 页
字号:
    CAN->FFA1R |= (u32)FilterNumber_BitPos;
  }
  
  /* Filter activation [激活滤波器]*/
  if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE)
  {
    CAN->FA1R |= FilterNumber_BitPos;
  }

  /* Leave the initialisation mode for the filter [退出滤波器初始化模式]*/
  CAN->FMR &= ~CAN_FMR_FINIT;
}

/*******************************************************************************
* 函数名称: CAN_StructInit
* 功能描述: 将CAN_InitStruct每个成员变量置为默认值
* 输入参数: CAN_InitStruct: 指向将要被初始化的结构体CAN_InitTypeDef。
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct)
{
  /* Reset CAN init structure parameters values [复位CAN初始化结构参考值]*/

  /* Initialize the time triggered communication mode [初始化定时器触发通讯模式]*/
  CAN_InitStruct->CAN_TTCM = DISABLE;

  /* Initialize the automatic bus-off management [初始化自动总线断开管理]*/
  CAN_InitStruct->CAN_ABOM = DISABLE;

  /* Initialize the automatic wake-up mode [初始化自动唤醒模式]*/
  CAN_InitStruct->CAN_AWUM = DISABLE;

  /* Initialize the no automatic retransmission [初始化非自动发送模式]*/
  CAN_InitStruct->CAN_NART = DISABLE;

  /* Initialize the receive FIFO locked mode [初始化接收FIFO锁定模式]*/
  CAN_InitStruct->CAN_RFLM = DISABLE;

  /* Initialize the transmit FIFO priority [初始化发送FIFO优先级]*/
  CAN_InitStruct->CAN_TXFP = DISABLE;

  /* Initialize the CAN_Mode member [初始化CAN_Mode成员]*/
  CAN_InitStruct->CAN_Mode = CAN_Mode_Normal;

  /* Initialize the CAN_SJW member [初始化CAN_SJW成员]*/
  CAN_InitStruct->CAN_SJW = CAN_SJW_1tq;

  /* Initialize the CAN_BS1 member [初始化CAN_BS1成员]*/
  CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq;

  /* Initialize the CAN_BS2 member [初始化CAN_BS2成员]*/
  CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq;

  /* Initialize the CAN_Prescaler member [初始化CAN_Prescaler成员]*/
  CAN_InitStruct->CAN_Prescaler = 1;
}

/*******************************************************************************
* 函数名称: CAN_ITConfig
* 功能描述: 使能/禁止指定的CAN中断.
* 输入参数: CAN_IT: 配置使能/禁止的CAN中断源。
*                    这个参数可以是: CAN_IT_TME, CAN_IT_FMP0, CAN_IT_FF0,
*                                           CAN_IT_FOV0, CAN_IT_FMP1, CAN_IT_FF1,
*                                           CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV,
*                                           CAN_IT_LEC, CAN_IT_ERR, CAN_IT_WKU or
*                                           CAN_IT_SLK.
*           NewState: CAN中断的新状态。该参数可以是:ENABLE或DISABLE
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_ITConfig(u32 CAN_IT, FunctionalState NewState)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_ITConfig(CAN_IT));
  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)
  {
    /* Enable the selected CAN interrupt [使能选择的CAN中断]*/
    CAN->IER |= CAN_IT;
  }
  else
  {
    /* Disable the selected CAN interrupt [禁止选择的CAN中断]*/
    CAN->IER &= ~CAN_IT;
  }
}

/*******************************************************************************
* 函数名称: CAN_Transmit
* 功能描述: 初始化报文的发送.
* 输入参数: TxMessage: 指向一个结构体的指针,它包括CAN ID, CAN DLC和CAN数据.
* 输出参数: 无.
* 返回参数: 返回值是用于发送的邮箱数或者是没有空邮箱时的CAN_NO_MB值.
*******************************************************************************/
u8 CAN_Transmit(CanTxMsg* TxMessage)
{
  u8 TransmitMailbox = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_STDID(TxMessage->StdId));
  assert_param(IS_CAN_EXTID(TxMessage->StdId));
  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 ((CAN->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)
  {
    TransmitMailbox = 0;
  }
  else if ((CAN->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)
  {
    TransmitMailbox = 1;
  }
  else if ((CAN->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)
  {
    TransmitMailbox = 2;
  }
  else
  {
    TransmitMailbox = CAN_NO_MB;
  }

  if (TransmitMailbox != CAN_NO_MB)
  {
    /* Set up the Id [设置Id]*/
    CAN->sTxMailBox[TransmitMailbox].TIR &= CAN_TMIDxR_TXRQ;
    if (TxMessage->IDE == CAN_ID_STD)
    {
      TxMessage->StdId &= (u32)0x000007FF;
      TxMessage->StdId = TxMessage->StdId << 21;
      
      CAN->sTxMailBox[TransmitMailbox].TIR |= (TxMessage->StdId | TxMessage->IDE |
                                               TxMessage->RTR);
    }
    else
    {
      TxMessage->ExtId &= (u32)0x1FFFFFFF;
      TxMessage->ExtId <<= 3;

      CAN->sTxMailBox[TransmitMailbox].TIR |= (TxMessage->ExtId | TxMessage->IDE | 
                                               TxMessage->RTR);
    }
    
    /* Set up the DLC [设置DLC]*/
    TxMessage->DLC &= (u8)0x0000000F;
    CAN->sTxMailBox[TransmitMailbox].TDTR &= (u32)0xFFFFFFF0;
    CAN->sTxMailBox[TransmitMailbox].TDTR |= TxMessage->DLC;

    /* Set up the data field [设置数据失败]*/
    CAN->sTxMailBox[TransmitMailbox].TDLR = (((u32)TxMessage->Data[3] << 24) | 
                                             ((u32)TxMessage->Data[2] << 16) |
                                             ((u32)TxMessage->Data[1] << 8) | 
                                             ((u32)TxMessage->Data[0]));
    CAN->sTxMailBox[TransmitMailbox].TDHR = (((u32)TxMessage->Data[7] << 24) | 
                                             ((u32)TxMessage->Data[6] << 16) |
                                             ((u32)TxMessage->Data[5] << 8) |
                                             ((u32)TxMessage->Data[4]));

    /* Request transmission [请求发送]*/
    CAN->sTxMailBox[TransmitMailbox].TIR |= CAN_TMIDxR_TXRQ;
  }

  return TransmitMailbox;
}

/*******************************************************************************
* 函数名称: CAN_TransmitStatus
* 功能描述: 检查报文发送的状态.
* 输入参数: TransmitMailbox: 用于发送的邮箱号码.
* 输出参数: 无.
* 返回参数: CANTXOK:CAN驱动正在发送报文;CANTXPENDING:报文被挂起;CANTXFAILED:其他.
*******************************************************************************/
u8 CAN_TransmitStatus(u8 TransmitMailbox)
{
  /* RQCP, TXOK and TME bits */
  u8 State = 0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox));

  switch (TransmitMailbox)
  {
    case (0): State |= (u8)((CAN->TSR & CAN_TSR_RQCP0) << 2);
      State |= (u8)((CAN->TSR & CAN_TSR_TXOK0) >> 0);
      State |= (u8)((CAN->TSR & CAN_TSR_TME0) >> 26);
      break;
    case (1): State |= (u8)((CAN->TSR & CAN_TSR_RQCP1) >> 6);
      State |= (u8)((CAN->TSR & CAN_TSR_TXOK1) >> 8);
      State |= (u8)((CAN->TSR & CAN_TSR_TME1) >> 27);
      break;
    case (2): State |= (u8)((CAN->TSR & CAN_TSR_RQCP2) >> 14);
      State |= (u8)((CAN->TSR & CAN_TSR_TXOK2) >> 16);
      State |= (u8)((CAN->TSR & CAN_TSR_TME2) >> 28);
      break;
    default:
      State = CANTXFAILED;
      break;
  }

  switch (State)
  {
      /* transmit pending   [发送挂起]*/
    case (0x0): State = CANTXPENDING;
      break;
      /* transmit failed  [发送失败]*/
    case (0x5): State = CANTXFAILED;
      break;
      /* transmit succedeed  [发送成功]*/
    case (0x7): State = CANTXOK;
      break;
    default:
      State = CANTXFAILED;
      break;
  }

  return State;
}

/*******************************************************************************
* 函数名称: CAN_CancelTransmit
* 功能描述: 取消一个发送请求.
* 输入参数: Mailbox number:邮箱号.
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_CancelTransmit(u8 Mailbox)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox));

  /* abort transmission [放弃发送]*/
  switch (Mailbox)
  {
    case (0): CAN->TSR |= CAN_TSR_ABRQ0;
      break;
    case (1): CAN->TSR |= CAN_TSR_ABRQ1;
      break;
    case (2): CAN->TSR |= CAN_TSR_ABRQ2;
      break;
    default:
      break;
  }
}

/*******************************************************************************
* 函数名称: CAN_FIFORelease
* 功能描述: 释放一个FIFO.
* 输入参数: FIFO号码: 需要释放的FIFO,CANFIFO0或CANFIFO.
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_FIFORelease(u8 FIFONumber)
{
  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_FIFO(FIFONumber));

  /* Release FIFO0 [释放FIFO0]*/
  if (FIFONumber == CAN_FIFO0)
  {
    CAN->RF0R = CAN_RF0R_RFOM0;
  }
  /* Release FIFO1 [释放FIFO1]*/
  else /* FIFONumber == CAN_FIFO1 */
  {
    CAN->RF1R = CAN_RF1R_RFOM1;
  }
}

/*******************************************************************************
* 函数名称: CAN_MessagePending
* 功能描述: 返回挂起报文的数量.
* 输入参数: FIFO号码:接收FIFO,CANFIFO0或CANFIFO1.
* 输出参数: 无.
* 返回参数: NbMessage,挂起报文的数量。
*******************************************************************************/
u8 CAN_MessagePending(u8 FIFONumber)
{
  u8 MessagePending=0;

  /* Check the parameters [检查参数]*/
  assert_param(IS_CAN_FIFO(FIFONumber));

  if (FIFONumber == CAN_FIFO0)
  {
    MessagePending = (u8)(CAN->RF0R&(u32)0x03);
  }
  else if (FIFONumber == CAN_FIFO1)
  {
    MessagePending = (u8)(CAN->RF1R&(u32)0x03);
  }
  else
  {
    MessagePending = 0;
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -