一、什麼是can?
can是controller area network的縮寫。是一種序列通訊協議,在車載行業中有廣泛的應用,主要連線不同的控制單元和感測器。
二、can的通訊協議
三、can的應用
本次對can的研究,主要基於專案需求,研究裝置間通過can通訊進行資料傳輸做一些筆記。
平台:stm32f103c8/ stm32f103rc/ stm32f103ze
裝置:一台主機多台從機,從機接收到資料時進行相應,不做主動傳送。主機可以對從機資料進行查詢,對從機裝置進行一些引數的設定
擴充套件:can網路中的裝置維護
需注意:
1、can標準的資料幀一次只能傳輸8位元組,資料較多的時候,需要進行分包處理,資料要進行有效性判斷,設定快取清空條件
2、can沒有所謂的主機和從機概念,可以分配id進行自定義主機和從機。id分配合理,資料過濾會更加方便
3、can一些基礎知識的了解
四、can引數
波特率的計算:
1、確定時鐘,閱讀st32f103xx的datasheet,外設can使用pclk1(apb1),內部時鐘一般是8mhz經過倍頻(9倍頻)可以達到72mhz,pclk1經過72mhz的2分頻達到36mhz。
rcc_pclk1config(rcc_hclk_div2);/* 設定apb1預分頻:2 */
rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9);/* 輸入源:hse,倍頻係數:9 */
rcc_apb1periphclockcmd(rcc_apb1periph_can1, enable); /* 開啟外設時鐘 */
2、can波特率一些引數的設定
ss:同步段,固定1tq
sjw:再次同步段,1~4tq
bs1,bs2:相位緩衝段,bs1(1~8tq),bs2(2~8tq)
prescaler:取樣點
波特率 = can時鐘/((sjw+bs1+bs2)*prescaler)
備註:這裡說的bs1,指代官方文件說的bs1+1tq
can_inittypedef can_initstructure;
can_deinit(can1);/* reset all configuration */
/* 72mhz時鐘經過2分頻得到36mhz 外設時鐘,波特率=36m/((1+3+2)*30)=200k*/
can_initstructure.can_sjw = can_sjw_1tq;
can_initstructure.can_bs1 = can_bs1_3tq;
can_initstructure.can_bs2 = can_bs2_2tq;
can_initstructure.can_prescaler = 30;
濾波器的使用:
本人對於濾波器的使用並未深入,這裡只做簡單的使用介紹。
濾波器應用於接收的濾波,關閉濾波器的時候,對所有資料都進行接收,開啟時,只接收特定id的資料。
1.標準模式下的id
範圍為:0~0x7ff,在濾波器中can_fxr1[31:21],以32位濾波器舉例,如下圖
2.可變位寬
16位濾波器或32位濾波器
3.識別符號列表模式和遮蔽位模式
識別符號列表模式:符合固定id的資料才進行接收,可以理解為每一位都要檢驗。
遮蔽位模式:對id中的某些位進行檢查,符合預期資料才進行接收。
can_filterinittypedef can_filterinitstructure;
can_filterinitstructure.can_filternumber=0;
can_filterinitstructure.can_filtermode=can_filtermode_idmask;
can_filterinitstructure.can_filterscale=can_filterscale_32bit;
can_filterinitstructure.can_filteridhigh=id<<5;
can_filterinitstructure.can_filteridlow=0;
/* ***1 1111 0000 00xx ,置1表示進行檢驗的值,置0表示不進行檢驗。0x1f00表示 對 id&0x1f00進行檢驗,後面6位不關心,例如id=0x40,則0x40~0x7f都可以接收到 */
can_filterinitstructure.can_filtermaskidhigh=0x1f00;//0x1ffc
can_filterinitstructure.can_filtermaskidlow=0x0000;
can_filterinitstructure.can_filterfifoassignment=0;
can_filterinitstructure.can_filteractivation=enable;//enable;
can_filterinit(&can_filterinitstructure); /* 載入設定 */
中斷:1.初始化中斷及優先順序
nvic_inittypedef nvic_initstructure;
nvic_prioritygroupconfig(nvic_prioritygroup_0);
nvic_initstructure.nvic_irqchannel = usb_lp_can1_rx0_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x0;
nvic_initstructure.nvic_irqchannelsubpriority = 0x0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
接收快取:can_itconfig(can1, can_it_fmp0, enable);
中斷處理
if(can_getitstatus(can1,can_it_fmp0)!= reset)
此外還有can的io配置,管腳對映等,這裡不在進行贅述!
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
STM32F103啟動檔案
目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...
筆記 STM32F103 SPI flash概述
spi介面 spi 是英語 serial peripheral inte ce 的縮寫,就是序列外圍裝置介面。是一種高速的,全雙工,同步的通訊匯流排,並且在晶元的管腳上只占用四根線,節約了晶元的管腳 內部結構 spi 介面一般使用4條線通訊 miso主裝置資料輸入,從裝置資料輸出。mosi主裝置資料...