0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

YTM32的LIN通信協(xié)議引擎LinFlexD外設模塊詳解

冬至子 ? 來源:安德魯?shù)脑O計筆記本 ? 作者:安德魯蘇 ? 2023-10-08 11:15 ? 次閱讀

LINFlexD外設簡介

YTM32微控制器的LINFlexD外設模塊,實現(xiàn)了LIN協(xié)議控制器的功能,可以支持LIN總線協(xié)議的主機和從機功能。如圖x所示。

image.png

圖x LINFlexD在LIN總線系統(tǒng)中的位置

LINFlexD 可以實現(xiàn)使用較少 CPU 介入的情況下,高效管理大量的 LIN 通信幀:

  • 在主機 Master 模式下,當軟件觸發(fā)了通信過程(發(fā)送幀頭),LINFlexD 硬件可以自行繼續(xù)發(fā)送或者捕獲數(shù)據(jù)流(應答數(shù)據(jù)),直至軟件重新啟動下一個通信過程(主機啟動),或者收到一個校驗和(接收模式)。
  • 在從機 Slave 模式下,LINFlexD 中設計了一組幀頭過濾器(ID Filter),可以配置由硬件自動匹配從總線上捕獲到的幀頭,僅當識別到本機預設處理的幀頭,才啟動數(shù)據(jù)通信過程(從機任務)。
  • LINFlexD 內(nèi)部還集成了一個8字節(jié)的緩沖區(qū),用于存放硬件自動發(fā)送或者接收的數(shù)據(jù)段內(nèi)容。
  • LINFlexD 硬件外設支持LIN v1.3、v2.0、v2.1、v2.2協(xié)議。可以在配置幀頭信息LINFlexD_BIDR[CCS]寄存器位中指定將要發(fā)送或者接收的幀使用擴展性校驗和還是經(jīng)典款校驗和。

LINFlexD 還支持 UART 模式,用于實現(xiàn)常規(guī)的 UART 通信。本文主要面向 LIN 通信引擎介紹,關于 UART 介紹,可見后續(xù)文章。

LINFlexD工作機制

初始化

手冊中對 LINFlexD 的工作模式劃分為:初始化模式(Initialization)、常規(guī)工作模式(Normal)和休眠模式(Sleep)。在硬件復位后,LINFlexD 處于休眠模式以節(jié)約用電。若要配置 LINFlexD 開始工作,需要先通過軟件配置,切換至初始化模式,在初始化模式下進行一些專屬的配置后,再切換至常規(guī)工作模式,才能順利啟動 LINFlexD 外設。這個初始化模式,相當于為配置 LINFlexD 外設設計了一個同步鎖,或者說關鍵區(qū),使得在初始化階段配置 LINFlexD 外設的各項功能時都不會立刻生效,以避免產(chǎn)生不確定的不安全狀態(tài),最后退出初始化模式,硬件同步一并打開所有的配置功能,穩(wěn)當。

  1. 初始化模式(Initializaiton,INIT)

軟件配置寄存器LINFlexD_LINCR1[INIT]=1,切換至初始化模式。當然,還可以通過配置LINFlexD_LINCR1[INIT]=0,退出初始化模式(至Normal模式?)。

進入初始化模式后,LINFlexD 引擎同 LIN 總線的傳輸將全部停掉(木頭人不許動),并且推送總線上位高電平(隱形信號)。如果在某個總線傳輸?shù)倪^程中進入初始化模式,則該傳輸將被打斷并退出。所以說,在切入初始化狀態(tài)之前,軟件一定要先查一下 LINFlexD 的狀態(tài)標志位,確保不會打斷正在進行的傳輸,再進入初始化模式。

在初始化模式下,可以對 LINFlexD 外設進行初始化配置:

  • 配置通信波特率
  • 啟用 LINFlexD 模式(停用UART模式)
  • 選擇主機模式或者從機模式
  • 配置校驗和控制位
  • 若是從機模式,還需要預先填寫好可以捕獲的ID的列表
  1. 常規(guī)工作模式(Normal Mode,NM)

在初始化模式中,配置寄存器LINFlexD_LINCR1[INIT]=0,切換至常規(guī)工作模式。

在常規(guī)工作模式下,LINFlexD 可以執(zhí)行正常的收發(fā)通信。

  1. 休眠模式(Sleep Mode,SM)

配置軟件寄存器LINFlexD_LINCR1[SLEEP]=1,切換至休眠模式。當然,也可以通過配置LINFlexD_LINCR1[SLEEP]=0,退出休眠模式(至Normal模式)。

進入休眠模式后,LINFlexD引擎就暫停工作,等待喚醒事件到來后,自動切回正常模式響應外部的通信請求。

如果軟件在 LIN 總線上檢測到一個 150us 的喚醒脈沖,可以請求 LINFlexD 從休眠模式喚醒。

  1. 回環(huán)工作模式(Loop Back Mode)

通過配置寄存器LINFlexD_LINCR1[LPKM]=1啟用回環(huán)模式?;丨h(huán)工作模式可用于自測試通信協(xié)議,當啟動回環(huán)模式后,芯片內(nèi)部的Tx和Rx引腳相連,通過Tx發(fā)送的信號會直接被反饋會接收通道(忽略Rx引腳的輸入)。如圖x所示。

