嵌入式硬件篇---CAN


文章目錄

  • 前言
  • 1. CAN協議基礎
    • 1.1 物理層特性
      • 差分信號線
      • 終端電阻
      • 通信速率
      • 總線拓撲
    • 1.2 幀類型
    • 1.3 數據幀格式
  • 2. STM32F103RCT6的CAN硬件配置
    • 2.1 硬件連接
    • 2.2 CubeMX配置
      • 啟用CAN1
      • 模式
      • 波特率
      • 引腳分配
      • 過濾器配置(可選)
  • 3. HAL庫代碼實現
    • 3.1 CAN初始化
    • 3.2 發送CAN數據幀
    • 3.3 接收CAN數據幀(中斷模式)
  • 4. 過濾器配置(接收特定ID)
  • 5. 波特率計算
  • 6. 常見問題與調試
    • 6.1 通信失敗原因
      • 波特率不匹配
      • 終端電阻缺失
      • ID沖突
      • 硬件連接錯誤
    • 6.2 邏輯分析儀抓包
  • 7. 完整示例:雙機通信
    • 節點A(發送數據)
    • 節點B(接收數據)
  • 總結
    • 硬件配置
    • 數據收發
    • 調試工具
    • 應用場景


前言

CAN(Controller Area Network)是一種高可靠性、多主機的串行通信協議,廣泛應用于汽車電子、工業控制等領域。STM32F103RCT6內置了bxCAN控制器(Basic Extended CAN),支持CAN 2.0A/B標準。以下是詳細協議解析及代碼實現


1. CAN協議基礎

1.1 物理層特性

差分信號線

CAN_H(高電平線)
CAN_L(低電平線)

終端電阻

終端電阻:120Ω(兩端各一個,抑制反射)。

通信速率

通信速率:最高1 Mbps(常見波特率:125kbps、250kbps、500kbps)。

總線拓撲

總線拓撲:線性總線結構,支持多節點(最多110個節點)。

1.2 幀類型

幀類型 用途
數據幀 傳輸實際數據(核心幀類型)
遠程幀 請求其他節點發送數據
錯誤幀 報告通信錯誤
過載幀 通知節點延遲響應

1.3 數據幀格式

[幀起始] [仲裁段] [控制段] [數據段] [CRC段] [ACK段] [幀結束]
仲裁段:
標準幀(11位ID):CAN 2.0A。
擴展幀(29位ID):CAN 2.0B。
數據段:0~8字節有效載荷。

2. STM32F103RCT6的CAN硬件配置

2.1 硬件連接

CAN信號 STM32引腳 說明
CAN_RX PA11 接收引腳
CAN_TX PA12 發送引腳
CAN_H 連接總線 高電平線
CAN_L 連接總線 低電平線
終端電阻 120Ω 接在總線兩端

2.2 CubeMX配置

啟用CAN1

模式

模式:Normal(正常模式)。

波特率

波特率:500kbps(時鐘分頻需匹配APB1時鐘,默認36MHz)。

引腳分配

引腳分配:

CAN_RX → PA11
CAN_TX → PA12

過濾器配置(可選)

設置接收過濾器(如僅接收特定ID的幀)。

3. HAL庫代碼實現

3.1 CAN初始化

#include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan;void MX_CAN_Init(void) {hcan.Instance = CAN1;hcan.Init.Prescaler = 9;          // 波特率 = 36MHz / (Prescaler * (1 + BS1 + BS2)) = 500kbpshcan.Init.Mode = CAN_MODE_NORMAL;  // 正常模式(非環回)hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan.Init.TimeSeg1 = CAN_BS1_4TQ;  // BS1 = 4時間單位hcan.Init.TimeSeg2 = CAN_BS2_3TQ;  // BS2 = 3時間單位hcan.Init.TimeTriggeredMode = DISABLE;hcan.Init.AutoBusOff = DISABLE;hcan.Init.AutoWakeUp = DISABLE;hcan.Init.AutoRetransmission = ENABLE; // 自動重傳hcan.Init.ReceiveFifoLocked = DISABLE;hcan.Init.TransmitFifoPriority = DISABLE;if (HAL_CAN_Init(&hcan) != HAL_OK) {Error_Handler();}}

