STM32 CAN通訊實驗

2021-10-06 10:09:33 字數 2831 閱讀 6343

硬體連線

需要兩個開發板

1.crx和pa11短接,ctx和pa12短接

2.用杜邦線連線兩個開發板,canl連canl,canh連canh

can傳送流程

程式選擇 1 個空置的郵箱(tme=1)-> 設定識別符號(id),資料長度和傳送資料 -> 設定 can_tixr 的 txrq 位為 1,請求傳送 -> 郵箱**(等待成為最高優先順序) -> 預定傳送(等待匯流排空閒)-> 傳送 -> 郵箱空置。整個流程如圖所示:

上圖中,還包含了很多其他處理,不強制退出傳送(abrq=1)和傳送失敗處理等。通過這個流程圖,我們大致了解了 can 的傳送流程,後面的資料傳送,我們基本就是按照此流程來走。

can 的接收流程。

can 接收到的有效報文,被儲存在 3 級郵箱深度的 fifo 中。 fifo 完全由硬體來管理,從而節省了 cpu 的處理負荷,簡化了軟體並保證了資料的一致性。應用程式只能通過讀取 fifo輸出郵箱,來讀取 fifo 中最先收到的報文。這裡的有效報文是指那些正確被接收的(直到 eof都沒有錯誤)且通過了識別符號過濾的報文。前面我們知道 can 的接收有 2 個 fifo,我們每個

濾波器組都可以設定其關聯的 fifo,通過 can_ffa1r 的設定,可以將濾波器組關聯到fifo0/fifo1。

can 接收流程為: fifo 空 -> 收到有效報文 -> **_1(存入 fifo 的乙個郵箱,這個由硬體控制,我們不需要理會) -> 收到有效報文 -> **_2 -> 收到有效報文 -> **_3 -> 收到有效報文 -> 溢位。

這個流程裡面,我們沒有考慮從 fifo 讀出報文的情況,實際情況是:我們必須在 fifo 溢位之前,讀出至少 1 個報文,否則下個報文到來,將導致 fifo 溢位,從而出現報文丟失。每讀出 1 個報文,相應的**就減 1,直到 fifo 空。 can 接收流程如圖所示:

fifo 接收到的報文數,我們可以通過查詢 can_rfxr 的 fmp 暫存器來得到,只要 fmp不為 0,我們就可以從 fifo 讀出收到的報文。

can初始化函式講解

can初始化函式名:u8 can_mode_init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)

//tsjw:重新同步跳躍時間單元.範圍:can_sjw_1tq~ can_sjw_4tq

//tbs2:時間段2的時間單元. 範圍:can_bs2_1tq~can_bs2_8tq;

//tbs1:時間段1的時間單元. 範圍:can_bs1_1tq ~can_bs1_16tq

//brp :波特率分頻器.範圍:1~1024; tq=(brp)*tpclk1

//波特率=fpclk1/((tbs1+1+tbs2+1+1)*brp);

//mode:can_mode_normal,普通模式;can_mode_loopback,回環模式;

//fpclk1的時鐘在初始化的時候設定為36m,如果設定can_mode_init(can_sjw_1tq,can_bs2_8tq,can_bs1_9tq,4,can_mode_loopback);

//則波特率為:36m/((8+9+1)*4)=500kbps

//返回值:0,初始化ok;

// 其他,初始化失敗;

u8 can_mode_init

(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)

can傳送函式講解

//can傳送一組資料(固定格式:id為0x12,標準幀,資料幀)	

//len:資料長度(最大為8)

//msg:資料指標,最大為8個位元組.

//返回值:0,成功;

// 其他,失敗;

u8 can_send_msg

(u8* msg,u8 len)

主函式

int

main

(void

) res=

can_send_msg

(canbuf,8)

;//傳送8個位元組

if(res)

lcd_showstring(60

+80,190

,200,16

,16,"failed");

//提示傳送失敗

else

lcd_showstring(60

+80,190

,200,16

,16,"ok ");

//提示傳送成功

}else

if(key==wkup_pres)

//wk_up按下,改變can的工作模式

else

//回環模式,乙個開發板就可以測試了.

point_color=blue;

//設定字型為藍色

}

key=

can_receive_msg

(canbuf);if

(key)

//接收到有資料

} t++

;delay_ms(10

);if(t==20)

}}

STM32 CAN通訊問題

檢舉 2012 07 04 20 59 breath123 分類 工程技術科學 瀏覽974次 can通訊測試中 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴充套件id不是如下的就拋棄掉,是的話,會存入fifo0。can filterinitstructure.can filteridhigh...

stm32 can通訊傳送解釋

uint8 t can transmit can typedef canx,cantxmsg txmessage else if canx tsr can tsr tme1 can tsr tme1 else if canx tsr can tsr tme2 can tsr tme2 else if...

STM32 CAN通訊硬體設計

隔離方案就不說了,之前的usb轉485工具的開發在這塊已經有些基礎。其實板上非隔離can介面設計還有一些額外的注意點。回到最基礎的知識依然是cmos ttl 推挽 開漏的問題。正點原子開發板,can電路最為簡易,基本無可用性 看看乙個常用電路 非隔離 tx rx直連stm32引腳 ft 覺得還是要使...