image.png

圖x LINFlexD的回環(huán)模式

主機模式

通過配置寄存器LINFlexD_LINCR1[MME]=1,設定本設備為主機模式工作。

  1. 發(fā)送幀頭

根據(jù)LIN協(xié)議的描述,LIN總線的上通信,都是由主機(具體是主機節(jié)點的主機任務)發(fā)送幀頭開始的。當發(fā)送幀頭時,由軟件先寫入LINFlexD_BIDR寄存器中的字段,包括:ID(6位的幀ID,硬件自動補完校驗位)、DFL(數(shù)據(jù)段長度)、DIR(幀通信的方向)及CCS(啟用經(jīng)典校驗的控制位,后續(xù)硬件自動生成校驗字節(jié))。然后,設置寄存器LINFlexD_LINCR2[HTRQ]=1,請求發(fā)送幀頭。在啟動發(fā)送幀頭之后,在發(fā)送完成本幀之前,不要人為修改LINFlexD_BIDR寄存器中的內(nèi)容,LINFlexD 從總線上捕獲到已經(jīng)發(fā)送幀的ID會被自動復制到LINFlexD_BIDR寄存器中。

  1. 發(fā)送數(shù)據(jù)

當主機節(jié)點執(zhí)行發(fā)布任務時(發(fā)送數(shù)據(jù)到總線),主機節(jié)點上運行的從任務(主機節(jié)點上的主任務僅發(fā)送幀頭)會繼續(xù)發(fā)送數(shù)據(jù)部分。因此,軟件需要在發(fā)起發(fā)送幀頭的請求之前,就將需要發(fā)送的數(shù)據(jù)準備好,將數(shù)據(jù)存放至消息緩沖區(qū)LINFlexD_DATA[]中,同時,需要在LINFlexD_BIDR[DFL]寄存器中指定將要發(fā)送字節(jié)數(shù)據(jù)的數(shù)量,硬件根據(jù)軟件在LINFlex_BIDR[CCS]控制位的配置(這個數(shù)據(jù)位可能是總線上捕獲到的幀頭中的信息),自動計算經(jīng)典校驗和或是增強校驗和。

當應答的數(shù)據(jù)發(fā)送成功后,會置位硬件標志位LINFlexD_LINSR[DTF],但如果發(fā)送過程中出現(xiàn)錯誤,標志位LINFlexD_LINSR[DTF]不會置位,LINFlexD_LINSR寄存器的其它對應標志位會置位。

應答數(shù)據(jù)的方向(發(fā)送?或是接收)由寄存器LINFlexD_BIDR[DIR]設定,但哪怕是發(fā)送過程,將數(shù)據(jù)發(fā)送上總線后,也會監(jiān)聽總線,將總線上的數(shù)據(jù)捕獲下來并存入數(shù)據(jù)緩沖區(qū)中。

  1. 接收數(shù)據(jù)

當主機節(jié)點從從機節(jié)點讀取數(shù)據(jù)時,應先發(fā)出一個幀頭(約定為讀操作的ID)。從機節(jié)點捕獲到幀頭之后,會向總線上發(fā)送應答數(shù)據(jù),此時主機節(jié)點(的從機任務)會從總線上捕獲數(shù)據(jù),并將數(shù)據(jù)內(nèi)容存放至數(shù)據(jù)緩沖區(qū)中,寄存器LINFlexD_LINSR寄存器中對應的標志位也會置位。

當應答的數(shù)據(jù)接收成功后,會置位硬件標志位LINFlexD_LINSR[DRF],但如果發(fā)送過程中出現(xiàn)錯誤,標志位LINFlexD_LINSR[DRF]不會置位,LINFlexD_LINSR寄存器的其它對應標志位會置位。

  1. 拋棄數(shù)據(jù)

若用戶需要拋棄發(fā)送幀頭之后捕獲到的應答數(shù)據(jù),可預先設置寄存器LINFlexD_LINCR2[DDRQ]=1。這對應的是LIN通信中,實現(xiàn)“不應答”的操作。

注意:哪怕是在主機模式中,也是分為主機任務和從機任務兩部分,主機任務僅負責發(fā)送幀頭,主機模式中的從機任務和下文描述的從機模式一致,都是通過 LINFlexD_BIDR寄存器中捕獲的幀頭信息同自己的ID Filter進行匹配,從而啟動對應的發(fā)送或接收數(shù)據(jù)的過程。

從機模式

通過配置寄存器LINFlexD_LINCR1[MME]=0,設定本設備為從機模式工作。

  1. 發(fā)送應答數(shù)據(jù)

當從LIN總線上捕獲到主機任務發(fā)送的幀頭后,根據(jù)對ID的定義,若要求本節(jié)點提供應答數(shù)據(jù),則硬件標志位LINFlexD_LINSR[HRF]寄存器會置位,并產(chǎn)生一個接收中斷。此時,軟件需要盡快填寫將要發(fā)送的數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)中:

  • LINFlexD_BIDR寄存器,判定接收到幀頭的ID
  • LINFlexD_DATA寄存器中填入將要發(fā)送的數(shù)據(jù)
  • LINFlexD_BIDR寄存器,寫入CCS(校驗和計算方式)、DIR(數(shù)據(jù)方向),以及DFL(數(shù)據(jù)長度)寄存器。

