新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的CAN應用指南

        STM32的CAN應用指南

        作者: 時間:2016-11-27 來源:網絡 收藏
        CAN基本知識:

        CAN協議的特點:

        本文引用地址:http://www.104case.com/article/201611/322581.htm

        1、多主機控制。在總線空閑時,所有單元都可以發送消息,若兩個以上同時開始發送消息,根據標識符來決定優先級。優先級高的先發送。

        2、系統的若軟性。與總線相連的單元沒有類似地址的信息。因此在總線上增加單元時,應用層程序基本不需要改變。

        3、通信速度快,通信距離遠。最高1Mbps(距離小于40M),最遠可達10Km(速率低于5Kbps)。

        4、具有錯誤檢測、錯誤通知和錯誤恢復功能。所有單元都可以檢測錯誤,檢測出錯誤的單元會立即同時通知其他所有單元,正在發送消息的單元一旦檢測出錯誤,會強制結束當前的發送。前置結束發送的單元會不斷反復地重新發送該消息直到發送成功。

        5、故障封閉功能。CAN可以判斷出錯誤的類型是總線上的數據錯誤還是持續的數據錯誤。由此功能,當總線上發生持續數據錯誤時,可以將引起此故障的單元從總線上隔離出去。

        6、連接節點多。CAN總線是可同時連接多個單元的總線。可連接的單元總數理論上是沒有限制的。單實際上受到時間延遲和電氣負載的限制。降低通信速度,可連接單元增加。反之,反之。

        STM32的CAN時間特性(有關波特率):

        與CAN2.0B的協議內容相比,STM32的CAN時間特性稍微有些區別。STM32把傳播時間段和相位緩沖段1合并了,因此STM32的CAN一個位只有3段:同步段(SYNC_SEG)、時間段1(BS1)和時間段2(BS2)。STM的BS1段可以設置為1-16個時間單元,剛好等于傳播時間段和相位緩沖段1之和。

        波特率=1/正常的位時間

        正常的位時間=1×tq+tbs1+tbs2

        其中:tbps1=tq×(TS1[3:0]+1)

        tbps2=tq×(TS2[3:0]+1)

        tq=(BRP[9:0]+1)×tpclk

        tq是一個時間單元

        tpclk是APB時鐘的時間周期

        因此,我們只需要知道BS1和BS2的設置,以及APB1的時鐘頻率(一般為36MHz),就可以方便的計算出波特率。比如設置TS1=6,TS2=7和BRP=4,在APB1頻率為36MHz的條件下,即可得到CAN通信的波特率=36000/[(7+8+1)*5]=450Kbps。

        要用到的寄存器:

        主控制寄存器CAN_MCR:控制進退初始化,發送FIFO優先級。

        時序寄存器CAN_BTR:用來設置分頻、Tbps、Tbs2以及Tsjw等非常重要的參數,直接決定了CAN的波特率。另外還可以設置工作模式(靜默模式、環回模式)等。

        發送郵箱標識符寄存器CAN_TIxR:該寄存器用來設置標識符(包括擴展標識符),另外還可以設置幀類型。

        發送郵箱數據長度和時間戳寄存器CAN_TDTxR:用來設置數據長度。

        發送郵箱低字節數據寄存器CAN_TDLxR:用來存儲將要發送的數據,只能存儲低4個字節。

        發送郵箱高字節數據寄存器CAN_TDHxR:用來存儲將要發送的高4個字節。

        接收FIFO郵箱標識符寄存器CAN_RIxR:該寄存器用來保存接收到的報文標識符等信息,通過讀該寄存器獲取相關信息。

        接收FIFO郵箱數據長度和時間戳寄存器CAN_RDTxR;接收FIFO郵箱低字節數據寄存器CAN_RDLxR;接收FIFO郵箱高字節數據寄存器CAN_RDHxR,同發送。

        過濾器模式寄存器CAN_FM1R:設置各濾波器組的工作模式,對28個濾波器組的工作模式,都可以通過該寄存器設置,不過該寄存器必須在濾波器處于初始化模式下才可以設置。

        過濾器位寬寄存器CAN_FS1R:用于設置各濾波器組的位寬。其他同上。

        上述兩個寄存器用來設置過濾器。

        如FSCx=1,FBMx=0:那么其中第x個寄存器組就被設置為1個32位過濾器-標識符屏蔽,此時本濾波器組可以設置成1個過濾器。(見參考手冊P432)

        如FSCx=1,FBMx=1:那么其中第x個寄存器組就被設置為2個32位過濾器-標識符列表,此時本濾波器組可以設置成2個過濾器。

        如FSCx=0,FBMx=1:那么其中第x個寄存器組就被設置為2個16位過濾器-標識符屏蔽,此時本濾波器組可以設置成2個過濾器。

        如FSCx=0,FBMx=0:那么其中第x個寄存器組就被設置為4個16位過濾器-標識符列表,此時本濾波器組可以設置成4個過濾器。

        28個過濾器組可以被設置為遠大于28個過濾器數目。

        每個FIFO各自對其關聯的過濾器進行編號。過濾器組關聯設置通過寄存器CAN_FFA1R即過濾器FIFO關聯寄存器來設置。

        過濾器激活寄存器CAN_FA1R:該寄存器來控制過濾器的激活與否。1開啟0關閉。

        過濾器組i的寄存器x CAN_FiRx:用來存放過濾參數。

        STM32 CAN總線初始化步驟:

        1、配置相關引腳的復用功能,使能CAN時鐘。

        使能CAN時鐘,通過APB1ENR的第25位來設置。其次要設置CAN的相關引腳為復用輸出,設置為上拉輸入(CAN_RX),設置為復用輸出(CAN_TX),并使能PA口的時鐘。

        2、設置CAN工作模式及波特率等。

        先設置CAN_MCR寄存器的INRQ位,讓CAN進入初始化模式,然后設置CAN_MCR的其他相關控制位,再通過CAN_BTR設置波特率和工作模式(正常模式/環回模式)等信息。最后設置INRQ為0,退出初始化模式。

        3、設置濾波器。

        設置CAN_FMR的FINIT位,讓過濾器組工作在初始化模式下,然后設置濾波器組0的工作模式以及標識符ID和屏蔽為。最后激活濾波器。并退出濾波器初始化模式。如果用到中斷,還要配置中斷模式。

        具體的:

        如何初始化CAN:

        1、使能相關時鐘(PORTA時鐘,CAN時鐘),初始化引腳RX和TX。

        2、設置CAN_MCR,退出睡眠模式,同時設置參數。基本是所有位清零。關于睡眠模式,CAN在復位后都是進入睡眠模式,當然也可以設置自動喚醒模式等。

        3、請求CAN進入初始化模式,對CAN_MSR的位0置1。等待進入初始化,檢驗MCR位0 INAK的值,當真正變為1的時候,在進行下一步。因為這個過程可能不是瞬間完成的,如果當前有CAN活動,就會等到本次活動結束后再進入初始化模式,硬件對INAK位置1。

        4、設置CAN_MCR的各位,位2-位7。設置位時序寄存器CAN_BTR的各位,在這里可以設置靜默模式、環回模式、波特率。

        5、請求CAN退出初始化模式。設置MCR的位0.等待完全退出初始化模式,通過檢驗MSR的位。

        6、初始化過濾器(初始化寄存器不是在CAN初始化模式下進行的,而是過濾器組工作到初始化模式)。設置過濾器主控寄存器CAN_FMR的位0,使過濾器組工作在初始化模式。

        7、設置過濾器激活寄存器CAN_FA1R來禁用相應的過濾器,因為只有對相應位清零或者對CAN_FME的FINIT位設置位1,才能修改相應的過濾器寄存器CAN_FiRx。

        8、設置過濾器模式CAN_FM1R(標識符屏蔽模式or標識符列表模式);設置過濾器位寬寄存器CAN_FS1R(1個32位的過濾器or2個16位的過濾器);設置過濾器FIFO關聯寄存器CAN_FFA1R(過濾器關聯到FIFO0還是FIFO1當中)。

        9、填寫過濾器標識和屏蔽。通過設置寄存器CAN_FiR1和CAN_FiR2來設置標識(ID)和屏蔽(MASK)。

        10、激活過濾器,CAN_FA1R位0設置為1。

        11、過濾器進入正常工作模式,CAN_FMR位0清零

        如何發送一個報文:

        1、判斷三個郵箱中哪個為空(CAN_TSR的位26位27位28),哪個為空用哪個?如果沒有空郵箱,則退出本次發送過程。

        2、清除發送郵箱標識符寄存器(因為要填寫新的標識符)。

        3、設置發送郵箱的標識符寄存器CAN_TIxR。

        4、設置發送郵箱的數據長度和時間戳寄存器CAN_TDTxR。

        5、填寫要發送的數據,即設置發送郵箱高低字節數據寄存器CAN_TDHxR和CAN_TDLxR。

        6、對標識符寄存器CAN_TIxR的位0即TXRQ位置1,來請求發送郵箱的數據。當數據發送完成后,硬件對其清零。

        7、查詢發送狀態,通過查詢發送狀態寄存器CAN_TSR。基本查詢三個狀態參數。位0 RQCP1郵箱0(不一定是0,看使用的是哪個郵箱了)請求完成;位1 TXOK0郵箱0發送成功;位26發送郵箱0位為空,沒有等待發送的報文。當這三項都成功后,返回發送成功。

        如何接收一個報文:

        1、查詢FIFO里面是否存在有效報文,查詢接收FIFO0寄存器CAN_RF0R的位1:0當前接收FIFO中存放的報文數目。如果有數據,下一步將數據讀出。

        2、判斷標識符類型,接收來的報文是采用標準標識符還是擴展標識符。CAN_RIxR的位2 IDE。

        3、根據不同類型的標識符來做不同的操作。具體可查看CAN_RIxR的位31:3。擴展標識符低字節存在位20:3。擴展標識符或標準標識符存在位31:21。擴展標識符39位,標準標識符11位。

        4、查詢CAN_RIxR的位1來判定是數據幀還是遠程幀。

        5、查詢CAN_RDTxR位3:0獲取數據幀的數據長度。

        6、讀取接收FIFO郵箱高低字節數據寄存器CAN_RDLxR和CAN_RDHxR。

        7、釋放FIFO郵箱。CAN_RF0R的位5。

        如何使CAN接收工作在中斷模式下:

        1、通過寄存器CAN_IER來設置中斷使能,正常情況下使用位1,FMPIE0:FIFO0消息掛號中斷使能置1。

        2、中斷分組

        3、寫中斷處理函數(較自由)。可以通過設置中斷使能來屏蔽有寫中斷,如果中斷都打開的話就需要在中斷處理函數里面來進行判斷處理。因為每個CAN只有4個主中斷,即發送中斷、接收FIFO0中斷、接收FIFO1中斷和SCE中斷。



        關鍵詞: STM32CAN應用指

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 晋州市| 黄平县| 沾化县| 长治县| 汾西县| 仁寿县| 花莲市| 九台市| 庆云县| 长沙县| 怀化市| 乐业县| 新平| 新竹县| 肃北| 江油市| 岐山县| 高青县| 象山县| 保定市| 大关县| 独山县| 封开县| 沛县| 龙胜| 唐河县| 泾源县| 太和县| 白银市| 临朐县| 古交市| 新郑市| 南开区| 黄浦区| 东兰县| 九龙城区| 靖江市| 巴马| 武山县| 尖扎县| 贡山|