完整教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
第90章 STM32H7的CAN FD總線之關鍵知識點整理
CAN FD(CAN with flexible data-rate)是CAN2.0協議的擴展,CAN-FD由博世開發,並由 ISO 11898-1:2015標准化。
90.1 初學者重要提示
90.2 CAN FD協議介紹
90.3 CAN FD相比CAN2.0的提升
90.4 CAN FD協議介紹
90.5 CAN FD的RAM區管理
90.6 CAN FD過濾區
90.7 CAN FD接收區
90.8 CAN FD發送區
90.9 CAN FD測試模式
90.10 FDCAN時鍾校准
90.11 FDCAN相比標准bxCAN的提示
90.12 總結
90.1 初學者重要提示
- 本章是對ST官方30多頁的英文文檔翻譯而來(翻譯不准確的地方,大家以英文原版為准),通過本章可以對CAN FD有個系統性的認識。原始的英文文檔下載地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=104728 。
90.2 CAN FD協議介紹
90.2.1 CAN FD特性
(1)兼容經典CAN,可以遵循ISO 11898-1做數據收發。
(2)提升錯誤檢測,支持高達CRC 21位的校驗和。
(3)消息優先級。
(4)保證延遲時間。
(5)配置靈活性。
(6)具有時間同步的組播接收。
(7)系統范圍內的數據一致性,每條消息最多64個字節。
(8)多主機。
(9)錯誤檢測和信號。
(10)區分節點的臨時錯誤和永久性故障以及自動關閉缺陷節點。
90.2.2 CAN FD格式
第一個仲裁階段(The first arbitration phase)是一條消息,其中包含:
(1)幀開始(SOF)。
(2)ID號和其他位,指示消息的目的(提供或請求數據),以及速度和格式配置(CAN或CAN-FD)。
數據傳輸階段(The data transmission phase)包括:
(1)數據長度代碼(DLC),指示消息包含多少數據字節。
(2)用戶希望發送的數據。
(3)檢查循環冗余序列(CRC)。
(4)顯性位。
第二個仲裁階段(The second arbitration phase)包含:
(1)總線上其他節點發送的確認(ACK)的接收器(如果至少有一個接收器成功收到消息)
(2)幀尾(EOF),在IFS期間不傳輸任何消息:目標是將當前幀與下一幀分開。
注意:對於29bit標識符幀,當添加18bit標識到第1個仲裁階段的IDE bit之后與標准CAN FD是類似的。
90.3 CAN FD相比CAN2.0的提升
CAN-FD的開發可以滿足需要更高帶寬的通信網絡需求。每幀最多具有64個字節的CAN-FD以及將比特率提高到最大的可能性,使數據階段要快8倍,在第二個仲裁階段要恢復到正常的比特率。通過以下方式確保數據傳輸的完整性:
(1)17級多項式對最大16字節的有效載荷進行CRC。
(2)21級多項式對16到64字節之間的有效載荷進行校驗。
標准幀和CAN FD的區別:
標識符后,CAN 2.0和CAN-FD具有不同的作用:
(1)CAN 2.0發送RTR位以精確確定幀類型:數據幀(RTR為主要)或遠程幀(RTR)是隱性的)。
(2)由於CAN-FD僅支持數據幀,因此始終發送占優勢的RRS(保留)。
IDE位保持在相同位置,並以相同的動作來區分基本格式(11位標識符)。請注意,在擴展格式的情況下,IDE位以顯性或隱性方式傳輸(29位標識符)。
與CAN 2.0相比,在CAN-FD幀中,在控制字段中添加了三個新位:
(1)擴展數據長度(EDL)位:隱性表示幀為CAN-FD,否則該位為顯性(稱為R0)在CAN 2.0幀中。
(2)比特率切換(BRS):指示是否啟用兩個比特率(例如,當數據階段位以不同的比特率傳輸到仲裁階段)。
(3)錯誤狀態指示器(ESI):指示節點處於錯誤活動模式還是錯誤被動模式。
控制字段的最后一部分是數據長度代碼(DLC),它具有相同的位置和相同的長度(4位),用於CAN 2.0和CAN-FD。 DLC功能在CAN-FD和CAN 2.0中相同,但CAN-FD有很小變化(下表中的詳細信息)。 CAN-FD擴展幀允許單個消息中發送64個數據字節,而CAN 2.0有效負載數據最多可以發送8個字節。
通過增加有效載荷數據的數據字段來改善網絡帶寬,因為需要更少的包處理。 同時,通過為CRC添加更多位來增強消息完整性:
(1)如果有效載荷數據最多為16個字節,則CRC以17位編碼。
(2)如果有效載荷數據大於20(16)個字節,則CRC以21位編碼。
另外,為了確保CAN-FD幀的魯棒性,填充位機制支持CRC字段。下表總結了CAN-FD和CAN 2.0之間的主要區別。 提供的主要功能與CAN 2.0相比,CAN FD的改進之處在於數據有效負載的增加和速度的提高由CAN-FD中可用的BRS,EDL和ESI位來確保。
90.4 CAN FD協議介紹
STM32H7的CAN FD符合ISO 11898-12015標准。STM32器件上的FDCAN的功能如下所示:
(1)符合CAN協議2.0版A,B和ISO 11898-1:2015,-4。
(2)可訪問的10 KB RAM內存,最多可分配2560個字。
(3)改進了接收過濾。
(4)兩個可配置的接收FIFO。
(5)多達64個專用接收緩沖區。
(6)接收高優先級消息時的單獨信令。
(7)多達32個專用發送緩沖區。
(8)可配置的發送FIFO和發送隊列。
(9)可配置的發送事件FIFO。
(10)時鍾校准單元。
(11)收發器延遲補償。
下圖說明了FDCAN框圖。
通過這個框圖要了解到以下信息:
(1)CANFD1和CANFD2共用一個RAM空間。
(2)每個CANFD都有自己的內核。
(3)CAN內核實現協議控制和收發移位寄存器。
(4)Tx handler控制消息從CAN消息RAM到CAN內核。
(5)Rx handler控制CAN內核到CAN消息RAM。
90.5 CAN FD的RAM區管理
必須配置每條消息的字節數,以確定每條消息所需的內存大小。 CAN-FD上有效負載的增加可以更有效的將內存都利用起來,並允許更多消息要存儲在分配的存儲空間中。總的專用RAM大小是2560個32bit數據。
(1)過濾區(11bit過濾和29bit過濾)
(2)接收區(Rx FIFO 0,Rx FIFO 1和Rx Buffer)
(3)發送區(Tx event FIFO,Tx Buffers)
(4)觸發空間(Trigger memory)
FDCAN外設的所有部分都可以由用戶配置。 所有部分的所有元素之和必須不能超過CAN消息RAM的總大小。 該RAM通過以下方式提高了靈活性和性能:從而有可能消除未使用的部分,並為其他部分擴展足夠的內存。在CAN消息中以動態且連續的方式分配每個部分(按照上圖順序); 但是為了避免超出RAM的風險並且出於可靠性的原因,沒有將特定的開始和結束地址分配給每個部分。
FDCAN外設可以配置三種傳輸機制:Tx buffer ,Tx queue 和 Tx FIFO並可以通過Rx buffer 和 Rx FIFO 接收。 它們配置有起始地址偏移量和要存儲的存儲元素。 起始地址是在配置中預定義的(0到2560),用戶必須確保每個內存空間中的元素數量不會導致它們重疊。
注:消息的接收和發送意味着在RAM級別存儲“元素”。 這個“元素”僅包含標識符,DLC,控制位(ESI,XTD,RTR,BRS,FDF),數據字段和特定的發送/接收位字段進行控制。 CAN消息的其余位會自動由硬件處理而不保存在RAM中 。
用於控制接收的特定位字段是濾波器索引,可接受的不匹配幀和Rx時間戳。用於傳輸的特定位字段是消息標記(message marker)和event FIFO控制位。無論Tx buffer, Tx FIFO, Tx queue 或 Rx buffer 中的每個元素分配的32bit的數量是多少,要計算保留:
(1)標頭信息(兩個保留的32bit),用於分配標識符,DLC字段,控制位和特定的發送/接收位字段。
(2)數據(足夠的32bit數據個數)以包含每個數據字段的字節數。
下面的公式確定為每個元素分配的32bit的數量:
元素大小(以字為單位)=標頭信息(2個字)+數據(數據字段/ 4)
其中數據字段是每條消息的數據字節數
如果數據字段的范圍是0到8,則每個元素為數據分配2個字。下表詳細介紹了必要的“元素”大小,具體取決於數據字段范圍:
有效使用CAN消息RAM的示例。 這個例子假設配置了FDCAN外設的應用程序:
(1)發送帶有專用Tx buffer的32條消息(每個消息在數據字段中包含8個字節)。
(2)具有128個11位過濾器,用於接收消息。
(3)接收64條消息,其中每個消息在專用Rx buffers的數據字段中包含64個字節。
(4)接收64條消息,其中每個消息在Rx FIFO 0的數據字段中包含64個字節。
在此示例中,RAM中的分配按以下順序進行:
(1)在ID-11位部分分配128個字。
(2)保留1152個字用於接收Rx FIFO 0部分中的元素。
(3)保留1152個字,用於接收Rx緩沖區中的元素。
(4)為發送緩沖區中發送的元素保留128個字。
由於采用了動態分配,並且不對未使用的段進行任何分配,因此整個內存大小有效利用了RAM:在此應用程序中分配了所有2560個字。
注意:配置后,分配的地址范圍初始化為零。
大多數STM32設備支持一個以上的FDCAN外設來滿足所有應用程序要求。在這種情況下,重要的是要說RAM是在不同外設之間共享的。 用戶可以划分各種外設上的RAM(每個外設的大小通過指示其起始偏移地址來選擇)。下圖顯示了使用多個FDCAN實例的CAN消息RAM的示例。 這該示例假定用戶將CAN消息RAM分為兩個外設:第一個外設的大小為第二個外設的兩倍。
90.6 CAN FD過濾區
CAN總線的標識符過濾器很重要。
過濾器是用於接收的,發送的時候無需設置過濾器,這點一定要整明白。根據發送端發送來的幀數據,通過標識符過濾器就可以設置僅接收需要接收的幀數據有效降低CPU多余的處理時間。
FDCAN外設可以配置兩套驗收濾波器:一套用於標准標識符,一種是擴展標識符,用於存儲或拒絕接收到的消息。128個過濾元素可以配置用來配置128個11bit標准ID和64個過濾元素可以用來配置64個29bit擴展ID。11位過濾器部分的起始地址通過FDCAN_SIDFC寄存器中的FLSSA [13:0]位進行配置,並且通過FDCAN_XIDFC寄存器中的FLESA [13:0]配置29位濾波器部分。下圖顯示了CAN消息RAM的一部分,其中包含過濾器元件的數量及其開始位置地址。
可以將這些過濾器分配給Rx FIFO 0/1或專用的Rx buffers。 FDCAN執行接受過濾,它總是從過濾器元素#0開始,然后遍歷過濾器列表以找到匹配項元素。驗收過濾在第一個匹配元素處停止,而隨后的過濾元素不在針對此消息進行了檢索。因此,配置過濾器元素的順序對過濾性能有很重要的影響。用戶選擇啟用或禁用每個過濾器元素,並可以配置每個元素以接受或拒絕過濾。每個過濾器元素可以配置為:
(1)范圍過濾器(Range filter):該過濾器匹配標識符在兩個ID定義的范圍內的所有消息。
(2)專用ID的過濾器(Filter for dedicated IDs):可以將過濾器配置為匹配一個或兩個特定的標識符。
(3)經典位屏蔽過濾器(Classic bit mask filter):通過對接收到的標識符的位進行屏蔽來匹配標識符組。第一個ID配置為消息ID過濾器,第二個ID為過濾器屏蔽。過濾器屏蔽的每個零位屏蔽已配置的ID過濾器的相應位位置。
注:如果所有位均等於1,則僅當接收到的消息ID和消息ID過濾器相同時,才會發生匹配。 如果所有掩碼位均等於0,所有消息ID均匹配。
90.6.1 高優先級消息
當收到高優先級消息時,FDCAN可以通知用戶。 此通知可用於監視傳入的高優先級消息的狀態並啟用對這些元素的快速訪問。FDCAN在消息過濾器的幫助下檢測到高優先級消息。 過濾器元素提供以下內容與高優先級郵件相關的設置:
(1)設置優先級並在過濾器匹配的情況下存儲在FIFO 0/1中:如果此消息過濾器匹配,則FDCAN通知高優先級消息到達的信息,並將元素存儲在Rx FIFO 0/1中。
(2)如果過濾器匹配,則設置優先級:如果此消息過濾器匹配,則FDCAN會通知有關高優先級的信息消息到達,但不存儲元素。
接收過濾流程圖:
90.6.2 舉例說明
為了說明可以使用的不同類型的過濾器以及每種類型的結果,我們假設用戶想要配置FDCAN:
(1)拒絕所有標識符在[0x16到0x20]范圍內的消息
(2)接受所有標識符等於0x15或0x120的消息,並將它們存儲在FIFO 1中
(3)接受標識符等於0x130的消息並將其存儲在Rx緩沖區索引4中
(4)接受具有與以下內容相對應的標識符的消息:
–bit[10..6] = 0b111 00
–bit[5..4] = 不管,任意值
–bit[3..0] = 0b00000
在這種情況下,必須將過濾器配置為經典位屏蔽過濾器,因為可接受的標識符對應於0b11100XX0000(其中x可以是0或1中的任何值)。 可接受的標識符是:
– 0b111 0000 0000(0x700)
– 0b111 0001 0000(0x710)
– 0b111 0010 0000(0x720)
– 0b111 0011 0000(0x730)
基本過濾器ID可以是0x700、0x710、0x720、0x730中的任何值。 屏蔽過濾器ID等於0b111 1100 1111(0x7CF)。下表介紹了標准11位消息ID過濾器的不同配置,如上面的例子。 每個標准過濾器元素包含:
(1)SFT位(標准過濾器類型)
(2)SFEC位(標准過濾器元素配置)。
(3)SFID1位(標准過濾器ID1)
(4)SFID2位(標准過濾器ID2)
第一個過濾器配置為拒絕ID為[0x16 ... 0x20]范圍內的消息。
第二個過濾器配置為將ID等於雙ID 0x15或0x120的消息存儲在Rx FIFO 1中。
第三過濾器被配置為將ID等於0x130的消息存儲在Rx緩沖區索引4中。
注意:如果將SFEC配置為“存儲到"Rx buffer”,則將忽略SFT的配置。 驗收過濾器停在第一次匹配。 因此,篩選器的順序很重要。本示例以與用戶配置擴展過濾器相同的方式配置標准過濾器(請參閱產品數據表以了解更多詳細信息)。FDCAN的眾多過濾器可能性允許在硬件中進行復雜的消息過濾,這使得軟件過濾冗余並節省CPU資源。
90.7 CAN FD接收區
90.7.1 Rx FIFO 0和Rx FIFO 1
可以在CAN消息RAM中配置兩個Rx FIFO。 每個Rx FIFO部分最多可存儲64個元素。每個元素存儲在一個Rx FIFO元素中。可以通過FDCAN_RXESC寄存器分別為每個Rx FIFO配置Rx FIFO元素的大小。Rx FIFO元素大小定義了可以存儲一個接收元素的數據字段字節數。 一個大小Rx FIFO元素由前面RAM管理中指定的公式定義。
標頭信息包含標識符,DLC字段,控制位和位字段(過濾器索引,可接受的不匹配幀,Rx時間戳)。通過FDCAN_RXESC寄存器中的F1DS [2:0]字段配置元素大小后,Rx FIFO 1的元素個數和起始地址必須分別通過FDCAN_RXF1C寄存器中的F1S [6:0]和F1SA [13:0]進行配置。下圖顯示了CAN消息RAM上的Rx FIFO部分,其中包含可以支持和每個部分的開始地址。
Rx FIFO的起始地址是第一個Rx FIFO元素的第一個字的地址。收到的元素通過匹配過濾的數據將根據匹配的過濾器元素存儲在適當的Rx FIFO中。如果Rx FIFO已滿,則可以根據兩種不同模式來處理新到達的元素:
(1)阻塞模式:這是Rx FIFO的默認操作模式,沒有其他元素寫入RxFIFO,直到至少一個元素已被讀出。
(2)覆蓋模式:Rx FIFO中接受的新元素將覆蓋Rx FIFO中最舊(最先接收的數據)的元素並且FIFO的put和get索引加1。
要從Rx FIFO讀取元素,CPU必須執行以下步驟:
(1)讀取寄存器FDCAN_RXF1S以了解Rx FIFO的狀態。
(2)按照以下公式計算RAM中最舊的元素的地址:
Oldest element address = CAN_message_RAM_base_address + FDCAN_RXF1C.F1SA (start address) + FDCAN_RXF1S.F1GI (get Index) x Rx FIFO_element_size.
(3)從計算出的地址中讀取元素。
CPU從Rx FIFO讀取一個元素或一系列元素后,它必須確認讀取。確認后,FDCAN可以將相應的Rx FIFO緩沖區重新用於新元素。為了確認一個或多個元素,則CPU必須將從Rx FIFO讀取的最后一個元素的緩沖區索引寫入FDCAN_RXF1A寄存器。結果,FDCAN更新了FIFO填充級別和get索引。
RX FIFO流程:
Rx FIFO 0和Rx FIFO 1具有相同的寄存器,它們的名稱有意義,方法是更改每次的FIFO數量。
90.7.2 專用的Rx buffer
FDCAN支持多達64個專用Rx buffers。 每個專用的Rx buffers可以存儲一個元素。專用Rx buffers的大小可以通過FDCAN_RXESC寄存器進行配置。 Rx buffers大小定義可以存儲多少個接收元素的數據字段字節。 專用Rx buffers的大小由前面RAM組織中描述的公式定義。
通過FDCAN_RXESC寄存器中的RBDS [2:0]字段配置元素大小后,啟動必須通過FDCAN_RXBC寄存器中的RBSA [13:0]字段配置地址。下圖顯示了CAN消息RAM上的Rx buffers部分,其中有可以支持的最大數量的Rx buffers元素和起始地址。
當將元素存儲在專用Rx緩沖區中時,FDCAN通過FDCAN_IR寄存器的DRX位設置中斷標志以及新數據標志FDCAN_NDAT1或FDCAN_NDAT2寄存器中的相應位。當FDCAN_NDAT1 / 2中的位置1時,相應的Rx緩沖區將被鎖定(不會被新元素覆蓋),並且相應的過濾器不匹配。 讀取元素后,CPU必須將相應的位復位FDCAN_NDAT1 / 2,以解鎖相應的Rx緩沖區。
要從專用Rx緩沖區讀取元素,CPU必須執行以下步驟:
(1)檢查FDCAN_NDAT1 / 2中的位,以了解是否有新元素到達專用Rx緩沖區。
(2)計算CAN消息RAM中元素的地址,如以下公式所示:
Reference Rx buffer address = CAN_message_RAM_base_address + FDCAN_RXBC.RBSA (startaddress) + dedicated Rx buffer index x Rx_Buffer_element_size.
(3)從計算出的地址中讀取消息。
過濾器元素可以引用Rx緩沖區索引(0到63)作為接收元素的目的地。如果相應的過濾器匹配,則FDCAN僅執行對引用的Rx緩沖區位置的寫操作。 換一種說法,FDCAN不會寫入未引用的Rx緩沖區位置。
90.7.3 舉例說明(含Rx FIFO和Rx buffer的差異)
為了配置過濾器元素以引用Rx緩沖區索引60,必須至少配置61個Rx緩沖區。注意:用戶必須選擇最佳配置,以避免浪費RAM。下圖顯示了簡化Rx緩沖區操作的流程圖:
如前面所述,FDCAN具有兩種機制:專用Rx buffer或Rx FIFO 0/1可以將配置為存儲接收到的元素。下表描述了專用Rx緩沖區和Rx FIFO之間的差異。
90.8 CAN FD發送區
90.8.1 Tx event FIFO區
通過使用Tx event FIFO,CPU獲得有關已發送元素的以下信息:
(1)元素傳輸的順序.
(2)每個元素傳輸幀的本地時間。
FDCAN提供發送event FIFO。 該Tx event FIFO的使用是可選的。 FDCAN在CAN總線上傳輸了一個元素成功后,它可以將消息ID和時間戳存儲在Tx event FIFO中元素。 Tx event FIFO元素是一種數據結構,用於存儲已傳輸消息。 Tx可以通過FDCAN_TXEFC寄存器配置事件FIFO(Tx事件FIFO配置)。 FIFO可以存儲最多32個元素。下圖顯示了存儲Tx事件FIFO元素的CAN消息RAM的示例EFSA [13:0]字段包含起始地址。
CAN消息RAM中的Tx事件FIFO元素的地址由以下公式確定:
Tx event FIFO element address = CAN_message_RAM_base_address + FDCAN_TXEFC.EFSA (startaddress) + FDCAN_TXEFS.EFGI (get index) x Tx_event_FIFO_element_size
為了將 Tx event鏈接到Tx event FIFO元素,將來自已發送Tx buffer的消息標記復制到Tx event FIFO 元素。
僅當Tx buffer元素中的EFC位(存儲Tx事件)等於1時,事件才存儲在Tx event FIFO中。當Tx event FIFO已滿時,不會再有其他元素寫入Tx event FIFO,直到至少有一個元素被寫入為止。讀出后,Tx event FIFO獲取索引增加。如果在Tx event FIFO已滿時發生Tx event,則這事件被丟棄。為避免Tx event FIFO溢出,可以使用Tx event FIFO水印。CPU從Tx event FIFO讀取一個元素或元素序列后,CPU必須確認閱讀。因此,它會通過FDCAN_TXEFA寄存器EFAI [4:0]字段寫入從Tx event FIFO讀取的最后一個元素的索引。
90.8.2 Tx buffer區(含Tx buffer,Tx FIFO和Tx queue)
為了使外設傳輸元素,該元素在定義的存儲空間內,並且傳輸開始。 傳輸的元素存儲在Tx buffer中,用戶可以選擇使用的機制:專用的Tx buffer或Tx queue或Tx FIFO。FDCAN最多支持32個元素。 每個元素存儲標識符,DLC,控制位(ESI,XTD,RTR,BRS,FDF),數據字段,位字段消息標記和事件FIFO控制位,僅一條消息。
在RAM上的分配按以下順序進行:如果應用程序使用了專用的Tx buffer,則它們在Tx FIFO和Tx queue.之前分配。 用戶只能在同一隊列中選擇Tx queue或Tx FIFO應用程序:FDCAN不支持它們的組合。
如下圖所示,Tx buffer的起始地址是通過FDCAN_TXBC寄存器的TBSA [13:0]字段配置:
如前一節所述,RAM中的分配是以動態且連續的方式進行的,因此,如果用戶未配置Dedicated Tx buffer。 Tx buffer部分僅包含配置的Tx queue 或 Tx FIFO,並將其存儲在起始段地址中。
90.8.3 專用Tx buffers區(Dedicated Tx buffers)
專用Tx buffer的數量是通過FDCAN_TXBC寄存器中的NTDB [5:0]字段配置的。每個專用Tx buffer配置有特定的標識符,以僅存儲一個元素。 傳輸是通過FDCAN_TXBAR寄存器的添加請求。 所請求的消息在外部進行仲裁的CAN總線上,並根據最低標識符(最高優先級)發送出去。專用Tx buffer的內存要求取決於Tx buffer元素的大小。Tx buffer元素大小定義了屬於Tx buffer的數據字節數。使用以下公式計算CAN消息RAM中專用Tx緩沖區的地址:
Dedicated Tx buffer address = CAN_message_RAM_base_address + FDCAN_TXBC[TBSA] (start address)+ Tx_buffer_index x Tx_buffer_element_size
Tx buffer操作機制:
如果多個專用Tx buffer配置了相同的ID,則具有第一個傳輸請求的Tx buffer首先發送。
90.8.4 Tx FIFO
通過將0寫入FDCAN_TXBC中的TFQM位來配置Tx FIFO操作。元素存儲在通過get索引中FDCAN_TXFQS的TFG1 [4:0]字段,從get索引引用的元素開始發送Tx FIFO。每次發送后,get索引都會循環遞增,直到Tx FIFO緩沖區為空。Tx FIFO可以按照已將元素寫入Tx FIFO的順序傳輸元素。傳輸與各個標識符的優先級無關,因為FIFO首先發送出去。
FDCAN通過FDCAN_TXFQS中的TFFL [5:0]字段計算Tx FIFO緩沖區的空閑級別,作為get和put索引之間的差值(get和set索引之間有兩種機制遞增每個事務以指示下一個事務RAM上要讀取或寫入元素的緩沖區位置)。該值指示可用(空閑)Tx FIFO的數量元素。
必須從放置索引引用的Tx緩沖區開始,將新的發送元素通過FDCAN_TXFQS中的TFAQPI [4:0]字段指示寫入Tx FIFO。CAN消息RAM中的下一個空閑Tx FIFO緩沖區的地址是使用以下公式計算的:
Next free Tx FIFO buffer address = CAN_message_RAM_base_address + FDCAN_TXBC.TBSA (startaddress) + FDCAN_TXFQS.TFQPI (put Index) x Tx_FIFO_element_size
Tx FIFO機制:
90.8.5 Tx queue
通過將1寫入FDCAN_TXBC中的TFQM位來配置Tx隊列操作。 Tx中存儲的元素從具有最低標識符(最高優先級)的Tx隊列緩沖區開始傳輸隊列。與專用Tx緩沖區相比,RAM上的位置是自動動態管理的,因此消息標識符不固定為預定義的Tx緩沖區索引。
新消息必須寫入到放置索引引用的Tx隊列緩沖區中。周期性添加請求將put索引遞增到下一個空閑Tx隊列緩沖區。FDCAN_TXFQS中的TFQF位設置為1表示Tx隊列已滿。在至少一個以下元素之前,不得將其他元素寫入Tx隊列中。發送請求的元素或取消掛起的傳輸請求。Tx隊列緩沖區的內存要求取決於屬於Tx隊列的數據字節數元素。CAN消息RAM中下一個可用的空閑Tx隊列緩沖區的地址可以通過以下方式計算:
Next free Tx queue buffer address = CAN_message_RAM_base_address + FDCAN_TXBC.TBSA (startaddress) + FDCAN_TXFQS.TFQPI (put index) x Tx_Buffer_element_size
Tx queue機制:
90.8.6 Tx FIFO , dedicated Tx buffer, and Tx queue的區別
90.8.7 Tx FIFO和dedicated Tx buffers混合配置
可以使用混合配置來配置CAN消息RAM的Tx緩沖區部分,其中CAN消息RAM中的Tx緩沖區部分可細分為一組專用Tx緩沖區和一個Tx FIFO。專用Tx緩沖區的數量是通過FDCAN_TXBC中的NDTB [5:0]配置的。 Tx緩沖區的數量通過FDCAN_TXBC中的TFQS [5:0]配置分配給Tx FIFO的地址。
Tx處理程序使用activated transmission request 和the oldest pending掃描所有專用Tx緩沖區get索引引用的Tx FIFO緩沖區。 具有最低標識符的緩沖區將獲得最高優先級,並且是接下來傳送。下圖說明了使用混合專用Tx緩沖區和Tx FIFO的用例:
在此示例中,元素按以下順序發送(假設所有專用Tx緩沖區請求已啟用):
1. Tx buffer 3 (identifier = 1: it is the highest priority between all other dedicated Tx buffers and it has a higher priority than the oldest pending Tx FIFO: Tx buffer 7)
2. Tx buffer 0 (identifier = 3: it is the highest priority between all other dedicated Tx buffers and it has higher priority than the oldest pending Tx FIFO: Tx buffer 7)
3. Tx buffer 7 (because it is the oldest pending Tx FIFO with identifier =4 and has higher priority between all dedicated Tx buffers)
4. Tx buffer 8 (because it is the oldest pending Tx FIFO with identifier =2 and has the highest priority between all dedicated Tx buffers)
5. Tx buffer 4 (identifier = 8: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
6. Tx buffer 2 (identifier = 12: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
7. Tx buffer 1 (identifier = 15: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
8. Tx buffer 5 (because it is the only pending dedicated Tx buffer)。
90.8.8 Tx queue和dedicated Tx buffers混合配置
可以使用混合配置來配置CAN消息RAM的Tx buffer,其中CAN消息RAM中的“ Tx緩沖區”部分可細分為一組專用Tx buffer和一個Tx queue。通過FDCAN_TXBC中的NDTB [5:0]配置專用Tx buffer的數量和Tx queue的數量緩沖區是通過FDCAN_TXBC中的TFQS [5:0]配置的。Tx處理程序掃描具有激活的傳輸請求的所有專用Tx緩沖區和Tx隊列緩沖區。標識符最低的緩沖區獲得最高優先級,然后發送。下圖說明了使用混合專用Tx緩沖區和Tx隊列的用例。
在此示例中,元素按以下順序發送(假設所有專用Tx緩沖區請求已啟用):
1. Tx buffer 3 (identifier = 1: it is the highest priority between all other dedicated Tx buffers and it has a higher priority than the oldest pending Tx FIFO: Tx buffer 7)
2. Tx buffer 0 (identifier = 3: it is the highest priority between all other dedicated Tx buffers and it has higher priority than the oldest pending Tx FIFO: Tx buffer 7)
3. Tx buffer 7 (because it is the oldest pending Tx FIFO with identifier =4 and has higher priority between all dedicated Tx buffers)
4. Tx buffer 8 (because it is the oldest pending Tx FIFO with identifier =2 and has the highest priority between all dedicated Tx buffers)
5. Tx buffer 4 (identifier = 8: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
6. Tx buffer 2 (identifier = 12: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
7. Tx buffer 1 (identifier = 15: it has the highest priority between all other dedicated Tx buffers and the Tx FIFO is empty)
8. Tx buffer 5 (because it is the only pending dedicated Tx buffer)
不支持帶有Tx FIFO和Tx隊列的混合配置。
dedicated buffer + Tx FIFO 和 Tx buffer + Tx queue的區別如下:
在Tx FIFO + Tx隊列中,元素在“添加到RAM”操作之后立即變為掛起狀態。
90.9 CAN FD測試模式
在FDCAN的操作模式下,除了正常操作外,還有幾種測試模式可用。 那里測試模式只能用於生產測試或自測以及校准單元。必須將FDCAN_CCCR中的TEST位設置為1,以允許對FDCAN測試寄存器和存儲器的寫訪問。測試模式和功能的配置。FDCAN以下列模式之一工作:
(1)限制操作模式Restricted-operation mode
(2)總線監控模式Bus-monitoring mode
(3)外部環回模式External loop-back mode
(4)內部環回模式Internal loop-back mode
90.9.1 限制操作模式Restricted-operation mode
在受限操作模式下,FDCAN能夠:
--接收數據幀
--接收遠程幀
--確認有效幀
該模式不支持:
--數據幀發送
--遠程幀發送
--活動錯誤幀或過載幀發送
通過FDCAN_CCCR中的ASM位將FDCAN設置為受限操作模式。當Tx handler 無法從CAN讀取消息RAM准時或時鍾校准激活時,將自動進入受限操作模式。在這種模式下,應用程序測試不同的比特率,並在應用程序收到有效的幀之后退出受限操作模式。下圖說明了在受限操作模式下FDCAN_TX和FDCAN_RX引腳的連接:
注:只要FDCAN處於受限操作模式,FDCAN_TX引腳就處於隱性狀態。 顯性位被傳輸,以此確認接收到有效幀。
90.9.2 總線監控模式Bus-monitoring mode
為了分析總線上的通信量而又不受主要位傳輸的影響,用戶可以設置FDCAN_CCCR中的MON位,可以在總線監視模式下使用FDCAN。在總線監視模式下,FDCAN能夠:
--接收有效的數據幀
--接收有效的遠程幀
該模式不支持:
--傳輸開始
--確認有效幀(與受限操作模式不同)
在總線監視模式下,FDCAN僅在總線上發送隱性位。 下圖顯示了總線監視模式下FDCAN_TX和FDCAN_RX引腳的連接。
90.9.3 外部環回模式External loop-back mode
提供此模式用於硬件自檢。 用戶可以通過以下方式將FDCAN設置為外部環回模式:將1寫入FDCAN_TEST中的LBCK位,並將0寫入FDCAN_CCCR中的MON位。 FDCAN對待自己的發送的消息作為已接收的消息,如果它們通過Rx FIFO中的接受過濾,則將其存儲。為了獨立於外部信號,FDCAN忽略確認錯誤(隱性位在確認插槽中采樣)。 FDCAN實現內部TX和RX連接。
下圖顯示了外部環回模式下的FDCAN_TX和FDCAN_RX引腳的連接。
90.9.4 內部環回模式Internal loop-back mode
提供此模式用於硬件自檢。 用戶可以通過以下方式將FDCAN設置為內部環回模式:向FDCAN_TEST中的LBCK位寫入1,並向FDCAN_CCCR中的MON位寫入1。可以測試FDCAN,而不會影響連接到FDCAN_TX和FDCAN_RX的正在運行的CAN系統針腳。 FDCAN_RX引腳與FDCAN斷開連接,並且FDCAN_TX引腳保持隱性。
下圖顯示了內部環回模式下FDCAN_TX和FDCAN_RX引腳的連接:
90.9.5 收發延遲器補償
在采樣點,所有發送器都檢查先前發送的位是否被正確采樣。 這需要一種機制來檢查問題並檢測其他節點錯誤幀。 由於發射器看到了自己的發送位由收發器環路延遲而延遲,此延遲為TSEG1設置了下限,如圖所示。下圖(采樣點之前的時間段),這也是數據比特率的上限。 這是引入收發器延遲補償機制(TDC)的原因。
為了在檢查誤碼時補償此環路延遲,定義了一個輔助采樣點(SSP)。而不是在采樣點完成,而是在SSP中檢查傳輸的位。 該檢查的結果是直到達下一個采樣點為止。
為數據階段中發送的每個位生成一個SSP。 收發器不對稱和總線振鈴必須考慮SSP位置,但是沒有時鍾容限,因為收發器會監視自己的位置位流。
通過將1寫入FDCAN_DBTP中的TDC位來啟用收發器延遲補償。 測量在數據階段開始之前(在信號的下降沿之前)在每個發送的FDCAN幀內開始FDF逐位解析。 當在示波器的“接收”輸入引腳FDCAN_RX看到該邊沿時,測量將停止。 此測量的分辨率為1 mtq(最小時間量)
下圖顯示了環路延遲的測量:
注1:在仲裁階段,始終禁用延遲補償。SSP位置定義為從FDCAN_TX引腳到FDCAN_RX引腳測得的延遲之和,加上通過FDCAN_TDCR中的TDCO [6:0]字段配置的發送器延遲補償偏移。
注2:發送器延遲補償偏移量用於調整SSP在接收位內部的位置。存儲已發送位的值,直到達到其SSP,然后將其與實際接收到的位進行比較,如下圖所示,該值表示發送的比特序列A到K和接收的比特序列AR到KR,以及從SSPA到SSPK的一系列SSP。 通過比較SSBR來檢查接收到的比特BR與延遲位B1。 SSPB的位置在發送的比特B開始之后的特定時間。特定時間是測得的收發器延遲與配置的SSP偏移之和。
根據博世(Bosch)文檔確定,必須考慮以下邊界條件FDCAN中實現的發射機延遲補償:
----從FDCAN_Tx到FDCAN_Rx測得的延遲與已組態的發送器延遲之和在數據階段,補償偏移量必須小於六位時間。
----從FDCAN_Tx到FDCAN_Rx測得的延遲與已組態的發送器延遲之和補償偏移不得超過127 mtq。
注3:如果總和超過127 mtq,則最大值(127 mtq)用於發射機延遲補償。數據階段在CRC分隔符的采樣點結束,該采樣點停止檢查SSP處的接收位。本文檔的下一部分將說明時鍾校准單元,並對其功能和操作進行說明。
90.10 CAN FD時鍾校准
FDCAN支持時鍾校准單元(CCU)功能。 該功能允許用戶校准FDCAN,FDCAN發送器(主機)接收器(設備)。 例如,當FDCAN設備與主機的最新比特率。此功能允許用戶在總線中添加新實例,並且比特率的存在是未知的。 也是在FDCAN接收器沒有精確石英的情況下很有用(可能導致准時錯誤)。
90.10.1 CCU介紹
時鍾校准單元是通過FDCAN_CCU_CCFG寄存器初始化的,只有當兩個FDCAN_CCCR中的CCE和INIT位設置為1。僅當FDCAN在CAN 2.0模式下運行時,才可以使用CCU。當FDCAN_CCU_CCFG中的BCC = 1時,時鍾校准被繞過。 下圖顯示了旁路操作。
CCU操作條件:僅當FDCAN比特率在125 Kbit / s和1 Mbit / s之間時,CCU才能運行
CCU功能說明:通過適配時鍾分頻器,可以通過CAN消息對fdcan_tq_ck(時間量子時鍾)進行校准,它從fdcan_ker_ck時鍾生成CAN協議時間量tq。
校准狀態機:功能狀態機的校准如下圖所示。
90.10.2 基礎校准
測量了從隱性到顯性的兩個連續下降沿之間的最小距離。 這該措施假設兩個CAN位時間以PLL時鍾周期計。 每當新的時鍾分頻器通過FDCAN_CCU_CCFG中的CDIV [3:0]字段找到邊緣之間的較小距離來更新一次測量。 當CAN協議控制器檢測到有效的CAN消息時,便完成了校准。
90.10.3 精確校准
校准狀態機通過計算以下內容來測量CAN幀內較長位序列的長度:fdcan_ker_ck周期數。該位序列的長度可以通過在FDCAN_CCU_CCFG中CFL位配置為32位或64位。精度校准基於新的時鍾分頻器值,該值由較長位序列的測量。校准框通過FDCAN驗收過濾檢測。過濾器元素和Rx緩沖區必須為在FDCAN中配置以識別和存儲校准消息。如果fdcan_ker_clk校准是通過軟件完成的(請從CALS [1:0]字段中評估校准狀態FDCAN_CCU_CSTAT),必須將FDCAN設置為受限操作模式,直到校准完成Precision_Calibrated狀態(無幀,無錯誤或過載標志傳輸,無錯誤計數)。
注意:收到校准消息后,必須重新設置Rx緩沖區新數據標志以啟用發信號通知。校准消息的數據字段必須至少為1010二進制序列,以確保設備節點可以進入Basic_Calibrated狀態,並且主機節點消息得到確認。只能在由穩定的石英時鍾控制的主機節點發送的有效CAN幀上執行精確校准。精密校准必須在預定義的最大間隔內重復進行,並由校准看門狗監督。
90.10.4 校准看門狗
校准看門狗是一個遞減計數器,它以Not_Calibrated狀態開始,並監視接收到的信號消息。當處於Basic_Calibrated狀態時,校准監視程序隨每個收到的消息重新啟動。
注意:如果在校准看門狗遞減計數到零之前未收到任何消息,則FSM校准保持不變處於Not_Calibrated狀態。 計數器被重新加載,並且基本校准重新開始。進入Precision_Calibrated狀態時,將重新啟動校准看門狗。 在這種狀態下,校准看門狗監視收到的石英消息。
注意:如果FDCAN直到校准看門狗都沒有收到來自石英控制節點的消息,當計數降至零時,FSM校准將轉換回“ Basic_Calibrated”狀態。
90.10.5 校准例子
本示例介紹了一個用例,用於通過FDCAN主機(發送器)校准FDCAN設備(接收器)。 這以下流程圖說明了校准前通過FDCAN設備的步驟:
校准成功通過后,FDCAN設備准備好進行接收和發送帶有新FDCAN主機比特率的消息。
90.11 FDCAN相比標准bxCAN的提升
下表可幫助用戶簡化將STM32設備中的CAN 2.0協議升級到CAN-FD協議的過程。該表還指定了FDCAN的改進。與傳統的BxCAN(基本擴展CAN)相比,FDCAN具有許多優勢,包括更快的數據傳輸速度。速率和數據字節數的擴展,減少了幀開銷。 總線負載也可以減少。 傳輸和接收中消息數量的增加要求RAM存儲器的改進:
鑒於BxCAN的兼容性,BxCAN開發人員可以輕松地遷移到FDCAN,因為FDCAN可以無需對整個系統設計進行修訂即可實施。 FDCAN包含所有BxCAN功能,並滿足新應用程序的要求。
90.12 總結
本章節的知識點比較多,如果要理解透徹需要反復多讀幾遍,然后再看看英文原版。