設置寄存器LINFlexD_LINCR[DTRQ]請求發(fā)送數(shù)據(jù)后,軟件才能清零LINFlexD_LINSR[HRF]標志位。為了確保LINFlexD_LINCR[DTRQ]寄存器控制位能夠起作用,需要先保持LINFlexD_LINSR[HRF]置位,這是為了防止LINFlexD_LINCR[DTRQ]不會被意外地被置位,而必須跟在發(fā)送一個幀頭的操作之后進行(增加了一個操作約束條件)。在接收數(shù)據(jù)過程中,LINFlexD_LINSR[RXBUSY]寄存器保持置位,此時LINFlexD_BIDR[DIR]LINFlexD_LINCR[DTRQ]位不能被軟件置位。

當需要使用ID過濾器時(Identifier Filter),可配置LINFlexD_IFER寄存器啟用過濾器功能。若命中其中一個過濾器時,硬件會產(chǎn)生一個發(fā)送中斷,此時,硬件可從寄存器LINFlexD_IFMI中保存的指針從RAM從自動搬運數(shù)據(jù)內(nèi)容到LINFlexD_DATA寄存器緩沖區(qū)中。

使用ID過濾器可以減少軟件從LINFlexD_BIDR寄存器中讀ID、判定、配置數(shù)據(jù)長度和校驗和類型的過程。

如果 LINFlexD 外設模塊中需要使用的過濾器不夠應用中使用,還可以通過設置過濾器掩碼的方式,模糊匹配ID,以實現(xiàn)匹配更多ID的效果。

同主機模式相同,本機發(fā)送的數(shù)據(jù),也會被捕獲至本機的接收緩沖區(qū)中。

  1. 接收應答數(shù)據(jù)

當收到主機任務發(fā)送的幀頭后,若要求本節(jié)點接收應答數(shù)據(jù),則硬件標志位LINFlexD_LINSR[HRF]寄存器會置位,并產(chǎn)生一個接收中斷。此時,軟件需要盡快讀BIDR寄存器,從中讀幀ID進行匹配,并寫入數(shù)據(jù)段長度(在收到第一個數(shù)據(jù)字節(jié)的停止位之前)。當收到校驗和之后,LINFlexD_LINSR[RMB]寄存器位會置位,并會產(chǎn)生一個接收中斷,此時,軟件可從LINFlexD_DATA寄存器緩沖區(qū)中讀數(shù),讀數(shù)完成后,需要軟件清零LINFlex_LINSR[RMB]寄存器位,以釋放接收數(shù)據(jù)緩沖區(qū)。

當至少一個配置為接收的ID過濾器被激活命中,將在收到校驗和之后,產(chǎn)生一個接收中斷。在接收到ID的時候不會產(chǎn)生中斷。

如果使用軟件方式過濾ID,當HRF標志位置位時,若要拋棄數(shù)據(jù)(不應答),可以通過寫LINFlexD_LINCR[DDRQ]寄存器實現(xiàn)。若使用軟件過濾機制,軟件需要在接收到校驗和之前設定校驗的類型(配置LINFlexD_BIDR[CCS])。

錯誤狀態(tài)標志位

LINFlexD 硬件集成了協(xié)議棧的業(yè)務邏輯,但由于總線上是多設備仲裁運行的環(huán)境,有時硬件總線的行為不是完全按照預期的情形運作,時不時就會報錯。LINFlexD 對處理不了的情況設計了對應的監(jiān)測機制,對于硬件無法處理的情況,會盡量及時地報錯,上報給軟件,交由應用邏輯裁決。

LINFlexD_LINESR寄存器中包含了 LINFlexD 外設能夠檢測到的所有錯誤標志位,分別對應檢測各自的錯誤機制。LINFlexD_LINESR寄存器的位定義,如圖x所示。

image.png

圖x LINFlexD_LINESR寄存器的位定義

  1. 總線拉低超時錯誤(Stuck at Zero Timeout Error,SZF)

發(fā)生Stuck-at-zero超時錯誤。大體上是描述LIN總線被意外地長時間拉低(顯式電平),后續(xù)無法傳輸數(shù)據(jù)的狀態(tài)。詳見下文超時錯誤機制。

  1. 輸出比較標志(Output Compare Flag,OCF)

輸出比較事件是LINFlexD在管理超時機制中產(chǎn)生的一個事件。

  • 在主機模式下,當LINFlexD_LINTCSR[CNT]中的計數(shù)值同LINFlexD_LINOCR[OC2]寄存器的設定值相等時,起OCF標志位。
  • 在從機模式下,當LINFlexD_LINTCSR[CNT]中的計數(shù)值同LINFlexD_LINOCR[OC2]LINFlexD_LINOCR[OC1]寄存器的設定值相等時,起OCF標志位。
  • 當在LINFlexD_LINTCSR[MODE] = 0(LIN模式)并且LINFlexD_LINTCSR[IOT] = 1, 若OCF標志位被置位,則LINFlexD進入Idle狀態(tài)。
  • 當在LINFlexD_LINTCSR[MODE] = 0(LIN模式), OCF由處于初始化模式下的硬件外設自動清零。
  • 當在LINFlexD_LINTCSR[MODE] = 1(輸出比較模式), OCF單純表示輸出比較的狀態(tài),同LIN的通信狀態(tài)無關。
  1. 位錯誤(Bit Error,BEF)

