TMS320F28P550SJ9學習筆記15:Lin通信SCI模式結構體寄存器

今日初步認識與配置使用Lin通信SCI模式,用結構體寄存器的方式編程

文章提供完整工程下載、測試效果圖

我的單片機平臺是這個:

LIN通信引腳:

?

LIN通信PIE中斷:

這個? PIE Vector Table? 表在手冊111頁:

這是提到LINa的PIE中斷向量:

LIN通信的幀結構:

在LIN總線上及逆行傳送的實體就是幀。

幀的發送時間是每個字節發送時間的總和,再加上響應間隙時間和字節間隙時間。

信號是在幀的數據場里面輸送的。多個信號可以打包成一個幀,只要這些信號彼此之間不會相互重疊。但是他們要由機群里面的同一個節點寫入。

幀可以攜帶1-8byte的數據。對擁有指定標識符的幀來說,其包含的字節的數量應與發布服務器和所有認購器保持一致。

幀槽

每個預定的幀會在總線上分配一個槽。槽的間隙時間必須足夠長,以便能夠在最糟的情況下裝載幀。

幀的類型

LIN總線上數據傳輸包括四種不同的幀,分別為無條件幀、事件觸發幀、偶發幀、診斷幀。

28P550?LIN模塊的功能:

?手冊3444頁提到了LIN模塊的功能:

  • 兼容LIN 1.3、2.0和2.1協議
  • 可配置的波特率高達20 kbps
  • 兩個外部引腳:LINRX和LINTX
  • 多緩沖的接收和發送單元
  • 識別掩碼的消息過濾
  • 自動命令頭生成
    • 預同步場
    • 同步場
    • 標識符字段
  • 響應器自動同步
    • 同步中斷檢測
    • 可選的帶寬限制
    • 可編程的同步場驗證
  • 2st可編程發送速率,具有7位小數位
  • 從發送器喚醒的LIN主導電平
  • 自動喚醒支持
  • 可編程的喚醒信號上的喚醒時間
  • 自動總線空閑檢測
  • 錯誤檢測
    • 位錯誤
    • 總線錯誤
    • 無響應錯誤
    • 校驗和錯誤
    • 同步場錯誤
    • 奇偶錯誤
  • 使用直接內存訪問(DMA)進行發送和接收數據的能力
  • 2個具有優先級編碼的接收時間
    • 接收
    • 傳輸
    • ID、錯誤和狀態
  • 支持LIN 2.0校驗和
  • 增強的有限狀態機(FSM)支持幀處理
  • 增強的處理擴展幀的能力
  • 增強的波特率發生器
  • 更新喚醒/進入睡眠

28P550 LIN時鐘、頻率、波特率:

LIN VCLK基于SYSCLK頻率。

VCLK來自SYSCLK輸入

使用每個LIN模塊的CLK_CFG_REGS perclkdivsel字段分別以1、2或4的比例進行分頻。

默認情況下,VCLK輸入是SYSCLK除以2。

任何節點的傳輸波特率由CPU在開始時配置;這定義了比特時間Tbit。比特時間是從波特率選擇寄存器(BRSR)中的字段P和M派生出來的。BRSR寄存器中還有一個額外的3位分數分頻值,即字段U,進一步微調數據字段的波特率。

BRSR寄存器中預分頻值的范圍是:

P=0,1,2,3,...,2^24-1?

M = 0,1,2,...,15?

U = 0,1,2,3,4,5,6,7?

BRSR寄存器中的P、M和U值是用戶可編程的。

P和M分頻器可用于SCI模式和LIN模式,以選擇波特率。

U值是一個額外的3位值,用于確定“每個Tbit增加一個T VCLK”(=0,1),

如第29.3.1.4.2節所述。如果適應位被設置且LIN外設處于自適應波特率模式,則在接收頭部時測量同步字段時,所有這些分頻值都會自動獲得。

LIN協議定義了波特率邊界為:1 kHz≤FLINCLK≤20 kHz

所有傳輸的比特都在Tbit周期內移入和移出。

波特率、字節時間計算公式

?P、M

圖片描述了SCI/LIN模塊的波特率設置。該模塊通過內部生成的串行時鐘來確定波特率,該時鐘由外設VCLK和BRS寄存器中的預分頻器P和M決定。

SCI使用BRS寄存器中的24位整數預分頻器P值來選擇所需的波特率,而額外的4位小數分頻器M則用于細化波特率選擇。

在異步定時模式下,SCI根據以下公式生成波特率時鐘:

