你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CAN 通信

[复制链接]
cpev 提问时间:2018-4-26 17:02 /
单片机型号为STM32F103VC,发个CAN通信的例程参考对比下。接收需要是中断接收。
收藏 评论4 发布时间:2018-4-26 17:02

举报

4个回答
jonecolu 回答时间:2018-4-26 17:27:09
库有说明使用

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

hungchieh1029 回答时间:2018-4-27 13:09:40
/* CAN1 init function */
void CAN1_Init(CAN_HandleTypeDef *hcan, unsigned int BuadRate, FIFO_T *pCANxFIFO)
{
        CAN_FilterConfTypeDef  sFilterConfig;

        /*--- Initialize FIFO--------------*/
        pCAN1RxFIFO = pCANxFIFO; //pCAN1FIFO : 只在"CANBUS.c"可用 , 已備分pCANxFIFO的位置
        pCAN1RxFIFO->head = 0;
        pCAN1RxFIFO->tail = 0;
        pCAN1RxFIFO->limit = CanRawDataLimit;
        pCAN1RxFIFO->fifo = (char*)st_Can1RxRawData;
        pCAN1RxFIFO->empty = 1;
        pCAN1RxFIFO->full = 0;
        pCAN1RxFIFO->datatype = sizeof(CAN_RAW_T);


  hcan->Instance = CAN1;
  hcan->pTxMsg = &CAN1TxMessage;
  hcan->pRxMsg = &CAN1RxMessage;
  hcan->Init.Prescaler = CANxBuadRate[BuadRate].Prescaler;
  hcan->Init.Mode = CAN_MODE_NORMAL;
  hcan->Init.SJW = CANxBuadRate[BuadRate].CAN_SJW_xTQ;
  hcan->Init.BS1 = CANxBuadRate[BuadRate].CAN_BS1_xTQ;
  hcan->Init.BS2 = CANxBuadRate[BuadRate].CAN_BS2_xTQ;
  // MCR-TTCM  關閉時間觸發通信模式使能
  hcan->Init.TTCM = DISABLE;
  // MCR-ABOM  自動離線管理 : 發生BUS OFF時,只要MCR-ABOM = 1,就會自動恢復
  hcan->Init.ABOM = ENABLE;
  // MCR-AWUM  使用自動喚醒模式
  hcan->Init.AWUM = DISABLE;
  // MCR-NART  禁止報文自動重傳 : DISABLE-自動重傳
  hcan->Init.NART = DISABLE;
  // MCR-RFLM  接收FIFO 鎖定模式  DISABLE-溢出時新報文會覆蓋原有報文
  hcan->Init.RFLM = DISABLE;
  // MCR-TXFP  發送FIFO優先級 DISABLE-優先級取決於報文標示符
  hcan->Init.TXFP = DISABLE;
  if (HAL_CAN_Init(hcan) != HAL_OK)
  {
    while(1);
  }

  /*CAN過濾器初始化*/
  sFilterConfig.FilterNumber = 0;                    //過濾器組0
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  //工作在標識符屏蔽位模式
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //過濾器位寬為單個32位。
  /* 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴展ID不是如下的就拋棄掉,是的話,會存入FIFO0。 */
  sFilterConfig.FilterIdHigh         = 0x0000;                                //要過濾的ID高位
  sFilterConfig.FilterIdLow          = 0x0000;                                 //要過濾的ID低位
  sFilterConfig.FilterMaskIdHigh     = 0x0000;                                //過濾器高16位每位必須匹配
  sFilterConfig.FilterMaskIdLow      = 0x0000;                                //過濾器低16位每位必須匹配
  sFilterConfig.FilterFIFOAssignment = CAN_FIFO0;           //過濾器被關聯到FIFO 0
  sFilterConfig.FilterActivation = ENABLE;                          //使能過濾器
  sFilterConfig.BankNumber = 14;
  HAL_CAN_ConfigFilter(hcan, &sFilterConfig);

  HAL_CAN_Receive_IT(hcan, CAN_FIFO0);
}




void CAN1_Receive_ISR(CAN_HandleTypeDef *hcan)
{
        CAN_RAW_T st_CAN;
        /*---- CAN_MSG_Type(st_Message) copy to CAN_RAW_T(st_CAN)*/
        st_CAN.ID.COBID = (hcan->pRxMsg->IDE == CAN_ID_STD) ? hcan->pRxMsg->StdId : hcan->pRxMsg->ExtId;
        st_CAN.Frame.len = hcan->pRxMsg->DLC;
        st_CAN.Frame.identifier = (hcan->pRxMsg->IDE == CAN_ID_STD) ? 0 : 1;
        st_CAN.Frame.format = (hcan->pRxMsg->RTR == CAN_RTR_DATA) ? 0 : 1;
        memcpy((char*)&st_CAN.Data.u8_RAW[0], (char*)&hcan->pRxMsg->Data[0], st_CAN.Frame.len);
        //將整理過後的st_CAN,塞進pCAN1FIFO
        FIFO_put(pCAN1RxFIFO,&st_CAN);
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

废鱼 回答时间:2018-4-27 15:37:43
楼主应该主动一些,在HAL和标准库下都有例程的。我上传一个标准库的例程:
CAN.zip (45.19 KB, 下载次数: 8)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

define 回答时间:2018-4-27 15:56:21
不错的资料继续加油

评分

参与人数 1蝴蝶豆 -5 收起 理由
zero99 -5 求助帖灌水,警告一下

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版