位錯誤可能發(fā)生在發(fā)送過程中(發(fā)送幀頭和發(fā)送應答數(shù)據(jù)),當從總線上讀回的值同發(fā)送的值不一致時,會出現(xiàn)位錯誤。檢測每個數(shù)據(jù)位的意義在于,確保收發(fā)器的延遲時間小于一個可以接受的容限(位時間的長度再減去6個功能時鐘周期),例如:

  • 1個位時間 t_bittime = 20k bps = 50us
  • 6個功能時鐘周期@80MHz = 75ns
  • 則允許的收發(fā)器延遲時間 = t_bittime - 6 * t_ipg_baud_clk = 49.925us

這個49.925us將用于選型合適的LIN收發(fā)器。

在發(fā)送的間隔段中不檢測位錯誤。

如果出現(xiàn)位錯誤的情況,若此時已經(jīng)配置了LINFlexD_LINCR2[IOBE]=1(Idle on Identifier Parity Error),LINFlexD的接收狀態(tài)機會立刻退出接收幀頭的狀態(tài)變成Idle。若是LINFlexD_LINCR2[IOBE]=0,發(fā)送過程將繼續(xù),不管位錯誤。如果配置了LINFlexD_LINIER[BEIE]=1,則此時會產(chǎn)生中斷。一種極端的情況,如果不配置退出、不配置中斷,哪怕出現(xiàn)了位錯誤,仍可堅持完成發(fā)送過程。

  1. 校驗和錯誤(Checksum Error,CEF)

當接收機收到數(shù)據(jù)幀及校驗和字節(jié)后,會自動計算校驗和,當計算結(jié)果同數(shù)據(jù)內(nèi)容不一致時,會拋棄收到的數(shù)據(jù)包,同時會起一個CEF標志位。如果預先配置寄存器LINFlexD_LINIER[CEIE]=1,則對應還可以產(chǎn)生一個中斷。

如果是LINFlexD發(fā)出的數(shù)據(jù)包,因LINFlexD在發(fā)送過程中會自動計算校驗和,所以若再用 LINFlexD 收到數(shù)據(jù)包仍會產(chǎn)生校驗和錯誤,那就要查看傳輸線路是否受到較大的干擾。如果發(fā)送方的校驗和是人工計算的,那也要再確認軟件計算校驗和的方法是否正確。

  1. 幀頭錯誤(Header Error)

從機任務在接收幀頭過程中發(fā)現(xiàn)的錯誤,都算是幀頭錯誤。這些錯誤包括

(1)幀間隔段分隔符錯誤(Break Delimiter Error, SDEF)

這個分隔符的長度應至少為1位的時間,否則時間太短,接收方會丟棄當前幀頭的同步段,進而丟棄整個幀。如果LINFlexD_LINIER[HEIE]=1,則此時會觸發(fā)一個中斷。

(2)同步段錯誤(Sync Field Error,SFEF)

同步段錯誤的情況在是否開啟自動同步的配置(LINCR1[LASE]=1)時是不同的。

  • 當啟用自動同步機制時,SFEF標志位標識兩種情況:超出LIN規(guī)范(14%偏差)之外的同步段偏差錯誤,或者測量同步段已經(jīng)溢出,分頻器打滿也除不下來。SFEF不會檢測同步段值的錯誤(不是0x55)。
  • 當停用自動同步機制時,同步字段被當做一個普通的字節(jié)被接收,此時會判定改值是否為0x55,如果不是這個值,則會報錯,后續(xù)的整個LIN幀都會被拋棄。

(3)ID校驗錯誤(Identifier Parity Error,IDPEF)

PID段中包含6個比特的ID和2個比特的校驗碼,IDPEF檢測的就是這6個比特的ID和2個比特校驗碼的一致性。在從機任務中,當LINFlexD收到幀頭的PID段后,將6比特的ID值送至BIDR寄存器后,會由硬件自動計算核驗校驗碼。如果出現(xiàn)不一致的情況,若此時已經(jīng)配置了LINFlexD_LINCR2[IOPE]=1(Idle on Identifier Parity Error),LINFlexD的接收狀態(tài)機會立刻退出接收幀頭的狀態(tài)變成Idle。

  1. 幀錯誤(Frame Error,F(xiàn)EF)

幀錯誤標識的是在當前接收字節(jié)(LIN幀的同步段、ID段、數(shù)據(jù)段、校驗和段)的停止位檢測到一個顯性信號(本應為隱形信號,拉高電平),此時LINFlexD會拋棄當前接收到的幀,然后返回到Idle狀態(tài)。如果預先配置了LINFlexD_LINIER[FEIE]=1,則會產(chǎn)生一個中斷。

