本文的目的是為了能夠?qū)崿F(xiàn)功能涡匀,故寫的時候比較簡略讯检。
參考資料:https://blog.csdn.net/u012308586/article/details/81001102
? ? ? ? ? ? ? ? ?正點原子開發(fā)手冊
目標(biāo):
通過can總線州疾,用stm32的CAN模塊實現(xiàn)對電機驅(qū)動發(fā)送指令,從而實現(xiàn)對電機的控制岭洲。
硬件設(shè)計:
?
①收發(fā)芯片的功能:把單片機送來的信號通過收發(fā)芯片的轉(zhuǎn)換從而實現(xiàn)信號的具體傳輸。
②120歐終端電阻:主要是為了防止信號的干擾帖池,一般來說,終端設(shè)備的CAN_H和CAN_L也要加上120歐終端電阻吭净。
軟件設(shè)計基本知識:
其實各種通信方式的本質(zhì)都是一樣的睡汹,均分為兩個部分;①波特率:以何種速度來通信②具體準(zhǔn)則:發(fā)送端和接收端對發(fā)送來的數(shù)據(jù)的解釋寂殉。
特色:CAN工作于4種模式囚巴;類似于手機的飛行模式,正常模式友扰,待機狀態(tài)彤叉,是一種感覺。
? ? ? ? ? ?CAN常用的工作模式是(1)回環(huán)模式:也就是自己發(fā)焕檬,自己收。(2)正常工作模式澳泵,也就是用于正常的接收实愚,發(fā)送。
一.公共部分(發(fā)送端和接收端都會用到的部分)
①波特率:
通過配置掛在APB1總線上的CAN1模塊的幾個參數(shù)設(shè)置從而得到通信速率兔辅。也就是通過設(shè)置掛在APB1外設(shè)總線上的速率?
42Mhz腊敲。?
?
然后通過波特率計算公式(波特率= APB1外設(shè)總線速率? * (1/(相位緩沖段 1+相位緩沖段 2+重新同步跳躍段)*(預(yù)分頻系數(shù))))來設(shè)置波特率
?
這個參數(shù)代表波特率=42M/(2*(14+6+1))=1M bps
注意:①相位緩沖段1設(shè)置范圍:1-16 ②相位緩沖段2設(shè)置范圍:1-8? ③重新同步跳躍段一般設(shè)置為1
二.發(fā)送端:
(1)設(shè)置的數(shù)據(jù)格式
CAN協(xié)議規(guī)定發(fā)送的數(shù)據(jù)有幾種:數(shù)據(jù)幀,遙控幀维苔,錯誤幀碰辅,過載幀,間隔幀介时。我們?nèi)∑湟环N:數(shù)據(jù)幀來舉例没宾,故名思意,這種幀就是用來發(fā)送數(shù)據(jù)的沸柔,也是應(yīng)用最廣泛的一種數(shù)據(jù)幀循衰。
幀的格式如下圖
?
?
對于我們來說我們只需要關(guān)注以下幾點:①仲裁段(ID)? ②數(shù)據(jù)段的長度(DLC)③幀的類型
①ID;這是CAN總線的特色,它有兩個含義
(1)代表每個單元的地址
(2)代表優(yōu)先級褐澎,CAN總線可以用于多主多從結(jié)構(gòu)会钝,簡而言之,在一個系統(tǒng)里面工三,每個單元都可以收發(fā)迁酸,那么當(dāng)有多個單元想要占用總線的時候先鱼,那么我給誰用呢?于是這個時候多個單元都來到總線上進(jìn)行仲裁奸鬓,優(yōu)先級高的占據(jù)總線使用權(quán)焙畔。
②數(shù)據(jù)長度:就是明確的指出我發(fā)的這一幀數(shù)據(jù)里面有幾個數(shù)據(jù)(一幀最多發(fā)送8字節(jié)的數(shù)據(jù))
③幀的類型:有標(biāo)準(zhǔn)幀(11位)和擴展幀(29位)兩種,這是為整個網(wǎng)絡(luò)考慮全蝶,當(dāng)整個網(wǎng)絡(luò)節(jié)點個數(shù)多闹蒜,則用擴展幀。小型網(wǎng)絡(luò)標(biāo)準(zhǔn)幀足夠抑淫。
(2)發(fā)送郵箱
用于存放要發(fā)送的數(shù)據(jù)绷落。
程序選擇 1 個空置的郵箱(TME=1)-->設(shè)置標(biāo)識符(ID)數(shù)據(jù)長度(DLC)和發(fā)送數(shù)據(jù)(數(shù)據(jù)幀)-->設(shè)置 CAN_TIxR 的 TXRQ 位為 1,請求發(fā)送-->郵箱掛號(等待成為最高優(yōu)先級)-->預(yù)定發(fā)送(等待總線空閑)-->發(fā)送-->郵箱空置始苇。
(3)發(fā)送仲裁
問題來源:用CAN發(fā)送多個數(shù)據(jù)的時候砌烁,出現(xiàn)了發(fā)送字節(jié)亂序的問題。
參考博客:https://blog.csdn.net/zhangxufei/article/details/52334278
如果三個郵箱中同時存在多個待發(fā)送的報文時催式,此時存在一個問題函喉,即先送哪個郵箱中的報文好呢?此時荣月,存在一個發(fā)送優(yōu)先級的問題管呵。此時,非空發(fā)送郵箱進(jìn)入發(fā)送仲裁哺窄,發(fā)送仲裁有兩種策略:ID模式和FIFO模式捐下。
ID模式:當(dāng)有超過1個發(fā)送郵箱在掛號時,發(fā)送順序由郵箱中報文的標(biāo)識符決定萌业。根據(jù)CAN協(xié)議坷襟,標(biāo)識符數(shù)值最低的報文具有最高的優(yōu)先級。如果標(biāo)識符的值相等生年,那么郵箱號小的報文先被發(fā)送婴程。此模式通過對CAN主控寄存器CAN_MCR的TXFP位清0來設(shè)置。
FIFO模式:通過對CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’抱婉,可以把發(fā)送郵箱配置為發(fā)送FIFO档叔。在該模式下,發(fā)送的優(yōu)先級由發(fā)送請求次序決定蒸绩。該模式對分段發(fā)送很有用蹲蒲。
三.接收端
對于我們來說我們只需要關(guān)注以下幾點:①過濾器
①過濾器:
(1)顧名思義,通過它來得到我們想要的ID的數(shù)據(jù)侵贵,當(dāng)總線上的數(shù)據(jù)經(jīng)過仲裁后届搁,終于到達(dá)目的地(接收端)了,那么這個時候還要讓接收端看看這是不是我想要的數(shù)據(jù),怎么看呢卡睦?通過ID宴胧。
(2)工作模式:列表模式;得到一組幀表锻,通過設(shè)置僅關(guān)心ID的幾位來實現(xiàn)恕齐。
? ? ? ? ? ? ? ? ? ? ? ? ? 標(biāo)志位掩碼模式:得到特定ID的幀。過來的幀的ID必須與過濾器的ID一摸一樣瞬逊。
四.代碼實現(xiàn):
鏈接:https://pan.baidu.com/s/1GadiL6UjDvrh6wDDlpp1nw? ?提取碼:38zp