3.2 發送CAN數據幀

void CAN_Send(uint32_t id, uint8_t *data, uint8_t len) {CAN_TxHeaderTypeDef tx_header;uint32_t tx_mailbox;tx_header.StdId = id;           // 標準ID(11位)tx_header.ExtId = 0;            // 擴展ID(未使用)tx_header.IDE = CAN_ID_STD;     // 標準幀tx_header.RTR = CAN_RTR_DATA;   // 數據幀tx_header.DLC = len;            // 數據長度(0~8)tx_header.TransmitGlobalTime = DISABLE;if (HAL_CAN_AddTxMessage(&hcan, &tx_header, data, &tx_mailbox) != HAL_OK) {Error_Handler();}
}// 示例:發送8字節數據(ID=0x123)
uint8_t msg[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
CAN_Send(0x123, msg, 8);

3.3 接收CAN數據幀(中斷模式)

CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[8];void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data) == HAL_OK) {printf("Received ID: 0x%03X, Data: ", rx_header.StdId);for (uint8_t i = 0; i < rx_header.DLC; i++) {printf("%02X ", rx_data[i]);}printf("\n");}
}// 主函數中啟用接收中斷
int main(void) {HAL_Init();MX_CAN_Init();HAL_CAN_Start(&hcan);HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);while (1) { /* 其他任務 */ }
}

4. 過濾器配置(接收特定ID)

CAN控制器通過過濾器篩選接收的幀。以下配置僅接收ID=0x123的幀:

CAN_FilterTypeDef filter;filter.FilterBank = 0;                      // 過濾器組0
filter.FilterMode = CAN_FILTERMODE_IDMASK;  // 掩碼模式
filter.FilterScale = CAN_FILTERSCALE_32BIT; // 32位過濾
filter.FilterIdHigh = 0x123 << 5;           // ID高16位(左移5位對齊)
filter.FilterIdLow = 0x0000;                // ID低16位
filter.FilterMaskIdHigh = 0xFFFF;           // 掩碼高16位(全匹配)
filter.FilterMaskIdLow = 0x0000;            // 掩碼低16位
filter.FilterFIFOAssignment = CAN_RX_FIFO0; // 存入FIFO0
filter.FilterActivation = ENABLE;           // 啟用過濾器HAL_CAN_ConfigFilter(&hcan, &filter);

5. 波特率計算

CAN波特率由以下公式決定
波特率= Prescaler×(BS1+BS2+1)
APB1時鐘:STM32F103默認36MHz。
BS1:TimeSeg1(例中為4)。
BS2:TimeSeg2(例中為3)。
Prescaler:分頻系數(例中為9)。

6. 常見問題與調試

6.1 通信失敗原因

波特率不匹配

波特率不匹配:確保所有節點波特率一致。

終端電阻缺失

終端電阻缺失:總線兩端需接120Ω電阻。

ID沖突

ID沖突:避免多個節點使用相同ID發送

硬件連接錯誤

硬件連接錯誤:檢查CAN_H/CAN_L是否接反。

6.2 邏輯分析儀抓包

使用CAN分析儀(如PCAN-USB)或示波器觀察
差分信號電平(CAN_H - CAN_L應為2V(顯性)或0V(隱性))。
幀結構:起始位、ID、數據等是否正常。

7. 完整示例:雙機通信

節點A(發送數據)

uint8_t data[8] = {0xAA, 0xBB, 0xCC, 0xDD};
CAN_Send(0x123, data, 4); // 發送ID=0x123的4字節數據

節點B(接收數據)

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {CAN_RxHeaderTypeDef rx_header;uint8_t rx_data[8];HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data);if (rx_header.StdId == 0x123) {HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 收到數據后翻轉LED}
}

總結

硬件配置

硬件配置:正確設置波特率、過濾器

數據收發

數據收發:使用HAL_CAN_AddTxMessage中斷回調

調試工具

調試工具:邏輯分析儀、CAN分析儀是關鍵。