當出現(xiàn)幀錯誤時,導致錯誤的字節(jié)數(shù)據(jù)仍會被送入數(shù)據(jù)緩沖區(qū)(畢竟已經(jīng)送進去了),但LINFlexD_LINSR[DRF]標志位(數(shù)據(jù)接收完成標志位)不會置位。

  1. 緩沖區(qū)溢出(Buffer Overrun,BOF)

當收到一個新的數(shù)據(jù)時,若標志位LINFlexD_LINSR[RMB]=1尚為清零(數(shù)據(jù)緩沖區(qū)滿,軟件可讀),則判定為緩沖區(qū)溢出,報錯。此時還需通過寄存器LINFlexD_LINCR1[RBLM]的配置值,確定如何處理新數(shù)據(jù):

  • LINFlexD_LINCR1[RBLM]=0,則之前未被都走的數(shù)據(jù)包將會被新的數(shù)據(jù)包覆蓋,舊的數(shù)據(jù)包將被丟失。
  • LINFlexD_LINCR1[RBLM]=1,則之前未被都走的數(shù)據(jù)包將會被保持,新的數(shù)據(jù)包將被丟失。在從機模式下,如果再未讀完數(shù)的情況下來了新的LIN幀,不僅僅是數(shù)據(jù),連帶幀ID也會被一同拋棄。
  1. 噪聲標志(Noise Flag,NF)

接收器檢測到噪聲時,起本標志位。關于噪聲,是在檢測開始信號和間隔符信號時,進行連續(xù)3次隔點采樣,未能達到判決條件時,即認定為總線上有噪聲。

超時錯誤(Timeout Error)

當主機發(fā)送了幀頭后,如果在指定的時間段內(nèi)未收到應答數(shù)據(jù),則會產(chǎn)生超時錯誤。LINFlexD外設內(nèi)部設計了一個超時定時器(Timerout Counter),專門用于檢測同超時相關的檢測和響應事件。

image.png

圖x LINFlexD的超時報錯機制

  1. 應答超時機制
  • 主機模式:每當發(fā)送或者接收到ID段(幀頭的最后一個字段)后,確切地說,是當DFL被硬件寫入后,LINFlexD會自動將寄存器LINFlexD_LINOCR[OC2]載入到LINFlex_LINTOCR[CNT]寄存器,并啟動內(nèi)部的定時器開始倒計數(shù),若在計數(shù)器計數(shù)清零之前未完成接收數(shù)據(jù),則產(chǎn)生超時事件。這相當于是個看門狗。
  • 從機模式:若使用ID過濾器過濾接收數(shù)據(jù)幀,同主機模式類似,當匹配到消息ID,硬件寫入DFL寄存器時,載入LINFlexD_LINOCR[OC2]寄存器的值到定時器,開始計數(shù)。若未使用ID過濾器,則在收到數(shù)據(jù)幀并由軟件進行識別后,人工寫入DFL寄存器時,硬件載入LINFlexD_LINOCR[OC2]寄存器的值到定時器,啟動定時器。
  1. 幀頭超時機制
  • 主機模式:由于幀頭是由LINFlexD硬件自動產(chǎn)生的,正常情況下不會出現(xiàn)超時。
  • 從機模式:在收到幀間隔符后,硬件從寄存器LINFlexD_LINOCR[OC1]LINFlexD_TOCR[HTO],啟動定時器。

注意,這里的定時器也可以用來檢測其他的超時事件,但需要配置LINFlexD_LINTCSR[MODE]=0,然后軟件向寄存器LINFlexD_LINTOCR中寫入輸出比較值。

  1. 總線拉低超時錯誤(Stuck at Zero Timeout Error)

如果顯性信號在總線上保持的時間超過了100個比特的時間,就會起標志位LINFlexD_LINESR[SZF]。人工清零標志位后,如果顯性信號未消除并繼續(xù),那么接下來只要連續(xù)保持87個比特的時間,就會再次激活標志位LINFlexD_LINESR[SZF]。

ID過濾機制

在LIN協(xié)議中,消息的ID號并不是對應節(jié)點的地址,而是標識消息中攜帶的內(nèi)容(命令,或者消息類型)。發(fā)送器將消息廣播到LIN總線,所有的接收機都能收到,接收機通過識別消息的ID,接收機們決定是繼續(xù)收數(shù)據(jù),或是發(fā)送數(shù)據(jù)應答(根據(jù)消息ID的含義做出反應),如果接收機不識別消息(不做處理),就會拋棄它。

為了實現(xiàn)這樣的機制,LINFlexD外設設計了可配置的ID過濾器,以簡化原本需要軟件去匹配消息ID的工作,節(jié)約了CPU資源。LINFlexD中集成了16個過濾器,只有在初始化模式下才能配置他們,可以通過將LINFlexD_IFER[FACT]寄存器中的對應位置位,激活相應的過濾器,然后在每個過濾器專屬的LINFlexD_IFCRn寄存器中配置各自過濾器的參數(shù)。