SCICLK頻率 = VCLK頻率 / (P+1) + M/16

當P=0時,異步波特率值為:

異步波特率值 = VCLK頻率 / 32

P、M、D

更微小的波特率變化:

波特率計算實例:

Baund = 115200 :

Baund = 9600 :

SCI/LIN interrupts:

LIN收發框圖:

LIN通信寄存器:

Offset: 寄存器的偏移地址。??????? Acronym: 寄存器的縮寫名稱。

Register Name: 寄存器的全稱。 Write Protection: 寫保護,表示該寄存器是否受寫保護。

Section: 寄存器所屬的章節或類別。

偏移量縮寫寄存器名稱
0hSCIGCRO全局控制寄存器0
4hSCIGCR1全局控制寄存器1
8hSCIGCR2全局控制寄存器2
ChSCISETINT中斷使能寄存器
10hSCICLEARINT中斷禁用寄存器
14hSCISETINTLVL設置中斷級別寄存器
18hSCICLEARINTLVL清除中斷級別寄存器
1ChSCIFLR標志寄存器
20hSCIINTVECTO中斷向量偏移寄存器0
24hSCIINTVECT1中斷向量偏移寄存器1
28hSCIFORMAT長度控制寄存器
2ChBRSR波特率選擇寄存器
30hSCIED仿真緩沖寄存器
34hSCIRD接收數據緩沖寄存器
38hSCITD發送數據緩沖寄存器
3ChSCIPIOO引腳控制寄存器0
44hSCIPIO2引腳控制寄存器2
60hLINCOMP比較寄存器
64hLINRDO接收數據寄存器0
68hLINRD1接收數據寄存器1
6ChLINMASK接受掩碼寄存器
70hLINIDLIN ID寄存器
74hLINTDO發送數據寄存器0
78hLINTD1發送數據寄存器1
7ChMBRSR最大波特率選擇寄存器
90hIODFTCTRLIODFT for LIN
EOhLIN_GLB_INT_ENLIN全局中斷使能寄存器
E4hLIN_GLB_INT_FLGLIN全局中斷標志寄存器
E8hLIN_GLB_INT_CLRLIN全局中斷清除寄存器

BRSR寄存器:

波特率設定相關寄存器

    LinaRegs.BRSR.bit.M = 1;/* M : 代表SCI/LIN 4位分數分頻器選擇(M)* 這些位僅在LIN或SCI異步模式下起作用* 用于選擇SCI/LIN模塊的波特率,并且它們是波特率規范的分數部分* 可以通過P預分頻器對波特率進行微調,每個P整數值有15個額外的中間值,從而提供更精細的波特率調整能力* */LinaRegs.BRSR.bit.SCI_LIN_PSH = 1;/* SCI_LIN_PSH :SCI/LIN預分頻器P的高位選擇* 用于選擇SCI/LIN模塊的24位整數預分頻器* 在LIN模式和SCI兼容模式下有效* SCI/LIN模塊使用24位整數預分頻器P來選擇超過16,700,000的波特率,而額外的4位分數預分頻器M則用于進一步細化波特率的選擇* */LinaRegs.BRSR.bit.SCI_LIN_PSL = 1;/*SCI_LIN_PSL :SCI/LIN預分頻器P的低位選擇* * */LinaRegs.BRSR.bit.U = 1;/* U : 代表超級分頻器選擇的上半部分(Upper part of the Superfractional Divider Selection)。*  “這些位是波特率規范的額外分數部分。”:說明這些位用于進一步細化波特率的分數部分* */

Lin通信寄存器初始化:

?手冊3486頁提到了LIN通信的配置

29.3.5 LIN 配置

以下列表詳細描述了軟件在配置LIN模式的數據傳輸或接收之前可以執行的配置步驟。只要SWnRST位被清除為0整個配置過程,寄存器的編程順序并不重要。