應用場景

應用場景:汽車ECU通信、工業傳感器網絡等。
通過上述代碼,STM32F103RCT6可穩定實現CAN通信,適用于高可靠性要求的嵌入式系統。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83497.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我們今天的直播會非常透徹的跟大家系統性的分享一下整個agents AI就大模型智能體系統和應用程序。我們在做開發的時候&#xff0c;或者實際做企業級的產品落地的時候&#xff0c;你必…

機器學習 day04

文章目錄 前言一、線性回歸的基本概念二、損失函數三、最小二乘法 前言 通過今天的學習&#xff0c;我掌握了機器學習中的線性回歸的相關基本概念&#xff0c;包括損失函數的概念&#xff0c;最小二乘法的理論與算法實現。 一、線性回歸的基本概念 要理解什么是線性回歸&…

img.dims() <= 2 in function ‘cv::matchTemplate報錯

Mat src mat_ori;//imread(img_original);Mat src_template imread(img_template);cvtColor(src, src, COLOR_BGR2RGB);//不轉換&#xff0c;matchTemplate將報錯cvtColor(src_template, src_template,COLOR_BGR2RGB);//不轉換&#xff0c;matchTemplate將報錯 error: (-215…

NY321NY322美光閃存芯片NY323NY336

NY321NY322美光閃存芯片NY323NY336 在存儲技術飛速發展的今天&#xff0c;美光科技的閃存芯片憑借其創新架構與高性能表現&#xff0c;已成為工業自動化、智能終端等領域的核心組件。本文將圍繞技術解析、產品評測、行業趨勢、應用案例及市場動態五大維度&#xff0c;深入探討…

exit耗時高

背景&#xff1a;程序退出發現被強制退出&#xff0c;而不是正常的退出。正常退出是發送15信號&#xff0c;而異常退出是發送信號9&#xff0c;強制退出。退出機制是先發送信號15&#xff0c;然后6s內沒有退出完成&#xff0c;會發送信號9。通過查看退出流程&#xff0c;是將初…

docker compose up -d 是一個用于 通過 Docker Compose 在后臺啟動多容器應用 的命令

docker compose 表示調用 Docker Compose 工具&#xff0c;用于管理基于 YAML 文件定義的多容器應用。 up 核心指令&#xff0c;作用是根據 docker-compose.yml 文件中的配置&#xff0c;創建并啟動所有定義的服務、網絡、卷等資源。 如果容器未創建&#xff0c;會先構建鏡像&…

從輔助到協作:GitHub Copilot的進化之路

如果說現代程序員的標配工具除了VS Code、Stack Overflow之外&#xff0c;還有誰能入選&#xff0c;那一定是GitHub Copilot。從2021年首次亮相&#xff0c;到如今深度集成進開發者日常流程&#xff0c;這個“AI編程助手”已經不只是寫幾行自動補全代碼的小幫手了&#xff0c;而…

局部放大maya的視圖HUD文字大小的方法

一、問題描述&#xff1a; 有網友問&#xff1a;有辦法局部放大maya的字體嗎比如hud中currenttime打開之后畫面右下角有個frame 想放大一下能做到嗎&#xff1f; 在 Maya 中&#xff0c;可以通過自定義 HUD&#xff08;Heads-Up Display&#xff09;元素的字體大小來局部放大特…

C++中隱式的類類型轉換知識詳解和注意事項

一、隱式轉換的基本概念 隱式類型轉換&#xff08;implicit conversion&#xff09;指編譯器在需要時自動在兩種類型之間插入轉換代碼&#xff0c;無需顯式調用。對于內置類型&#xff08;如 int 到 double&#xff09;&#xff0c;轉換由標準定義&#xff1b;對于用戶自定義類…

【C++】18.二叉搜索樹

由于map和set的底層是紅黑樹&#xff0c;同時后面要講的AVL樹(高度平衡二叉搜索樹)&#xff0c;為了方便理解&#xff0c;我們先來講解二叉搜索樹&#xff0c;因為紅黑樹和AVL樹都是在二叉搜索樹的前提下實現的 在之前的C語言數據結構章節中&#xff0c;我們講過二叉樹&#x…