每個ID過濾器有兩種可選的工作模式(通過寄存器IFMR[IFM]):

  • ID列表模式(Identifier List Mode)。若配置LINFlexD_IFMR[IFM]=0,則接收到LIN幀頭的消息ID必須按位同IFCR_n寄存器中的完全相同才能滿足匹配條件。
  • ID掩碼模式(Identifier Mask Mode)。若配置LINFlexD_IFMR[IFM]=1,則IFCR_2n寄存器和IFCR_2n+1寄存器形成一個掩碼模式,IFCR_2n中的ID是一個模板ID,IFCR_2n+1中的ID是一個掩碼,當收到LIN幀頭的消息ID后,先同掩碼做個與運算,過濾掉不關心的位,然后再同模板ID進行匹配。在ID掩碼模式下,LINFlexD_IFER[FACT]寄存器中是否激活IFCR_2n+1,已經(jīng)不影響了,此時IFCR_2n+1總是被激活的。當需要本接收機相應的消息ID多于硬件ID過濾器支持的數(shù)量時,就需要用ID掩碼模式擴展能識別ID的范圍了。

無論在何種過濾器模式下,一旦編號為m的過濾器被匹配到,則值m+1將被硬件寫入到IFMI寄存器中,而IFMI=0就表示沒有當前還發(fā)生任何匹配事件。此時,軟件可以通過讀IFMI寄存器的值,識別是哪個過濾器被匹配到,進而從中查看識別到的消息ID。當完成一次匹配事件,LINFlexD硬件都會將匹配到的DFL、CCS和DIR寄存器的值,從IFCR寄存器復制到BIDR寄存器中(存放當前的幀頭信息),此時至通信幀傳輸完成之前,BIDR寄存器都是只讀,不能被軟件寫入。此時LINFlexD_BIDR[DIR]指示了應答數(shù)據(jù)的傳輸方向(相對主機):

  • LINFlexD_BIDR[DIR]=1,表示數(shù)據(jù)方向為發(fā)送,可以產(chǎn)生一個發(fā)送中斷(LINFlexD_LINIER[HRIE]=1),此時軟件可以從IFMI寄存器中讀ID過濾器的索引編號,然后向DATA緩沖區(qū)中填充將要發(fā)送的數(shù)據(jù),然后再配置LINFlexD_LINCR2[DTRG]=1,啟動傳輸。
  • LINFlexD_BIDR[DIR]=0,表示數(shù)據(jù)方向為接收,在接收數(shù)據(jù)完畢后,包括校驗和字節(jié),并驗證校驗和無誤后,可以產(chǎn)生一個接收中斷(LINFlexD_LINIER[DRIE]=1),此時,軟件可以從DATA緩沖區(qū)中讀出接收到的數(shù)據(jù)。

如果沒有匹配到任何過濾器(通過IFMI=0判定):

  • 此時若已經(jīng)配置了LINFlexD_LINCR1[BF]=1,則仍可產(chǎn)生一個接收中斷。此時應由軟件配置BIDR寄存器并啟動傳輸(填充DATA數(shù)據(jù)緩沖區(qū)再配置LINFlexD_LINCR2[DTRQ]),或放棄接收(配置LINFlexD_LINCR2[DDRQ])。
  • 若已經(jīng)配置了LINFlexD_LINCR1[BF]=0,則接收機直接拋棄已經(jīng)收到的幀頭(包含消息ID),轉(zhuǎn)入Idle狀態(tài),等待接收下一個幀間隔段(開始信號)。

注意,如果接收的消息ID同時匹配到了兩個過濾器,一個處于列表模式,另一個處于掩碼模式,則優(yōu)先匹配到處于列表模式的過濾器。如果同時匹配到兩個位于掩碼模式的過濾器,則優(yōu)先匹配到編號較小的過濾器。如果同時匹配到兩個處于列表模式的過濾器,好吧,能將同一個ID寫到兩個列表模式下的過濾器,一定是寫錯了,但此時也會優(yōu)先匹配到編號較小的過濾器。

接收器檢測幀間隔段和幀間隔段分隔符

LINFlexD內(nèi)部檢測串行信號模式的方法非常有趣。接收器內(nèi)部設計了一個10比特的移位采樣寄存器,捕獲收到的串行信號,LSB送入。移位寄存器中的比特位在平時是全0,當其中的值變?yōu)?code>1110,然后在之后進行隔點采樣(每兩個連續(xù)的點取一個樣本),連續(xù)3個樣本中,有2個為0,即可判定是一個開始信號(幀間隔符)。類似的,為了檢測幀間隔符分隔符,在繼續(xù)檢測到0001的模式,然后再之后進行隔點采樣,連續(xù)3個樣本中,有2個為1,即可判定是一個分隔符。如果只能檢測到兩個有效的樣本,噪聲標志位(Noise Flag)將會被置位。

image.png

圖x 使用移位器檢測開始信號和分隔符模式

關于檢測模式的更細節(jié)的機制,可繼續(xù)參見手冊詳述,因同用戶使用關聯(lián)不大,此處不再贅述。

產(chǎn)生波特率

配置LIN總線的(發(fā)送和接收)波特率,主要設計兩個寄存器:LINFlexD_LINIBRRLINFlexD_LINFBRR,分別對應分頻因子的整數(shù)部分和小數(shù)部分。

  • LINFlexD_UARTCR[ROSE]=1(only for UART mode),baudrate = f_clksrc / ( OSR x LDIV )
  • LINFlexD_UARTCR[ROSE]=0(for LIN and UART mode),baudrate = f_clksrc / (16 x LDIV)

