LINFlexD外設簡介
YTM32微控制器的LINFlexD外設模塊,實現了LIN協議控制器的功能,可以支持LIN總線協議的主機和從機功能。如圖x所示。
圖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 外設的各項功能時都不會立刻生效,以避免產生不確定的不安全狀態,最后退出初始化模式,硬件同步一并打開所有的配置功能,穩當。
- 初始化模式(Initializaiton,INIT)
軟件配置寄存器LINFlexD_LINCR1[INIT]=1
,切換至初始化模式。當然,還可以通過配置LINFlexD_LINCR1[INIT]=0
,退出初始化模式(至Normal模式?)。
進入初始化模式后,LINFlexD 引擎同 LIN 總線的傳輸將全部停掉(木頭人不許動),并且推送總線上位高電平(隱形信號)。如果在某個總線傳輸的過程中進入初始化模式,則該傳輸將被打斷并退出。所以說,在切入初始化狀態之前,軟件一定要先查一下 LINFlexD 的狀態標志位,確保不會打斷正在進行的傳輸,再進入初始化模式。
在初始化模式下,可以對 LINFlexD 外設進行初始化配置:
- 配置通信波特率
- 啟用 LINFlexD 模式(停用UART模式)
- 選擇主機模式或者從機模式
- 配置校驗和控制位
- 若是從機模式,還需要預先填寫好可以捕獲的ID的列表
- 常規工作模式(Normal Mode,NM)
在初始化模式中,配置寄存器LINFlexD_LINCR1[INIT]=0
,切換至常規工作模式。
在常規工作模式下,LINFlexD 可以執行正常的收發通信。
- 休眠模式(Sleep Mode,SM)
配置軟件寄存器LINFlexD_LINCR1[SLEEP]=1
,切換至休眠模式。當然,也可以通過配置LINFlexD_LINCR1[SLEEP]=0
,退出休眠模式(至Normal模式)。
進入休眠模式后,LINFlexD引擎就暫停工作,等待喚醒事件到來后,自動切回正常模式響應外部的通信請求。
如果軟件在 LIN 總線上檢測到一個 150us 的喚醒脈沖,可以請求 LINFlexD 從休眠模式喚醒。
- 回環工作模式(Loop Back Mode)
通過配置寄存器LINFlexD_LINCR1[LPKM]=1
啟用回環模式。回環工作模式可用于自測試通信協議,當啟動回環模式后,芯片內部的Tx和Rx引腳相連,通過Tx發送的信號會直接被反饋會接收通道(忽略Rx引腳的輸入)。如圖x所示。
圖x LINFlexD的回環模式
主機模式
通過配置寄存器LINFlexD_LINCR1[MME]=1
,設定本設備為主機模式工作。
- 發送幀頭
根據LIN協議的描述,LIN總線的上通信,都是由主機(具體是主機節點的主機任務)發送幀頭開始的。當發送幀頭時,由軟件先寫入LINFlexD_BIDR
寄存器中的字段,包括:ID(6位的幀ID,硬件自動補完校驗位)、DFL(數據段長度)、DIR(幀通信的方向)及CCS(啟用經典校驗的控制位,后續硬件自動生成校驗字節)。然后,設置寄存器LINFlexD_LINCR2[HTRQ]=1
,請求發送幀頭。在啟動發送幀頭之后,在發送完成本幀之前,不要人為修改LINFlexD_BIDR
寄存器中的內容,LINFlexD 從總線上捕獲到已經發送幀的ID會被自動復制到LINFlexD_BIDR
寄存器中。
- 發送數據
當主機節點執行發布任務時(發送數據到總線),主機節點上運行的從任務(主機節點上的主任務僅發送幀頭)會繼續發送數據部分。因此,軟件需要在發起發送幀頭的請求之前,就將需要發送的數據準備好,將數據存放至消息緩沖區LINFlexD_DATA[]
中,同時,需要在LINFlexD_BIDR[DFL]
寄存器中指定將要發送字節數據的數量,硬件根據軟件在LINFlex_BIDR[CCS]
控制位的配置(這個數據位可能是總線上捕獲到的幀頭中的信息),自動計算經典校驗和或是增強校驗和。
當應答的數據發送成功后,會置位硬件標志位LINFlexD_LINSR[DTF]
,但如果發送過程中出現錯誤,標志位LINFlexD_LINSR[DTF]
不會置位,LINFlexD_LINSR
寄存器的其它對應標志位會置位。
應答數據的方向(發送?或是接收)由寄存器LINFlexD_BIDR[DIR]
設定,但哪怕是發送過程,將數據發送上總線后,也會監聽總線,將總線上的數據捕獲下來并存入數據緩沖區中。
- 接收數據
當主機節點從從機節點讀取數據時,應先發出一個幀頭(約定為讀操作的ID)。從機節點捕獲到幀頭之后,會向總線上發送應答數據,此時主機節點(的從機任務)會從總線上捕獲數據,并將數據內容存放至數據緩沖區中,寄存器LINFlexD_LINSR
寄存器中對應的標志位也會置位。
當應答的數據接收成功后,會置位硬件標志位LINFlexD_LINSR[DRF]
,但如果發送過程中出現錯誤,標志位LINFlexD_LINSR[DRF]
不會置位,LINFlexD_LINSR
寄存器的其它對應標志位會置位。
- 拋棄數據
若用戶需要拋棄發送幀頭之后捕獲到的應答數據,可預先設置寄存器LINFlexD_LINCR2[DDRQ]=1
。這對應的是LIN通信中,實現“不應答”的操作。
注意:哪怕是在主機模式中,也是分為主機任務和從機任務兩部分,主機任務僅負責發送幀頭,主機模式中的從機任務和下文描述的從機模式一致,都是通過 LINFlexD_BIDR
寄存器中捕獲的幀頭信息同自己的ID Filter進行匹配,從而啟動對應的發送或接收數據的過程。
從機模式
通過配置寄存器LINFlexD_LINCR1[MME]=0
,設定本設備為從機模式工作。
- 發送應答數據
當從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的效果。
同主機模式相同,本機發送的數據,也會被捕獲至本機的接收緩沖區中。
- 接收應答數據
當收到主機任務發送的幀頭后,若要求本節點接收應答數據,則硬件標志位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所示。
圖x LINFlexD_LINESR寄存器的位定義
- 總線拉低超時錯誤(Stuck at Zero Timeout Error,SZF)
發生Stuck-at-zero超時錯誤。大體上是描述LIN總線被意外地長時間拉低(顯式電平),后續無法傳輸數據的狀態。詳見下文超時錯誤機制。
- 輸出比較標志(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的通信狀態無關。
- 位錯誤(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
,則此時會產生中斷。一種極端的情況,如果不配置退出、不配置中斷,哪怕出現了位錯誤,仍可堅持完成發送過程。
- 校驗和錯誤(Checksum Error,CEF)
當接收機收到數據幀及校驗和字節后,會自動計算校驗和,當計算結果同數據內容不一致時,會拋棄收到的數據包,同時會起一個CEF標志位。如果預先配置寄存器LINFlexD_LINIER[CEIE]=1
,則對應還可以產生一個中斷。
如果是LINFlexD發出的數據包,因LINFlexD在發送過程中會自動計算校驗和,所以若再用 LINFlexD 收到數據包仍會產生校驗和錯誤,那就要查看傳輸線路是否受到較大的干擾。如果發送方的校驗和是人工計算的,那也要再確認軟件計算校驗和的方法是否正確。
- 幀頭錯誤(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。
- 幀錯誤(Frame Error,FEF)
幀錯誤標識的是在當前接收字節(LIN幀的同步段、ID段、數據段、校驗和段)的停止位檢測到一個顯性信號(本應為隱形信號,拉高電平),此時LINFlexD會拋棄當前接收到的幀,然后返回到Idle狀態。如果預先配置了LINFlexD_LINIER[FEIE]=1
,則會產生一個中斷。
當出現幀錯誤時,導致錯誤的字節數據仍會被送入數據緩沖區(畢竟已經送進去了),但LINFlexD_LINSR[DRF]
標志位(數據接收完成標志位)不會置位。
- 緩沖區溢出(Buffer Overrun,BOF)
當收到一個新的數據時,若標志位LINFlexD_LINSR[RMB]=1
尚為清零(數據緩沖區滿,軟件可讀),則判定為緩沖區溢出,報錯。此時還需通過寄存器LINFlexD_LINCR1[RBLM]
的配置值,確定如何處理新數據:
- 若
LINFlexD_LINCR1[RBLM]=0
,則之前未被都走的數據包將會被新的數據包覆蓋,舊的數據包將被丟失。 - 若
LINFlexD_LINCR1[RBLM]=1
,則之前未被都走的數據包將會被保持,新的數據包將被丟失。在從機模式下,如果再未讀完數的情況下來了新的LIN幀,不僅僅是數據,連帶幀ID也會被一同拋棄。
- 噪聲標志(Noise Flag,NF)
當接收器檢測到噪聲時,起本標志位。關于噪聲,是在檢測開始信號和間隔符信號時,進行連續3次隔點采樣,未能達到判決條件時,即認定為總線上有噪聲。
超時錯誤(Timeout Error)
當主機發送了幀頭后,如果在指定的時間段內未收到應答數據,則會產生超時錯誤。LINFlexD外設內部設計了一個超時定時器(Timerout Counter),專門用于檢測同超時相關的檢測和響應事件。
圖x LINFlexD的超時報錯機制
- 應答超時機制
- 主機模式:每當發送或者接收到ID段(幀頭的最后一個字段)后,確切地說,是當DFL被硬件寫入后,LINFlexD會自動將寄存器
LINFlexD_LINOCR[OC2]
載入到LINFlex_LINTOCR[CNT]
寄存器,并啟動內部的定時器開始倒計數,若在計數器計數清零之前未完成接收數據,則產生超時事件。這相當于是個看門狗。 - 從機模式:若使用ID過濾器過濾接收數據幀,同主機模式類似,當匹配到消息ID,硬件寫入DFL寄存器時,載入
LINFlexD_LINOCR[OC2]
寄存器的值到定時器,開始計數。若未使用ID過濾器,則在收到數據幀并由軟件進行識別后,人工寫入DFL寄存器時,硬件載入LINFlexD_LINOCR[OC2]
寄存器的值到定時器,啟動定時器。
- 幀頭超時機制
- 主機模式:由于幀頭是由LINFlexD硬件自動產生的,正常情況下不會出現超時。
- 從機模式:在收到幀間隔符后,硬件從寄存器
LINFlexD_LINOCR[OC1]
到LINFlexD_TOCR[HTO]
,啟動定時器。
注意,這里的定時器也可以用來檢測其他的超時事件,但需要配置LINFlexD_LINTCSR[MODE]=0
,然后軟件向寄存器LINFlexD_LINTOCR
中寫入輸出比較值。
- 總線拉低超時錯誤(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)將會被置位。
圖x 使用移位器檢測開始信號和分隔符模式
關于檢測模式的更細節的機制,可繼續參見手冊詳述,因同用戶使用關聯不大,此處不再贅述。
產生波特率
配置LIN總線的(發送和接收)波特率,主要設計兩個寄存器:LINFlexD_LINIBRR
和LINFlexD_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_LINIBRR
和LINFlexD_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]
寄存器位以返回常規工作模式。
圖x LIN的喚醒時序
軟件
YTMicro SDK中包含了LinFlexD的驅動程序,并提供了lin_master
、lin_salve
、lin_slave_filter
等樣例工程。
-
微控制器
+關注
關注
48文章
7659瀏覽量
152184 -
通信協議
+關注
關注
28文章
916瀏覽量
40460 -
寄存器
+關注
關注
31文章
5370瀏覽量
121282 -
接收器
+關注
關注
14文章
2482瀏覽量
72254 -
DIR
+關注
關注
0文章
5瀏覽量
7349 -
LIN通信
+關注
關注
2文章
8瀏覽量
3835
發布評論請先 登錄
相關推薦
汽車電子系統總線LIN通信協議簡介
![汽車電子系統總線<b class='flag-5'>LIN</b><b class='flag-5'>通信協議</b>簡介](https://file1.elecfans.com/web2/M00/A5/AC/wKgaomUNMoOAYlVSAAJlTL4JsRs904.jpg)
TCP通信協議-Labview上位機
如何去開發一種基于Freescal單片機的LIN通信協議C語言
涂鴉模塊通信協議使用與移植
IIC通信協議的相關資料推薦
什么是串口通信?串口通信協議了解
基于Freescal單片機的LIN通信協議C語言開發(五)
![基于Freescal單片機的<b class='flag-5'>LIN</b><b class='flag-5'>通信協議</b>C語言開發(五)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論