今日初步認識與配置使用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: 寄存器所屬的章節或類別。
偏移量 縮寫 寄存器名稱 0h SCIGCRO 全局控制寄存器0 4h SCIGCR1 全局控制寄存器1 8h SCIGCR2 全局控制寄存器2 Ch SCISETINT 中斷使能寄存器 10h SCICLEARINT 中斷禁用寄存器 14h SCISETINTLVL 設置中斷級別寄存器 18h SCICLEARINTLVL 清除中斷級別寄存器 1Ch SCIFLR 標志寄存器 20h SCIINTVECTO 中斷向量偏移寄存器0 24h SCIINTVECT1 中斷向量偏移寄存器1 28h SCIFORMAT 長度控制寄存器 2Ch BRSR 波特率選擇寄存器 30h SCIED 仿真緩沖寄存器 34h SCIRD 接收數據緩沖寄存器 38h SCITD 發送數據緩沖寄存器 3Ch SCIPIOO 引腳控制寄存器0 44h SCIPIO2 引腳控制寄存器2 60h LINCOMP 比較寄存器 64h LINRDO 接收數據寄存器0 68h LINRD1 接收數據寄存器1 6Ch LINMASK 接受掩碼寄存器 70h LINID LIN ID寄存器 74h LINTDO 發送數據寄存器0 78h LINTD1 發送數據寄存器1 7Ch MBRSR 最大波特率選擇寄存器 90h IODFTCTRL IODFT for LIN EOh LIN_GLB_INT_EN LIN全局中斷使能寄存器 E4h LIN_GLB_INT_FLG LIN全局中斷標志寄存器 E8h LIN_GLB_INT_CLR LIN全局中斷清除寄存器
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位也被設置。你可以通過以下方式傳輸數據:
- 輪詢傳輸就緒標志
- 傳輸中斷
- 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標志。這些錯誤條件支持可配置的中斷功能。你可以通過以下方式接收數據:
- 輪詢接收就緒標志
- 接收中斷
- 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位也被設置。
你可以通過以下方式傳輸數據:
- 輪詢傳輸就緒標志
- 傳輸中斷
- 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時同時出現。你可以通過以下方式接收數據:
- 輪詢接收就緒標志
- 接收中斷
- DMA
在輪詢方法中,軟件可以輪詢RXRDY位,并在RXRDY位設置為高時從SCIRD寄存器讀取數據。選擇輪詢方法會導致CPU不必要的負載過大。為了避免這種情況,你可以使用中斷或DMA方法。要使用中斷方法,需要設置SETRXINT位。要使用DMA方法,必須設置SET_RX_DMA位。在RXRDY位被設置的那一刻,會立即生成中斷或DMA請求。
測試效果圖:
完整工程下載:
參考文章:
LIN通訊_lin通信-CSDN博客