其中,f_clksrc是 LINFlexD 的功能時鐘,在 SCU 外設模塊中分配時鐘源。LDIV是一個無符號的定點數(shù),整數(shù)部分存放在20-bit的LINFlexD_LINIBRR寄存器中,小數(shù)部分存放在4-bit的LINFlexD_LINFBRR寄存器中。

當停用過采樣功能,就不再使用LINFlexD_LINFBRR寄存器(可清零),此時LDIV僅使用整數(shù)部分,配置至LINFlexD_LINIBRR寄存器。

例如:

  • When ROSE = 0 (for LIN and UART mode): LDIV = 468.75 d, ipg_baud_clk = 36 MHz, LINIBRR = 468 d, LINFBRR = 12, Baud rate = 36 MHz / (16 × 468.75) = 4.8 K bit/s
  • When ROSE = 1 (only for UART mode): LDIV = 5 d, ipg_baud_clk = 80 MHz, LINIBRR = 5 d, OSR = 4, Baud rate = LIN_CLK / (OSR × LDIV) = 80 MHz / (4 × 5) = 4 M bit/s

自動同步波特率機制

若要通過測量LIN通信幀的同步段,可以先隨便寫兩個波特率發(fā)生寄存器LINFlexD_LINIBRRLINFlexD_LINFBRR,然后設定寄存器LINFlexD_LINCR1[LASE]=1啟用自動同步機制。

當啟用自動同步波特率機制后,在每個通信幀的同步間隔段間隔符之后,將會使用波特率時鐘源,在LINFlexD_RX引腳上采樣連續(xù)5個下降沿的時間???

喚醒管理機制

處于休眠中的LIN總線可以由其中任何節(jié)點發(fā)起喚醒請求。節(jié)點將LIN總線信號強制拉低(保持顯性信號)保持 250us 至 5ms,每個從機節(jié)點將會檢測到喚醒請求(一個長于 150us 的低電平脈沖),并在釋放顯性信號的上升沿開始 100ms 以內(nèi)準備好監(jiān)聽來自總線的命令。主機在檢測到總線上的喚醒請求后也會醒過來,待從機準備好之后,主機將發(fā)送幀頭以探查喚醒的源頭和原因。如果在收到喚醒請求后的 150ms 內(nèi),主機沒來得及發(fā)送幀頭,則原本喚醒總線的從機節(jié)點可以試著再次發(fā)起一個新的喚醒請求。

使用LINFlexD產(chǎn)生一個喚醒請求,可以通過向 DATA0 寄存器寫一個喚醒字符(0x0)并設定寄存器位LINFlexD_LINCR2[WURQ]。當寫WURQ寄存器位時,DATA0中的數(shù)就已經(jīng)被送上總線了。

使用LINFlexD檢測LIN總線上的喚醒請求,可以有兩種方式:

  • 當AUTOWU=1,在休眠模式下,當檢測到一個下降沿,LINFlexD_LINCR1[SLEEP]寄存器位由硬件清零(退出休眠模式),LINFlexD_LINCR1[WUF]標志位置位,如果此時LINFlexD_LINIER[WUIE] =1,則可以產(chǎn)生一個中斷,此時 LINFlexD 處于常規(guī)工作模式并準備接收通信幀。
  • 當AUTOWU=0,當檢測到一個下降沿,LINFlexD_LINCR1[WUF]標志位置位,如果此時LINFlexD_LINIER[WUIE]=1,則可以產(chǎn)生一個中斷,此時需要由軟件決定是否要清零LINFlexD_LINCR1[SLEEP]寄存器位以返回常規(guī)工作模式。

image.png

圖x LIN的喚醒時序

軟件

YTMicro SDK中包含了LinFlexD的驅(qū)動程序,并提供了lin_master、lin_salve、lin_slave_filter等樣例工程。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7336

    瀏覽量

    150107
  • 通信協(xié)議

    關注

    28

    文章

    810

    瀏覽量

    40120
  • 寄存器
    +關注

    關注

    31

    文章

    5253

    瀏覽量

    119205
  • 接收器
    +關注

    關注

    14

    文章

    2441

    瀏覽量

    71528
  • DIR
    DIR
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7310
  • LIN通信
    +關注

    關注

    2

    文章

    8

    瀏覽量

    3756
