色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32之CANTTCAN模式淺析

          STM32之CANTTCAN模式淺析

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏

          1 前言

          傳統(tǒng)CAN 采用事件觸發(fā)消息傳輸機制,CSMA/ CD+ AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 載波偵聽、多路訪問、沖突檢測、優(yōu)先級仲裁) 介質(zhì)訪問控制機制, 即多個消息同時發(fā)送時, 按照消息標識符的優(yōu)先級順序, 低優(yōu)先級消息自動退出, 高優(yōu)先級消息繼續(xù)發(fā)送。這種介質(zhì)訪問方式提高了網(wǎng)絡的利用率和高優(yōu)先級消息的實時性, 但在重負載CAN 中, 低優(yōu)先級消息經(jīng)常由于總線沖突而被迫退出發(fā)送, 導致低優(yōu)先級消息傳輸時延長, 且傳輸時延不可預測, 因此, CAN 不適合實時性和可靠性要求特別高或有安全性要求的場合, 如汽車電子鐘的X-by-w ir e( 線控技術) 。為此國外有專家自2000 年起研究時間觸發(fā)機制的CAN --TT CAN。2004 年國際標準化組織將TT CAN 制定為ISO 11898-4國際標準。

          本文引用地址:http://cafeforensic.com/article/201611/318484.htm

          2 什么是TTCAN?

          TT CA N 是CAN 的高層協(xié)議, 其數(shù)據(jù)鏈路層需要幀起始時刻信息。T TCAN 在CAN 的物理層和數(shù)據(jù)鏈路層基礎上, 通過調(diào)度表實現(xiàn)網(wǎng)路上節(jié)點的分時同步通信。網(wǎng)路上各節(jié)點取得同步后, 消息只能根據(jù)調(diào)度表在規(guī)定的時間隙傳輸, 避免了消息傳輸?shù)臎_突、仲裁,消息傳輸時延短, 且可預知。具體介紹請參考ISO11898-4。

          3 STM32中的TTCAN實現(xiàn)

          3.1 開啟TTCAN模式

          STM32是通過主控制寄存器(CAN_MCR)的TTCM位來控制TTCAN模式的使能開關的。CAN_MCR寄存器如下所示:

          地址偏移量: 0x00
          復位值: 0x0001 0002

          圖1

          位31:16保留,硬件強制為0。
          位15RESET: bxCAN 軟件復位
          0: 本外設正常工作;
          1: 對bxCAN進行強行復位,復位后bxCAN進入睡眠模式(FMP位和CAN_MCR寄存器被初始化為其復位值)。此后硬件自動對該位清0。
          位14:8保留,硬件強制為0。
          位7TTCM: 時間觸發(fā)通信模式
          0: 禁止時間觸發(fā)通信模式;
          1: 允許時間觸發(fā)通信模式。
          位6ABOM: 自動離線(Bus-Off)管理
          該位決定CAN硬件在什么條件下可以退出離線狀態(tài)。
          0: 離線狀態(tài)的退出是在,軟件對CAN_MCR寄存器的INRQ位進行置1隨后清0后,一旦硬件檢測到128次11位連續(xù)的隱性位,就退出離線狀態(tài);
          1: 一旦硬件檢測到128次11位連續(xù)的隱性位,自動退出離線狀態(tài)。
          位5AWUM: 自動喚醒模式
          該位決定CAN處在睡眠模式時由硬件還是軟件喚醒
          0: 睡眠模式通過清除CAN_MCR寄存器的SLEEP位,由軟件喚醒;
          1: 睡眠模式通過檢測CAN報文,由硬件自動喚醒。喚醒的同時,硬件自動對CAN_MSR寄存器的SLEEP和SLAK位清0 。
          位4NART: 禁止報文自動重傳
          0: 按照CAN標準,CAN硬件在發(fā)送報文失敗時會一直自動重傳直到發(fā)送成功;
          1: CAN報文只被發(fā)送1次,不管發(fā)送的結果如何(成功、出錯或仲裁丟失)。
          位3RFLM: 接收FIFO鎖定模式
          0: 在接收溢出時FIFO未被鎖定,當接收FIFO的報文未被讀出,下一個收到的報文會覆蓋原有的報文;
          1: 在接收溢出時FIFO被鎖定,當接收FIFO的報文未被讀出,下一個收到的報文會被丟棄。
          位2TXFP: 發(fā)送FIFO優(yōu)先級
          當有多個報文同時在等待發(fā)送時,該位決定這些報文的發(fā)送順序
          0: 優(yōu)先級由報文的標識符來決定;
          1: 優(yōu)先級由發(fā)送請求的順序來決定。
          位1SLEEP: 睡眠模式請求
          軟件對該位置1可以請求CAN進入睡眠模式,一旦當前的CAN活動(發(fā)送或接收報文)結束,CAN就進入睡眠。
          軟件對該位清0使CAN退出睡眠模式。
          當設置了AWUM位且在CAN Rx信號中檢測出SOF位時,硬件對該位清0。
          在復位后該位被置1-CAN在復位后處于睡眠模式。
          位0INRQ: 初始化請求
          軟件對該位清0可使CAN從初始化模式進入正常工作模式:當CAN在接收引腳檢測到連續(xù)的11個隱性位后,CAN就達到同步,并為接收和發(fā)送數(shù)據(jù)作好準備了。為此,硬件相應地對CAN_MSR寄存器的INAK位清0。
          軟件對該位置1可使CAN從正常工作模式進入初始化模式:一旦當前的CAN活動(發(fā)送或接收)結束,CAN就進入初始化模式。相應地,硬件對CAN_MSR寄存器的INAK位置1。

          如上,只需要將CAN_MCR寄存器的TTCM位置1則開啟了TTCAN模式。此時STM32的CAN模式以TTCAN模式進行通信。

          STM32F20x的固件庫對應開啟TTCAN模式的接口為:

          /* @brief  Enables or disables the CAN Time TriggerOperation communication mode.* @note   DLC must be programmed as 8 in order Time Stamp (2 bytes) to be *         sent over the CAN bus.  * @param  CANx: where x can be 1 or 2 to to select the CAN peripheral.* @param  NewState: Mode new state. This parameter can be: ENABLE or DISABLE.*         When enabled, Time stamp (TIME[15:0]) value is  sent in the last two*         data bytes of the 8-byte message: TIME[7:0] in data byte 6 and TIME[15:8] *         in data byte 7. * @retval None*/void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState);

          或者在初始化CAN_Init時,將CAN_InitTypeDef的成員CAN_TTCM使能。

          3.2 開啟時間戳

          在TTCAN模式下,CAN硬件的內(nèi)部定時器被激活,并且被用于產(chǎn)生發(fā)送與接收郵箱的)時間戳,分別存儲在CAN_RDTxR/CAN_TDTxR寄存器中。內(nèi)部定時器在每個CAN位時間累加。內(nèi)部定時器在接收和發(fā)送的幀起始位的采樣點位置被采樣,并生成時間戳。如下:

          發(fā)送郵箱時間戳:

          圖2

          如上圖:在TTCAN模式下,TIME[15:0]將保留SOF的時間戳。

          若通過將TGT位置1則開啟了時間戳,此時TIME[15:0]將保存了在發(fā)送該報文SOF的時刻,16位定時器的值。同時,在發(fā)送長度為8的報文中,時間戳TIME[15:0]是最后2個發(fā)送的字節(jié):TIME[7:0]作為第7個字節(jié),TIME[15:8]為第8個字節(jié),它們替換了寫入CAN_TDHxR[31:16]的數(shù)據(jù)(DATA6[7:0]和DATA7[7:0])。為了把時間戳的2個字節(jié)發(fā)送出去,DLC必須編程為8。

          在源碼中開啟此功能,修改CAN_TypeDef的sTxMailBox[3]的RDTR寄存器。

          接收郵箱時間戳:

          圖3

          在TTCAN模式下,接收郵箱數(shù)據(jù)長度和時間戳寄存器的TIME[15:0]記錄接收到的報文的SOF時間戳。



          關鍵詞: STM32CANTTCAN模

          評論


          技術專區(qū)

          關閉