Leaflet使用SVG創建動態Legend

接前一篇文章&#xff0c;前一篇文章我們使用 SVG 創建了帶有動態文字的圖標&#xff0c;今天再看看怎樣在地圖上根據動態圖標生成相關的legend&#xff0c;當然這里也還是使用了 SVG 來生成相關顏色的 legend。 看下面的代碼&#xff0c;生成了一個 svg 節點&#xff0c;其中…

Linux基礎開發工具二(gcc/g++,自動化構建makefile)

3. 編譯器gcc/g 3.1 背景知識 1. 預處理&#xff08;進行宏替換/去注釋/條件編譯/頭文件展開等) 2. 編譯&#xff08;生成匯編) 3. 匯編&#xff08;生成機器可識別代碼&#xff09; 4. 連接&#xff08;生成可執行文件或庫文件) 3.2 gcc編譯選項 格式 &#xff1a; gcc …

PostGIS實現柵格數據入庫-raster2pgsql

raster2pgsql使用與最佳實踐 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于將GDAL支持的柵格格式(如GeoTIFF、JPEG、PNG等)導入PostgreSQL數據庫,支持批量加載、分塊切片、創建空間索引及金字塔概覽,是柵格數據入庫的核心工具。 二、核心功能與典型用法 1…

精益數據分析(64/126):移情階段的用戶觸達策略——從社交平臺到精準訪談

精益數據分析&#xff08;64/126&#xff09;&#xff1a;移情階段的用戶觸達策略——從社交平臺到精準訪談 在創業的移情階段&#xff0c;精準找到目標用戶并開展深度訪談是驗證需求的關鍵。今天&#xff0c;我們結合《精益數據分析》中的方法論&#xff0c;探討如何利用Twit…

ORACLE RAC環境REDO日志量突然增加的分析

服務概述 CRM系統在7/11日出現REDO日志產生量突增&#xff0c;達到平時產生量的20倍以上&#xff0c;對數據同步已經造成了較大的影響。工程師接到故障申報后&#xff0c;及時進行響應&#xff0c;通過對相關日志等信息的深入分析&#xff0c;整理匯總此文檔。 二、數據庫REDO…

注冊表設置windows背景護眼色

方法一&#xff1a; CtrlR&#xff0c;輸入regedit打開注冊表 HKEY_CURRENT_USER\Control Panel\Colors 右側窗口Windows鍵值由255 255 255改為202 234 206。 方法二&#xff1a; 還是注冊表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\DefaultColo…

回溯法理論基礎 LeetCode 77. 組合 LeetCode 216.組合總和III LeetCode 17.電話號碼的字母組合

目錄 回溯法理論基礎 回溯法 回溯法的效率 用回溯法解決的問題 如何理解回溯法 回溯法模板 LeetCode 77. 組合 回溯算法的剪枝操作 LeetCode 216.組合總和III LeetCode 17.電話號碼的字母組合 回溯法理論基礎 回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一…

自己手寫tomcat項目

一&#xff1a;Servlet的原理 在Servlet(接口中)有&#xff1a; 1.init():初始化servlet 2.getServletConfig()&#xff1a;獲取當前servlet的配置信息 3.service():服務器&#xff08;在HttpServlet中實現&#xff0c;目的是為了更好的匹配http的請求方式&#xff09; 4.g…

蘭亭妙微:用系統化思維重構智能座艙 UI 體驗

蘭亭妙微設計專注于以產品邏輯驅動的界面體驗優化&#xff0c;服務領域覆蓋AI交互、智能穿戴、IoT設備、智慧出行等多個技術密集型產業。我們倡導以“系統性設計”為方法論&#xff0c;在用戶需求與技術邊界之間找到最優解。 此次智能駕駛項目&#xff0c;我們為某車載平臺提供…

ubuntu安裝google chrome

更新系統 sudo apt update安裝依賴 sudo apt install curl software-properties-common apt-transport-https ca-certificates -y導入 GPG key curl -fSsL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/google-chrom…