在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

冬至子 ? 來源:安德魯的設計筆記本 ? 作者:安德魯蘇 ? 2023-10-08 11:15 ? 次閱讀

LINFlexD外設簡介

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

image.png

圖x LINFlexD在LIN總線系統中的位置

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

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

LINFlexD 還支持 UART 模式,用于實現常規的 UART 通信。本文主要面向 LIN 通信引擎介紹,關于 UART 介紹,可見后續文章。

LINFlexD工作機制

初始化

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

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

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

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

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

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

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

在常規工作模式下,LINFlexD 可以執行正常的收發通信。

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

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

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

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

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

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

image.png

圖x LINFlexD的回環模式

主機模式

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

  1. 發送幀頭

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

  1. 發送數據

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

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

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

  1. 接收數據

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

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

  1. 拋棄數據

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

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

從機模式

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

  1. 發送應答數據

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

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

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

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

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

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

同主機模式相同,本機發送的數據,也會被捕獲至本機的接收緩沖區中。

  1. 接收應答數據

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

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

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

錯誤狀態標志位

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

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

image.png

圖x LINFlexD_LINESR寄存器的位定義

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

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

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

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

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

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

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

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

在發送的間隔段中不檢測位錯誤。

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

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

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

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

  1. 幀頭錯誤(Header Error)

從機任務在接收幀頭過程中發現的錯誤,都算是幀頭錯誤。這些錯誤包括

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

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

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

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

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

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

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

  1. 幀錯誤(Frame Error,FEF)

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

當出現幀錯誤時,導致錯誤的字節數據仍會被送入數據緩沖區(畢竟已經送進去了),但LINFlexD_LINSR[DRF]標志位(數據接收完成標志位)不會置位。

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

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

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

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

超時錯誤(Timeout Error)

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

image.png

圖x LINFlexD的超時報錯機制

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

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

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

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

ID過濾機制

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

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

每個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,已經不影響了,此時IFCR_2n+1總是被激活的。當需要本接收機相應的消息ID多于硬件ID過濾器支持的數量時,就需要用ID掩碼模式擴展能識別ID的范圍了。

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

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

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

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

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

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

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

image.png

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

關于檢測模式的更細節的機制,可繼續參見手冊詳述,因同用戶使用關聯不大,此處不再贅述。

產生波特率

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

  • 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是一個無符號的定點數,整數部分存放在20-bit的LINFlexD_LINIBRR寄存器中,小數部分存放在4-bit的LINFlexD_LINFBRR寄存器中。

當停用過采樣功能,就不再使用LINFlexD_LINFBRR寄存器(可清零),此時LDIV僅使用整數部分,配置至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通信幀的同步段,可以先隨便寫兩個波特率發生寄存器LINFlexD_LINIBRRLINFlexD_LINFBRR,然后設定寄存器LINFlexD_LINCR1[LASE]=1啟用自動同步機制。

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

喚醒管理機制

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

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

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

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

image.png

圖x LIN的喚醒時序

軟件

YTMicro SDK中包含了LinFlexD的驅動程序,并提供了lin_masterlin_salvelin_slave_filter等樣例工程。

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

    關注

    48

    文章

    7659

    瀏覽量

    152184
  • 通信協議
    +關注

    關注

    28

    文章

    916

    瀏覽量

    40460
  • 寄存器
    +關注

    關注

    31

    文章

    5370

    瀏覽量

    121282
  • 接收器
    +關注

    關注

    14

    文章

    2482

    瀏覽量

    72254
  • DIR
    DIR
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7349
  • LIN通信
    +關注

    關注

    2

    文章

    8

    瀏覽量

    3835
收藏 人收藏

    評論

    相關推薦

    CAN總線通信協議的基礎知識

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

    汽車電子系統總線LIN通信協議簡介

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

    YTM32的模數轉換器ADC外設模塊詳解

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

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

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

    汽車通信協議資料總結

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

    TCP通信協議-Labview上位機

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

    如何去開發一種基于Freescal單片機的LIN通信協議C語言

    間隔段上升沿觸發的處理函數設計!!!要全部pdf文檔可以留言! 基于Freescal單片機的LIN通信協議C語言開發(五)
    發表于 11-22 07:33

    涂鴉模塊通信協議使用與移植

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

    IIC通信協議的相關資料推薦

    IIC通信協議詳解IIC的概述IIC分為軟件IIC和硬件IICIIC通信協議空閑狀態開始信號與停止信號開始信號程序:IIC的概述IIC:兩線式串行總線,它是由數據線SDA和時鐘線SCL構成的串行總線
    發表于 01-20 07:06

    如何實現基礎通信協議的設計?

    常見的通信協議格式是什么?如何實現基礎通信協議的設計?
    發表于 02-14 07:35

    什么是串口通信?串口通信協議了解

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

    Modbus通信協議詳解

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

    Modbus通信協議教程

    Modbus通信協議教程Modbus通信協議教程Modbus通信協議教程
    發表于 12-08 14:14 ?75次下載

    串行外設接口SPI通信協議的應用

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

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

    間隔段上升沿觸發的處理函數設計!!!要全部pdf文檔可以留言! 基于Freescal單片機的LIN通信協議C語言開發(五)??????
    發表于 11-13 19:06 ?18次下載
    基于Freescal單片機的<b class='flag-5'>LIN</b><b class='flag-5'>通信協議</b>C語言開發(五)
    主站蜘蛛池模板: 久久鬼 | 日韩成人一级 | 国产乱码一区二区三区四川人 | 丁香激情六月 | 国产激情片 | 久久天天丁香婷婷中文字幕 | 老师你好大好白好紧好硬 | 天天做天天爰夜夜爽 | 激情综合网五月婷婷 | 国产午夜精品久久久久 | 黄网在线免费观看 | 黄色v片| 1024你懂的国产日韩欧美 | 中文永久免费看电视网站入口 | 天堂日韩| 亚洲国产精 | 最近免费hd | 全是肉的高h短篇列车 | 最新午夜| 日本一视频一区视频二区 | 欧美成人天天综合天天在线 | 免费一级网站 | 黄色综合 | 日韩大胆 | 国产人人澡| 国产四虎精品 | free性欧美video | 天堂在线资源网 | 黑人破乌克兰美女处 | 日本成本人三级在线观看2018 | 五月天婷婷在线视频 | 污污的黄色小说 | 伊人久久大杳蕉综合大象 | 国产女人在线视频 | 国产精品www夜色影视 | 日本高清高色 | 亚洲国产七七久久桃花 | 国产乱子伦一区二区三区 | 久久看精品 | 国产香蕉98碰碰久久人人 | 1024手机看片你懂得的 日韩欧美 |