收藏 人收藏

    評論

    相關推薦

    CAN總線通信協(xié)議的基礎知識

    本文將介紹CAN總線通信協(xié)議的基礎知識,目前的內(nèi)容僅為通用的協(xié)議部分,暫不涉及具體的外設模塊的用法。研究通信協(xié)議的具體內(nèi)容,主要是看建立
    的頭像 發(fā)表于 06-16 10:58 ?5858次閱讀
    CAN總線<b class='flag-5'>通信協(xié)議</b>的基礎知識

    汽車電子系統(tǒng)總線LIN通信協(xié)議簡介

    本地互聯(lián)網(wǎng)絡 LIN(Local Interconnect Network)總線協(xié)議,是基于UART/SCI(Universal Asynchronous Receiver-Transmitter/SerialCommunication Interface通用異步收發(fā)器/
    發(fā)表于 09-22 14:22 ?4048次閱讀
    汽車電子系統(tǒng)總線<b class='flag-5'>LIN</b><b class='flag-5'>通信協(xié)議</b>簡介

    YTM32的模數(shù)轉(zhuǎn)換器ADC外設模塊詳解

    YTM32的ADC轉(zhuǎn)換器外設最多可以集成32個輸入通道,最高12b轉(zhuǎn)換精度,最快可以支持2M Sps的12b采樣。
    的頭像 發(fā)表于 10-09 16:35 ?1616次閱讀
    <b class='flag-5'>YTM32</b>的模數(shù)轉(zhuǎn)換器ADC<b class='flag-5'>外設</b><b class='flag-5'>模塊</b><b class='flag-5'>詳解</b>

    YTM32的增強型定時器eTMR外設模塊簡介

    YTM32微控制器上集成的eTMR模塊,是一個定時器外設,下轄多至8個通道
    的頭像 發(fā)表于 10-31 14:18 ?954次閱讀
    <b class='flag-5'>YTM32</b>的增強型定時器eTMR<b class='flag-5'>外設</b><b class='flag-5'>模塊</b>簡介

    汽車通信協(xié)議資料總結(jié)

    1.常見的汽車通信協(xié)議總結(jié)。包括can通信, 診斷協(xié)議uds . LIN通信 ,j1939, ISO14229, ISO15675,OBD
    發(fā)表于 09-06 20:39

    TCP通信協(xié)議-Labview上位機

    現(xiàn)在用單片機進行信息采集,通過GPRS模塊上傳到PC,用Labview做上位機,TCP通信協(xié)議,想請教一下,TCP通信協(xié)議和Modbus TCP通信協(xié)議有什么不同?
    發(fā)表于 12-10 08:58

    如何去開發(fā)一種基于Freescal單片機的LIN通信協(xié)議C語言

    間隔段上升沿觸發(fā)的處理函數(shù)設計?。。∫縫df文檔可以留言! 基于Freescal單片機的LIN通信協(xié)議C語言開發(fā)(五)
    發(fā)表于 11-22 07:33

    涂鴉模塊通信協(xié)議使用與移植

    通信協(xié)議使用2.1涂鴉模組協(xié)議移植2.2移植步驟三、涂鴉的軟件數(shù)據(jù)接口三、實現(xiàn)的功能1實時上傳溫濕度信息及光照信息系統(tǒng)OLED顯示溫濕度及光照四、硬件文件及代碼開源前言感謝涂鴉提供的模組和立創(chuàng)EDA提
    發(fā)表于 11-26 06:42

    IIC通信協(xié)議的相關資料推薦

    IIC通信協(xié)議詳解IIC的概述IIC分為軟件IIC和硬件IICIIC通信協(xié)議空閑狀態(tài)開始信號與停止信號開始信號程序:IIC的概述IIC:兩線式串行總線,它是由數(shù)據(jù)線SDA和時鐘線SCL構(gòu)成的串行總線
    發(fā)表于 01-20 07:06

    如何實現(xiàn)基礎通信協(xié)議的設計?

    常見的通信協(xié)議格式是什么?如何實現(xiàn)基礎通信協(xié)議的設計?
    發(fā)表于 02-14 07:35

    什么是串口通信?串口通信協(xié)議了解

    行傳輸?shù)汀?、串口通信協(xié)議在計算機科學里,大部分復雜的問題都可以通過分層來簡化。如芯片被分為內(nèi)核層和片上外設;STM32標準庫則是在寄存器與用戶代碼之間的軟件層。對于通訊協(xié)議,我們也以分層的方式來理解,最基本的是把它分為物理層和
    發(fā)表于 02-15 06:54

    Modbus通信協(xié)議詳解

    關于Modbus通信協(xié)議詳解和應用分析
    發(fā)表于 10-12 16:54 ?150次下載
    Modbus<b class='flag-5'>通信協(xié)議</b><b class='flag-5'>詳解</b>

    Modbus通信協(xié)議教程

    Modbus通信協(xié)議教程Modbus通信協(xié)議教程Modbus通信協(xié)議教程
    發(fā)表于 12-08 14:14 ?74次下載

    串行外設接口SPI通信協(xié)議的應用

    上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,如今越來越多的芯片集成了這種通信協(xié)議,比如AT91RM9200。
    發(fā)表于 01-09 14:58 ?1784次閱讀
    串行<b class='flag-5'>外設</b>接口SPI<b class='flag-5'>通信協(xié)議</b>的應用

    基于Freescal單片機的LIN通信協(xié)議C語言開發(fā)(五)

    間隔段上升沿觸發(fā)的處理函數(shù)設計?。。∫縫df文檔可以留言! 基于Freescal單片機的LIN通信協(xié)議C語言開發(fā)(五)??????
    發(fā)表于 11-13 19:06 ?18次下載
    基于Freescal單片機的<b class='flag-5'>LIN</b><b class='flag-5'>通信協(xié)議</b>C語言開發(fā)(五)