日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HAL】stm32F103+TJA1050+USBCAN CAN数据收发

發布時間:2024/3/26 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HAL】stm32F103+TJA1050+USBCAN CAN数据收发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MCU型號:stm32F103RCT6
軟件包:
首先是STM32CubeMX配置:
①RCC

②CAN配置

波特率計算方法:
BaudRate=APB1CLK/分頻系數/(1+BS1+BS2).
此處:36M/12/(1+3+2)=500k.

CAN工作模式:Normal

打開CAN接收中斷:

③打開串口,利用串口調試



中斷優先級根據需要設置

最后為勾選“為每個外設生成初始化文件”

生成代碼
①在can.c文件中添加過濾器配置函數(接收用)

/* USER CODE BEGIN 1 */void CAN1_Config(void) {CAN_FilterTypeDef CAN_FilterType;CAN_FilterType.FilterBank=0;CAN_FilterType.FilterIdHigh=0x0000;CAN_FilterType.FilterIdLow=0x0000;CAN_FilterType.FilterMaskIdHigh=0x0000;CAN_FilterType.FilterMaskIdLow=0x0000;CAN_FilterType.FilterFIFOAssignment=CAN_RX_FIFO0;CAN_FilterType.FilterMode=CAN_FILTERMODE_IDMASK;CAN_FilterType.FilterScale=CAN_FILTERSCALE_32BIT;CAN_FilterType.FilterActivation=ENABLE;CAN_FilterType.SlaveStartFilterBank=14;if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK){Error_Handler();}if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK){Error_Handler();}if(HAL_CAN_Start(&hcan)!=HAL_OK){Error_Handler();} }

設置為接收所有報文數據(即暫時不過濾)
添加完之后在can.h中聲明一下此函數。

②在main.c中添加串口重定義,用于打印信息。

int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch; }

在main.c中添加發送函數,并且要聲明它。

/*********************************************** 函數功能:can發送數據 入口參數:ide: 0:標準幀1:擴展幀id: 幀IDlen: 數據長度data: 數據 返回值:0:成功。1:失敗 ************************************************/ uint8_t Can_TxMessage(uint8_t ide,uint32_t id,uint8_t len,uint8_t *data) {uint32_t TxMailbox;CAN_TxHeaderTypeDef CAN_TxHeader;HAL_StatusTypeDef HAL_RetVal; uint16_t i=0;if(ide == 0){CAN_TxHeader.IDE = CAN_ID_STD; //標準幀CAN_TxHeader.StdId = id;}else {CAN_TxHeader.IDE = CAN_ID_EXT; //擴展幀CAN_TxHeader.ExtId = id;}CAN_TxHeader.DLC = len;CAN_TxHeader.RTR = CAN_RTR_DATA;//數據幀,CAN_RTR_REMOTE遙控幀CAN_TxHeader.TransmitGlobalTime = DISABLE;while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0){i++;if(i>0xfffe)return 1;}HAL_Delay(500);HAL_RetVal = HAL_CAN_AddTxMessage(&hcan,&CAN_TxHeader,data,&TxMailbox);if(HAL_RetVal != HAL_OK)return 1;return 0; }

接收回調函數:

/******************************************* 函數功能:接受中斷回調函數 返回值:無 ********************************************/ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {CAN_RxHeaderTypeDef CAN_RxHeader;HAL_StatusTypeDef HAL_Retval;uint8_t Rx_Data[8];uint8_t Data_Len=0;uint32_t ID=0;uint8_t i;HAL_Retval = HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&CAN_RxHeader,Rx_Data);if(HAL_Retval == HAL_OK){Data_Len = CAN_RxHeader.DLC;if(CAN_RxHeader.IDE)ID = CAN_RxHeader.ExtId;elseID = CAN_RxHeader.StdId;printf("id:%x\r\n",ID);printf("Data_Len:%d\r\n",Data_Len);for(i=0;i<8;i++)printf("Rx_Data[%d]=%x\r\n",i,Rx_Data[i]); } }

下面是main函數

int main(void) {/* USER CODE BEGIN 1 */uint8_t data[8]={1,2,3,4,5,6,7,8};//定義發送數組/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_CAN_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */CAN1_Config(); //調用過濾器函數/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Can_TxMessage(0,0x222,8,data);//發送想要發送的報文數據//0:標準幀 0x222:幀ID 數據長度DLC:8 data:數據存放的數組HAL_Delay(1000); //發送要有延時}/* USER CODE END 3 */ }

調試結果
使用開發板+CAN收發器TJA1050+ZLG的UCBCAN-II分析儀
借助上位機軟件CANTest和串口助手

可以看到:MCU發送出來的數據如下,由USBCAN接收到并顯示

然后USBCAN發送數據,MCU接收到之后由串口打印顯示出來,如下:

注意:TJA1050為5V供電,要和開發板共地。

這里是我的參考文章
非常感謝

我的工程鏈接,僅供參考
https://download.csdn.net/download/qq_21246169/12651238

總結

以上是生活随笔為你收集整理的【HAL】stm32F103+TJA1050+USBCAN CAN数据收发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。