cpev 发表于 2018-4-26 17:02:38

CAN 通信

单片机型号为STM32F103VC,发个CAN通信的例程参考对比下。接收需要是中断接收。

jonecolu 发表于 2018-4-26 17:27:09

库有说明使用

hungchieh1029 发表于 2018-4-27 13:09:40

/* CAN1 init function */
void CAN1_Init(CAN_HandleTypeDef *hcan, unsigned int BuadRate, FIFO_T *pCANxFIFO)
{
        CAN_FilterConfTypeDefsFilterConfig;

        /*--- 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.Prescaler;
hcan->Init.Mode = CAN_MODE_NORMAL;
hcan->Init.SJW = CANxBuadRate.CAN_SJW_xTQ;
hcan->Init.BS1 = CANxBuadRate.CAN_BS1_xTQ;
hcan->Init.BS2 = CANxBuadRate.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, (char*)&hcan->pRxMsg->Data, st_CAN.Frame.len);
        //將整理過後的st_CAN,塞進pCAN1FIFO
        FIFO_put(pCAN1RxFIFO,&st_CAN);
}

发表于 2018-4-27 15:37:43

楼主应该主动一些,在HAL和标准库下都有例程的。我上传一个标准库的例程:

qq305147332 发表于 2018-4-27 15:56:21

不错的资料继续加油
页: [1]
查看完整版本: CAN 通信