? 通過設置RESET位(SCIGCR0.0)啟用LIN。
? 在配置LIN之前,將SWnRST清除為0(SCIGCR1.7)。
? 通過設置RXFUNC和TXFUNC位啟用LINRX和LINTX引腳。
? 通過編程LINMODE位選擇LIN模式(SCIGCR1.6)。
? 通過編程CLOCK位選擇指揮官或響應模式。
? 通過編程SCIGCR1選擇所需的幀格式(校驗和、奇偶校驗、長度控制)。
? 通過編程MBUFMODE位選擇多緩沖區模式(SCIGCR1.10)。
? 通過編程BRSR選擇用于通信的波特率。
? 設置最大波特率,以用于通信,通過編程MBRSR。
? 設置CONT位,使LIN在仿真斷點處不會停止,直到LIN當前接收或傳輸完成(此位僅在仿真環境中使用)。
? 如果需要,通過設置SCIGCR1.16的LOOPBACK位將發射機連接到接收機內部(此功能用于執行自檢)。
? 選擇接收器啟用RXENA位(SCIGCR1.24),如果要接收數據。
? 選擇傳輸啟用TXENA位(SCIGCR1.25),如果要傳輸數據。
? 選擇LINMASK寄存器中的RXIDMASK和TXIDMASK字段。
? 在配置LIN后,將SWnRST(SCIGCR1.7)設置為1。
? 接收或傳輸數據(見第29.3.1.9節、第29.3.5.1節和第29.3.5.2節)。

注意:如果設置了TXENA且釋放了SWnRST,LIN會立即生成新的DMA請求,但不會生成新的傳輸中斷請求。如果使用中斷,則必須通過軟件向傳輸緩沖區寫入數據,然后將所選ID寫入LINID寄存器,以啟動第一次傳輸。

?這個例子只是我自己照著初始化寫了一下,沒驗證能否用:

void Init_LINA()
{//uint32_t i;// 鏈接中斷服務函數 與 初始化引腳EALLOW;PieVectTable.LINA_0_INT = &level0ISR;PieVectTable.LINA_1_INT = &level1ISR;EDIS;//重載 以啟用 LIN模塊LinaRegs.SCIGCR0.bit.RESET = 1;LinaRegs.SCIGCR1.bit.SWnRST = 0;//選擇LIN通信 使能LinaRegs.SCIGCR1.bit.LINMODE = 1;//LinaRegs.SCIGCR1.bit.LOOPBACK=1; //數據回環模式//使能收發LinaRegs.SCIGCR1.bit.RXENA = 1;LinaRegs.SCIGCR1.bit.TXENA = 1;//引腳控制寄存器LinaRegs.SCIPIO0.bit.RXFUNC = 1;LinaRegs.SCIPIO0.bit.TXFUNC = 1;//SCI兼容模式引腳LinaRegs.SCIPIO2.bit.RXIN = 1;LinaRegs.SCIPIO2.bit.TXIN = 1;//多緩沖區模式:LinaRegs.SCIGCR1.bit.MBUFMODE = 0; //是否使用RX/TX多緩沖器或使用單個寄存器RD0/TD0。//設定 波特率 115200 得到組合: P=19 M=0 U=5ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 預分頻  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = 15;LinaRegs.BRSR.bit.SCI_LIN_PSH = (19 >> 8) & 0xff;LinaRegs.BRSR.bit.SCI_LIN_PSL = 19 & 0xff;LinaRegs.BRSR.bit.U = 5;/*//設定波特率 9600 得到組合: P= M= U=ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 預分頻  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = ;LinaRegs.BRSR.bit.SCI_LIN_PSH = ;LinaRegs.BRSR.bit.SCI_LIN_PSL = ;LinaRegs.BRSR.bit.U = ;*///設定最大波特率//LinaRegs.MBRSR.bit.MBRLinaRegs.SCIGCR1.bit.CONT = 1; //使LIN在仿真斷點處不會停止,直到LIN當前接收或傳輸完成//僅在LIN模式下有效LinaRegs.LINMASK.bit.RXIDMASK = 0xff; // 過濾傳入的ID消息,并將其與ID字節進行比較LinaRegs.LINMASK.bit.TXIDMASK = 0xff; ////使能中斷LinaRegs.SCISETINT.bit.SETRXINT = 1; //接收中斷//重啟LIN模塊LinaRegs.SCIGCR1.bit.SWnRST = 1;}

LIN通信寄存器發送:

手冊3487頁提到了LIN的發送

29.3.5.2 傳輸數據

LIN發射器在TXFUNC位和TXENA位都設置為1時被啟用。如果TXFUNC位未設置,LINTX引腳將作為通用I/O引腳,而不是LIN功能引腳。在將TXENA位設置為1之前寫入TDO的任何值都不會被傳輸。這兩個控制位允許LIN發射器保持不活動狀態,與接收器獨立。在接收到有效的LIN ID并進行TX匹配后,SCIFLR寄存器中的IDTXFLAG會被設置。如果啟用,則會生成ID中斷。

29.3.5.2.1 單緩沖區模式傳輸數據

當MBUFMODE位清零設置為0時,選擇單緩沖區模式。在此模式下,LIN等待數據寫入TDO,將數據從SCITXSHF傳輸并發送數據。TXRDY和TXEMPTY位指示傳輸緩沖區的狀態。也就是說,當發射器準備好數據寫入TDO時,TXRDY位被設置。此外,如果TDO和SCITXSHF都為空,則TXEMPTY位也被設置。你可以通過以下方式傳輸數據:

  1. 輪詢傳輸就緒標志
  2. 傳輸中斷
  3. DMA

在輪詢方法中,軟件可以在寫入數據到TDO之前輪詢TXRDY位變高。選擇輪詢方法會導致CPU不必要的負載過大。為了避免這種情況,你可以使用中斷或DMA方法。要使用中斷方法,需要設置SETXINT位。要使用DMA方法,必須設置SET_TX_DMA位。一旦TXRDY位被設置,就會立即生成中斷或DMA請求。當LIN完成所有掛起幀的傳輸,SCITXSHF寄存器和TDO都為空時,TXRDY位被設置,如果啟用,則會生成中斷/DMA請求。因為所有數據都已傳輸,所以中斷/DMA請求可以被停止。這可以通過禁用傳輸中斷(CLRTXINT)/DMA請求(CLRTXDMA位)或禁用發射機(清除TXENA位)來完成。如果通過將發送校驗和(SC)位設置為1來啟用校驗和方案,則校驗和字節將在當前字節傳輸之后發送。SC位在校驗和字節被傳輸后清除。

注意:TXRDY標志不能通過讀取SCIINTVECTO或SCIINTVECT1寄存器中的相應中斷偏移來清除。

LIN通信寄存器接收:

手冊3487頁提到了LIN接收:

29.3.5.1 接收數據

LIN接收器被啟用以接收消息,如果RXFUNC位和RXENA位都設置為1。如果RXFUNC位未設置,LINRX引腳將作為通用I/O引腳,而不是LIN功能引腳。在接收到有效的LINID并進行RX匹配后,SCIFLR寄存器中的IDRXFLAG會被設置。如果啟用,則會生成ID中斷。

29.3.5.1.1 單緩沖區模式接收數據

當MBUFMODE位被清零時,選擇單緩沖區模式。在此模式下,當LIN將新接收的數據從SCIRXSHF傳輸到RDO時,會設置RXRDY位。SCI在讀取RDO中的新數據后清除RXRDY位。此外,當數據從SCIRXSHF傳輸到RDO時,如果檢測到任何錯誤條件,LIN會設置FE、OE或PE標志。這些錯誤條件支持可配置的中斷功能。你可以通過以下方式接收數據:

  1. 輪詢接收就緒標志
  2. 接收中斷
  3. DMA

在輪詢方法中,軟件可以輪詢RXRDY位,并在RXRDY位設置高時讀取LINRDO寄存器的RDO字節中的數據。選擇輪詢方法會導致CPU不必要的負載過大。為了避免這種情況,你可以使用中斷或DMA方法。要使用中斷方法,需要設置SETRXINT位。要使用DMA方法,必須設置SET_RX_DMA位。一旦RXRDY位被設置,就會立即生成中斷或DMA請求。如果通過設置比較校驗和(CC)位來啟用校驗和方案,則校驗和將在當前正在接收的字節上進行比較,該字節預期為校驗和字節。一旦接收到校驗和,CC位就會被清除。如果存在校驗和錯誤,則會立即標記CE。

29.3.5.1.2 多緩沖區模式接收數據

多緩沖區模式是在MBUFMODE位設置為1時選中的。在這種模式下,LIN在接收緩沖區中接收到編程數據數量和校驗和字段、完整幀后設置RXRDY位。錯誤條件檢測邏輯與單緩沖區模式相似,除該邏輯會監控完整幀。與單緩沖區模式類似,你可以使用輪詢、DMA或中斷方法讀取數據。根據字節數,需要從LINRDO和LINRD1寄存器讀取接收到的數據。對于長度小于或等于4的數據,從LINRDO寄存器讀取數據會清除RXRDY標志。對于長度大于4的數據,從LINRD1寄存器讀取數據會清除RXRDY標志。如果在數據接收過程中通過把比較校驗和(CC)位設置為1來啟用校驗和方案,那么接收到的指示為長度字段所指示的編程數據字節數之后的字節會被視為校驗和字節。一旦接收到并比較校驗和,CC位就會清除。

LIN-SCI模式寄存器初始化:

?手冊3463頁提到了LINSCI模式初始化

29.2.4 SCI 配置

在SCI發送或接收數據之前,可以對SCI寄存器進行適當的配置。在上電或系統級復位時,SCI寄存器中的每一位都會設置為默認狀態。只有在SCIGCR0寄存器中的RESET位設置為1之后,寄存器才可寫。特別重要的是SCIGCR1寄存器中的SWnRST位。SWnRST是一個活動低電平位,初始化為0,并保持SCI在復位狀態,直到該位被編程為1。因此,在將1寫入SWnRST位之前,可以完成所有SCI配置。以下列表詳細說明了軟件可以在數據傳輸或接收之前執行的配置步驟。只要在整個配置過程中保持SWnRST位清零,寄存器的編程順序并不重要。

  • 通過將RESET位設置為1來啟用SCI。
  • 在配置SCI之前,將SWnRST位清零。
  • 通過編程SCIGCR1寄存器選擇所需的幀格式。
  • 將SCIPIO0中的RX FUNC和TX FUNC位設置為1,以配置LINRX和LINTX引腳用于SCI功能。
  • 通過編程BRS寄存器選擇用于通信的波特率。
  • 將SCIGCR1中的CLOCK位設置為1,以選擇內部時鐘。
  • 將SCIGCR1中的CONT位設置為1,使SCI在仿真斷點處不停止,直到當前接收或傳輸完成(此位僅在仿真環境中使用)。
  • 將SCIGCR1中的LOOP BACK位設置為1,以將發射機連接到接收機內部(此功能用于執行自測試)。
  • 如果要接收數據,將RXENA位設置為1。
  • 如果要傳輸數據,將TXENA位設置為1。
  • 在SCI配置完成后,將SWnRST位設置為1。
  • 執行接收或傳輸數據(見第29.2.4.1節或第29.2.4.2節)。

?

?2025.4.15配置問題遺留:

?目前我按照按照手冊配置LIN_SCI模式到這一步,通信在我的硬件平臺是有問題的,沒法找出問題在哪

/** Lin.c**  Created on: 2025年4月11日*      Author: 30313*/
#include "Lin_1.h"void Init_LINA_SCIMode(void)
{//uint32_t i;// 鏈接中斷服務函數 與 初始化引腳EALLOW;PieVectTable.LINA_0_INT = &level0ISR; //RX_INTPieVectTable.LINA_1_INT = &level1ISR; //TX_INTPieCtrlRegs.PIEIER8.bit.INTx9 = 1;    //8.9PieCtrlRegs.PIEIER8.bit.INTx10 = 1;   //8.10IER |= M_INT8;GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;    //Enable pull-upGpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;  //Asynch input (LIN_SCI RX)GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;   // Configure GPIO55 for RX operationGpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;   // Configure GPIO54 for TX operationGpioCtrlRegs.GPBDIR.bit.GPIO54 = 1;  // 輸出(TX)GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;  // 輸入(RX)EDIS;//重載 以啟用 LIN模塊LinaRegs.SCIGCR0.bit.RESET = 1;LinaRegs.SCIGCR1.bit.SWnRST = 0;//引腳控制寄存器LinaRegs.SCIPIO0.bit.RXFUNC = 1;LinaRegs.SCIPIO0.bit.TXFUNC = 1;//SCI兼容模式引腳LinaRegs.SCIPIO2.bit.RXIN = 1;LinaRegs.SCIPIO2.bit.TXIN = 1;//多緩沖區模式:LinaRegs.SCIGCR1.bit.MBUFMODE = 0; //是否使用RX/TX多緩沖器或使用單個寄存器RD0/TD0。LinaRegs.SCIGCR1.bit.STOP = 0;  //0:1位停止位   1:2位停止位LinaRegs.SCIGCR1.bit.PARITYENA = 0; // 禁用奇偶校驗LinaRegs.SCIGCR1.bit.PARITY = 0; //0:奇校驗 1::偶校驗   (如果使能了奇偶校驗)LinaRegs.SCIFORMAT.bit.CHAR = 7; //8位數據長度//設定 波特率 115200 得到組合: P=19 M=5 U=0ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 預分頻  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = 10;LinaRegs.BRSR.bit.SCI_LIN_PSH = (26 >> 8) & 0xff;LinaRegs.BRSR.bit.SCI_LIN_PSL = 26 & 0xff;LinaRegs.BRSR.bit.U = 0;LinaRegs.SCIGCR1.bit.CLK_COMMANDER = 1; //SCI兼容模式LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; //SCI異步操作,SCI模式必須設為1LinaRegs.SCIGCR1.bit.COMMMODE = 0;//0:SCI空閑線  1:SCI地址位LinaRegs.SCIGCR1.bit.ADAPT = 0; //禁用自動波特率LinaRegs.SCIGCR1.bit.CONT = 1; //仿真斷點不停LinaRegs.SCIGCR1.bit.CONT = 1; //使LIN在仿真斷點處不會停止,直到LIN當前接收或傳輸完成//LinaRegs.SCIINTVECT0.bit.INTVECT0//LinaRegs.SCICLEARINT.bit.CLRRXINT = 1;//清除接收中斷//使能收發LinaRegs.SCIGCR1.bit.RXENA = 1;LinaRegs.SCIGCR1.bit.TXENA = 1;//使能中斷LinaRegs.SCISETINT.bit.SETRXINT = 1; //接收中斷LinaRegs.SCISETINT.bit.SETTXINT = 1; //發送中斷//重啟LIN模塊LinaRegs.SCIGCR1.bit.SWnRST = 1;
}void LIN_Transmit_Data_SCIMode(unsigned char Data)
{LinaRegs.SCITD.bit.TD = Data;
//    while (LinaRegs.SCIFLR.bit.TXRDY == 0) //等待發送完成
//    {
//        //考慮添加超時邏輯
//    }
//    LinaRegs.SCIFLR.bit.TXEMPTY
//    LinaRegs.SCIFLR.bit.TXRDY
}__interrupt void level0ISR(void)
{}__interrupt void level1ISR(void)
{}

通信完全沒發波:

但寄存器能正常置位:

LIN-SCI模式寄存器發送:

手冊3464頁

29.2.4.2 傳輸數據

如果TXFUNC位和TXENA位都設置為1,則啟用SCI發射器。如果TXFUNC位未設置,LINTX引腳將作為通用I/O引腳,而不是SCI功能引腳。在將TXENA位設置為1之前寫入SCITD/TDy的任何值都不會被傳輸。這兩個控制位允許SCI發射器獨立于接收器保持不活動狀態。SCI模塊可以在以下模式之一中傳輸數據:

  • 單緩沖區(正常)模式
  • 多緩沖區或緩沖區SCI模式

29.2.4.2.1 單緩沖區模式傳輸數據

當SCIGCR1中的MBUFMODE位清零為0時,選擇單緩沖區模式。在此模式下,SCI等待數據寫入SCITD,將數據從SCITD傳輸到SCITXSHF,并傳輸數據。

TXRDY和TXEMPTY位指示傳輸緩沖區的狀態。

也就是說,當發射器準備好數據寫入SCITD時,TXRDY位被設置。

此外,如果SCITD和SCITXSHF都為空,則TXEMPTY位也被設置。

你可以通過以下方式傳輸數據:

  1. 輪詢傳輸就緒標志
  2. 傳輸中斷
  3. DMA

在輪詢方法中,軟件可以在將數據寫入SCITD寄存器之前輪詢TXRDY位變高。選擇輪詢方法會導致CPU不必要的負載過大。為了避免這種情況,你可以使用中斷或DMA方法。要使用中斷方法,需要設置SETTXINT位。要使用DMA方法,必須設置SET_TX_DMA位。一旦TXRDY位被設置,就會立即生成中斷或DMA請求。當SCI完成所有掛起幀的傳輸,SCITXSHF寄存器和SCITD都為空時,TXRDY位被設置,如果啟用,則會生成中斷/DMA請求。因為所有數據都已傳輸,所以中斷/DMA請求可以被停止。這可以通過禁用傳輸中斷(CLRTXINT)/DMA請求(CLRTXDMA位)或禁用發射機(清除TXENA位)來完成。注意:TXRDY標志不能通過讀取SCIINTVECTO或SCIINTVECT1寄存器中的相應中斷偏移來清除。

LIN-SCI模式寄存器接收:

?3463頁

?

29.2.4.1 接收數據

SCI接收器被啟用以接收消息,如果RX FUNC位和RXENA位都設置為1。如果RX FUNC位未設置,LINRX引腳將作為通用I/O引腳,而不是SCI功能引腳。SCI模塊可以在以下模式之一中接收數據:

  • 單緩沖區(正常)模式
  • 多緩沖區模式

在檢測到有效的空閑期后,數據會自動接收,因為數據到達LINRX引腳。

29.2.4.1.1 單緩沖區模式接收數據

當SCIGCR1中的MBUFMODE位清零為0時,選擇單緩沖區模式。在此模式下,當SCI將新接收的數據從SCIRXSHF傳輸到SCIRD時,會設置RXRDY位。在讀取SCIRD中的新數據后,SCI會清除RXRDY位。此外,當數據從SCIRXSHF傳輸到SCIRD時,如果在接收到的數據中檢測到任何這些錯誤條件,則會設置FE、OE或PE標志。這些錯誤條件支持可配置的中斷功能。如果發生這些錯誤之一,喚醒和中斷檢測狀態位也會被設置,但這些位不一定會在新數據加載到SCIRD時同時出現。你可以通過以下方式接收數據:

  1. 輪詢接收就緒標志
  2. 接收中斷
  3. DMA

在輪詢方法中,軟件可以輪詢RXRDY位,并在RXRDY位設置為高時從SCIRD寄存器讀取數據。選擇輪詢方法會導致CPU不必要的負載過大。為了避免這種情況,你可以使用中斷或DMA方法。要使用中斷方法,需要設置SETRXINT位。要使用DMA方法,必須設置SET_RX_DMA位。在RXRDY位被設置的那一刻,會立即生成中斷或DMA請求。

測試效果圖:

完整工程下載:

參考文章:

LIN通訊_lin通信-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77085.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77085.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77085.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux-設置每次ssh登錄服務器的時候提醒多久需要修改密碼

在 Linux 系統中,你可以通過設置 motd(Message of the Day)或 sshd 配置來在用戶通過 SSH 登錄時提醒他們密碼即將過期。以下是具體步驟: 方法 1: 使用 motd 文件 motd 文件在用戶登錄時顯示,你可以通過腳本動態生成內容,提醒用戶密碼過期時間。 編輯 /etc/motd 文件:…

matlab求和∑函數方程編程?

matlab求和∑函數方程編程? 一 題目:求下列函數方程式的和 二:代碼如下: >> sum_result 0; % 初始化求和變量 for x 1:10 % 設…

electron桌面端開發-打開指定軟件和文件

electron桌面端開發 現在越來越多的軟件開發已經趨向于簡單化,桌面端開發已經不在依賴之前的java、c等主流技術,目前基于node的開發越來越廣泛。功能點也越來越多元化。 文章目錄 electron桌面端開發前言一、打開文件的方式?二、exec使用步驟…

ShenNiusModularity項目源碼學習(17:ShenNius.Admin.Mvc項目分析-2)

ShenNiusModularity項目的后臺管理主頁面如下圖所示,該頁面為ShenNius.Admin.Mvc項目的Views\Home\Index.cshtml,使用的是layuimini后臺模板(參考文獻2),在layuimini的GitHub主頁中提供有不同樣式的頁面模版鏈接&#…

SpringBoot 與 Vue3 實現前后端互聯全解析

在當前的互聯網時代,前后端分離架構已經成為構建高效、可維護且易于擴展應用系統的主流方式。本文將詳細介紹如何利用 SpringBoot 與 Vue3 構建一個前后端分離的項目,展示兩者如何通過 RESTful API 實現無縫通信,讓讀者了解從環境搭建、代碼實…

portainer.io篇

Portainer?是一個輕量級的容器管理工具,支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多種平臺。它提供了一個直觀的Web界面,使用戶能夠輕松地管理和監控容器,包括創建、啟動、停止、刪除容器,以及查看容器的日志和配置信…

Dockerfile 文件常見命令及其作用

Dockerfile 文件包含一系列命令語句,用于定義 Docker 鏡像的內容、配置和構建過程。以下是一些常見的命令及其作用: FROM:指定基礎鏡像,后續的操作都將基于該鏡像進行。例如,FROM python:3.9-slim-buster 表示使用 Pyt…

Android Studio開發知識:從基礎到進階

引言 Android開發作為移動應用開發的主流方向之一,曾吸引了無數開發者投身其中。然而,隨著市場飽和和技術迭代,當前的Android開發就業形勢并不樂觀,競爭日益激烈。盡管如此,掌握扎實的開發技能仍然是脫穎而出的關鍵。本…

大表查詢的優化方案

?單表優化?: ?字段選擇?:盡量使用TINYINT、SMALLINT、MEDIUMINT作為整數類型,而非INT;如果字段值非負,可以使用UNSIGNED。對于字符串字段,使用枚舉或整數代替字符串類型,使用TIMESTAMP而非D…

常見MQ及類MQ對比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ

常見MQ及類MQ對比 基于Grok調研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 關鍵點: Redis Pub/Sub 適合簡單實時消息,但不持久化,消息可能丟失。Redis Stream 提供持久化,適合需要消息歷史的場景,但…

DAPP實戰篇:使用ethersjs連接智能合約并輸入地址查詢該地址余額

本系列目錄 專欄:區塊鏈入門到放棄查看目錄-CSDN博客文章瀏覽閱讀400次。為了方便查看將本專欄的所有內容列出目錄,按照順序查看即可。后續也會在此規劃一下后續內容,因此如果遇到不能點擊的,代表還沒有更新。聲明:文中所出觀點大多數源于筆者多年開發經驗所總結,如果你…

庫magnet使用指南

Magnet 多線程控制庫使用指南 目錄 庫功能概述環境配置核心類與接口基礎使用示例代碼生成工具高級功能與改進建議完整示例代碼常見問題解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 庫功能概述 Magnet 庫提供以下核心功能: 多線程…

SpringCloud-快速通關(三)

SpringCloud-快速通關(一) SpringCloud-快速通關(二) SpringCloud-快速通關(三) SpringCloud-快速通關(三) 七、Seata - 分布式事務7.1、環境搭建7.1.1、簡介7.1.2、環境搭建7.1.3、seata-server7.1.4、微服務配置7.1.5、測試7.2、事務模式7.2.1、AT模式7.2.2、XA模式…

STM32 TDS+溫度補償

#define POLAR_CONSTANT (513385) /* 電導池常數,可通過與標準TDS測量儀對比計算反推 */ #define TDS_COEFFICIENT (55U) /* TDS 0.55 * 電子傳導率*/void TDS_Value_Conversion() {u32 ad0;u8 i;float compensationCoefficient;float compens…

數據分析實戰案例:使用 Pandas 和 Matplotlib 進行居民用水

原創 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文將使用 Matplotlib 及 Seaborn 進行數據可視化。探索如何清理數據、計算月度用水量并生成有價值的統計圖表,以便更好地理解居民的用水情況。 數據處理與清理 讀取 Excel 文件 首先,我們使用 pan…

離線環境下docker啟動springboot項目

Docker linux 離線部署springboot 搭建dcoker環境 1. 首先在有網絡的機器上下載Docker的離線安裝包&#xff1a; - 訪問 https://download.docker.com/linux/static/stable/x86_64/ - 下載對應版本的 docker-<version>.tgz 文件 2. 將下載的安裝包傳輸到目標Linux機器上…

分布式專題-Redis Cluster集群運維與核心原理剖析

一. 哨兵集群與Redis Cluster 架構異同&#xff1a; redis單機內存不會超過10g&#xff0c;如果太大的話bgsave命令的話對單節點壓力過大。 節點多了&#xff0c;之間的通信也會非常緩慢。 redis集群模式下對從節點是沒有讀取操作的&#xff0c;只在主節點進行讀取操作。 哨…

使用 Node.js、Express 和 React 構建強大的 API

了解如何使用 Node.js、Express 和 React 創建一個強大且動態的 API。這個綜合指南將引導你從設置開發環境開始&#xff0c;到集成 React 前端&#xff0c;并利用 APIPost 進行高效的 API 測試。無論你是初學者還是經驗豐富的開發者&#xff0c;這篇文章都適合你。 今天&#…

智慧聲防:構筑海濱浴場安全屏障的應急廣播系

海濱浴場是夏季旅游的熱門目的地&#xff0c;但潮汐變化、離岸流、突發天氣、溺水事故等安全隱患時刻威脅著游客安全。傳統的安全管理依賴人工瞭望和喊話&#xff0c;存在覆蓋范圍有限、響應速度慢等問題。“智慧聲防”應急廣播系統&#xff0c;通過智能化、網絡化、多場景協同…

Redis之緩存穿透

Redis之緩存穿透 文章目錄 Redis之緩存穿透一、什么是緩存穿透&#xff1f;二、緩存穿透常見的解決方案1. 緩存空對象&#xff08;Null Caching&#xff09;2. 布隆過濾器&#xff08;Bloom Filter&#xff09;?3. 互斥鎖&#xff08;Mutex Lock&#xff09;?4. 接口層校驗5.…