99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

根據(jù)SCI輸入信號自動校準波特率

星星科技指導員 ? 來源:TI ? 作者:Terry Deng ? 2023-03-17 10:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文檔概述了一種基于 SCI/UART 輸入信號,可以自動校準本設備SCI/UART波特率的方法,該方法適用與所有第三代C2000芯片,比如F2807x/37x,F(xiàn)28004x,F(xiàn)28002x等等。

一 原理說明

假設有2塊電路板通過SCI進行通信?!癟ransmitter”向“Receiver”發(fā)送未知波特率的數(shù)據(jù),“ Receiver”則使用 eCAP 測量未知的波特率,然后修改其自身的波特率和“Transmitter”匹配。

下面款圖是一種情況,其中“Transmitter” 的波特率設置為 9889,而“Receiver”的初始波特率設置為 9601 ,相比之下“Receiver”的波特率為 -3% 偏差。 經(jīng)過算法的自動校準以后,“Receiver”將會把自身波特率校正為與“Transmitter”相同的9889。

pYYBAGQT0amARgUfAABA1BlJA4c667.png

下面框圖則是另一種情況,假如“Receiver”和“Transmitter”的初始波特率都是9889,但“Receiver”的內(nèi)部晶振INTOSC有-3%的偏差。使用上述完全相同的方法原理和步驟,“Receiver”波特率設置將會從9889校準成9601,這樣“Receiver”的波特率設置被自動校準抵消內(nèi)部晶振的偏差。在測量實際信號時,“Receiver”輸出到“Transmitter”的信號會是正確的 9889 波特率。

pYYBAGQT0aqAEj78AABV32CtimM689.png

二 Receiver 的校準代碼

1. 初始化

需要配置以下模塊來校準波特率:

時鐘:使用 INTOSC2 并選擇 100MHz 的 LSPCLK

#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT(20) |

SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) |

SYSCTL_PLL_ENABLE)

//

// Set up PLL control and clock dividers

//

SysCtl_setClock(DEVICE_SETCLOCK_CFG);

//

// Make sure the LSPCLK divider is set to the default (divide by 4)

//

SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_1);

SCI 模塊:通訊數(shù)據(jù)使用,發(fā)出校準以后的波形

// Initialize SCIA and its FIFO.

//

SCI_performSoftwareReset(SCIA_BASE);

//

// Configure SCIA for communications.

//

SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, TARGETBAUD, (SCI_CONFIG_WLEN_8 |

SCI_CONFIG_STOP_ONE |

SCI_CONFIG_PAR_NONE));

SCI_resetChannels(SCIA_BASE);

SCI_resetRxFIFO(SCIA_BASE);

SCI_resetTxFIFO(SCIA_BASE);

SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_TXFF | SCI_INT_RXFF);

SCI_enableFIFO(SCIA_BASE);

SCI_enableModule(SCIA_BASE);

SCI_performSoftwareReset(SCIA_BASE);

Xbar 輸入:將 GPIO28/SCI 內(nèi)部連接到 INPUTXBAR7 與 ECAP1 配合使用

//

// Configure GPIO 28 as eCAP input

//

XBAR_setInputPin(XBAR_INPUT7, 28);

ECAP 模塊:監(jiān)控接收到的 SCI 通信脈沖寬度

//

// Disable ,clear all capture flags and interrupts

//

ECAP_disableInterrupt(ECAP1_BASE,

(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |

ECAP_ISR_SOURCE_COUNTER_OVERFLOW |

ECAP_ISR_SOURCE_COUNTER_PERIOD |

ECAP_ISR_SOURCE_COUNTER_COMPARE));

ECAP_clearInterrupt(ECAP1_BASE,

(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |

ECAP_ISR_SOURCE_COUNTER_OVERFLOW |

ECAP_ISR_SOURCE_COUNTER_PERIOD |

ECAP_ISR_SOURCE_COUNTER_COMPARE));

//

2. 中斷

捕獲傳入 SCI 通信的脈沖寬度,每捕獲 4 次就中斷一次。 將這 4 個捕獲添加到陣列中。

__interrupt void ecap1ISR(void)

{

if(stopCaptures==0)

{

//

// Get the capture counts, interrupt every 4. Can be 1-bit or more wide.

// add one to account for partial eCAP counts at higher baud rates

// (e.g. count = 40, but if had higher resolution, this would be 40.5)

//

capCountArr[0] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);

capCountArr[1] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);

capCountArr[2] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);

capCountArr[3] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);

//

// Add samples to a buffer. Get average baud and tune INTOSC if buffer filled.

//

capCountIter = 0;

for (capCountIter=0; capCountIter<4; capCountIter++)

{

//

3. 主循環(huán)

捕獲陣列滿后,計算陣列的平均脈沖寬度 (也就是波特率),并更新SCI波特率寄存器,使其盡可能接近計算的平均值。

//

// Loop forever. Suspend or place breakpoints to observe the buffers.

//

for(;;)

{

//

// Array is filled, begin tuning

//

if(stopCaptures==1)

{

//

// Get an average baud rate from the array of samples

//

uint32_t avgBaud = getAverageBaud(samplesArr,NUMSAMPLES,TARGETBAUD);

//

// if the baud function returns the error code '0', then flag an error

//

if(avgBaud==0)

{

ESTOP0;

4. 平均脈沖寬度

對于許多應用的SCI 通信,傳輸?shù)臄?shù)據(jù) (例如 0xA5)是變化不固定的,因此SCI的高低電平脈沖寬度就是變化的。所以必須對樣本陣列進行如下的預處理,然后才能計算平均脈沖寬度。

a) 丟棄大于 10 位寬的脈沖寬度 (丟棄空閑時間)

b) 將 n 位值除以 n

c) 對修改后的樣本數(shù)組進行平均化

uint32_t getAverageBaud(volatile float arr[], int size, float targetBaudRate)

{

//

// clean up variable width array to single-bit-width array

//

uint16_t pass = arrTo1PulseWidth(arr, size, (float)DEVICE_SYSCLK_FREQ/targetBaudRate);

//

// pass only if enough good samples provided

//

if(pass == 0)

{

return 0;

}

//

// convert 2-bit width, 3-bit width, etc. to 1-bit width values by dividing, and average these values.

// skip unrelated values

//

float averageBitWidth = computeAvgWidth(arr, size);

以下是平均脈寬計算的原理和代碼流程圖

pYYBAGQT0aqAAUOBAABId9BaVcc503.png

poYBAGQT0ayAPcWQAAA6HkSAzxQ287.png

三 結果

按照以下設置進行測試,結果詳見表格,校準以后的誤差從3% 改善為0.1%左右甚至更小。

“Transmitter”設置為正確的波特率 (我們嘗試匹配的波特率)

“Receiver”設置為錯誤波特率 (-3% 或 +3%)

“Receiver”運行校準程序以匹配“Transmitter”

100K 波特率 9601波特率
-3% +3% -3% +3%
Transmitter
(我們正在嘗試匹配的內(nèi)容)
理想波特率
(僅供參考)
103306 96899 9889 9314.
實際波特率
(必須與此匹配)
104174. 96906 9890 9315.
Receiver
(初始錯誤波特率)
波特率
(校準前)
100154. 100157. 9622. 9622.
出錯百分比
(校準前)
-3.859% 3.355% -2.706% 3.296%
Receiver
(校準后波特率)
波特率
(校準后)
104336. 97047. 9888 9314.
出錯百分比
(校準后)
0.156% 0.146% -0.016% -0.012%

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

    關注

    31

    文章

    5434

    瀏覽量

    124439
  • 電路板
    +關注

    關注

    140

    文章

    5131

    瀏覽量

    102595
  • uart
    +關注

    關注

    22

    文章

    1276

    瀏覽量

    103914
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    can波特率計算

    can波特率其實并不難計算,這里給出了can波特率的簡單計算,并給出了實例STM32的CAN波特率計算。講解CAN波特率計算原理。
    發(fā)表于 12-14 17:02 ?1.3w次閱讀
    can<b class='flag-5'>波特率</b>計算

    什么是串口波特率?串口波特率的分類及應用詳解

    直接影響到通信的質量和效率。本文將介紹串口波特率的分類、選擇以及應用。串口波特率的分類根據(jù)不同的應用需求,串口波特率包括以下幾種:標準波特率
    的頭像 發(fā)表于 08-08 10:09 ?7038次閱讀
    什么是串口<b class='flag-5'>波特率</b>?串口<b class='flag-5'>波特率</b>的分類及應用詳解

    基于SCI/UART輸入信號自動校準波特率

    本文檔概述了一種基于 SCI/UART 輸入信號,可以自動校準本設備SCI/UART
    發(fā)表于 11-04 07:16

    C Core芯片SCI串口波特率容限優(yōu)化

    發(fā)現(xiàn)了C*Core國芯芯片中SCI發(fā)送與接受方波特率誤差導致數(shù)據(jù)不匹配問題,分析了發(fā)送與接受方數(shù)據(jù)傳輸丟幀、誤幀現(xiàn)象出現(xiàn)的根本原因,總結了SCI容限值與芯片主頻及標準波特率之間規(guī)
    發(fā)表于 03-05 17:45 ?17次下載
    C Core芯片<b class='flag-5'>SCI</b>串口<b class='flag-5'>波特率</b>容限優(yōu)化

    在dsPIC30F器件上實現(xiàn)自動波特率檢測的詳細中文資料概述

    目前所有 dsPIC30F 器件都擁有一個具備自動波特率檢測能力的 UART 外設。UART 接收引腳(RX 引腳)上的信號能在內(nèi)部傳送至一個輸入捕捉模塊以獲得輸入
    發(fā)表于 06-29 10:25 ?6次下載
    在dsPIC30F器件上實現(xiàn)<b class='flag-5'>自動波特率</b>檢測的詳細中文資料概述

    在dsPIC30F器件上實現(xiàn)自動波特率檢測

    目前所有 dsPIC30F 器件都擁有一個具備自動波特率檢測能力的 UART 外設。UART 接收引腳(RX 引腳)上的信號能在內(nèi)部傳送至一個輸入捕捉模塊以獲得輸入
    發(fā)表于 05-11 10:34 ?10次下載

    根據(jù)SCI輸入信號自動校準波特率

    作者:Terry Deng 本文檔概述了一種基于 SCI/UART 輸入信號,可以自動校準本設備S
    的頭像 發(fā)表于 01-12 13:56 ?2982次閱讀
    <b class='flag-5'>根據(jù)</b><b class='flag-5'>SCI</b><b class='flag-5'>輸入</b><b class='flag-5'>信號</b><b class='flag-5'>自動</b><b class='flag-5'>校準</b><b class='flag-5'>波特率</b>

    SCI串口自動波特率介紹

    自中科昊芯推出專題講解SCI串口通信以來,第一期主要講解SCI串口FIFO通信原理,本期主要講解SCI串口自動波特率,F(xiàn)IFO中斷通信邏輯將在下期內(nèi)容中講解。
    的頭像 發(fā)表于 04-26 09:26 ?3674次閱讀
    <b class='flag-5'>SCI</b>串口<b class='flag-5'>自動波特率</b>介紹

    根據(jù) SCI 輸入信號自動校準波特率

    根據(jù) SCI 輸入信號自動校準波特率
    發(fā)表于 10-28 12:00 ?0次下載
    <b class='flag-5'>根據(jù)</b> <b class='flag-5'>SCI</b> <b class='flag-5'>輸入</b><b class='flag-5'>信號</b><b class='flag-5'>自動</b><b class='flag-5'>校準</b><b class='flag-5'>波特率</b>

    STM32的USART自動波特率檢測

    當在兩個設備之間建立通信鏈路時,自動波特率檢測十分有用,因為從設備能夠檢測到主控制器的波特率并進行相應的自我調(diào)整。這需要使用一種自動機制來確定波特率。
    的頭像 發(fā)表于 11-28 11:15 ?9781次閱讀

    芯教程丨平頭哥助力中科昊芯HX2000系列芯片專題SCI串口通信(二)AutoBaud自動波特率

    自中科昊芯推出專題講解SCI串口通信以來,第一期主要講解SCI串口FIFO通信原理,本期主要講解SCI串口自動波特率,F(xiàn)IFO中斷通信邏輯將在下期內(nèi)容中講解。HX2000系列
    的頭像 發(fā)表于 04-27 14:48 ?1312次閱讀
    芯教程丨平頭哥助力中科昊芯HX2000系列芯片專題<b class='flag-5'>SCI</b>串口通信(二)AutoBaud<b class='flag-5'>自動波特率</b>

    什么是波特率?為什么要設置波特率?

    歡迎來到東用知識小課堂!一、什么是波特率波特率(BaudRate)單位bps是用于衡量串口通信速度的單位,它表示每秒鐘發(fā)送的比特數(shù)。如果一個串口的波特率為9600,就表示該串口在一秒鐘內(nèi)可以發(fā)送
    的頭像 發(fā)表于 04-08 00:00 ?8009次閱讀
    什么是<b class='flag-5'>波特率</b>?為什么要設置<b class='flag-5'>波特率</b>?

    什么是波特率?波特率是如何影響CAN總線長度的?

    信息在通信通道中傳輸?shù)乃俾时环Q為波特率。通俗地說,波特率是數(shù)據(jù)在網(wǎng)絡上傳輸?shù)乃俣?速率。這是以比特/秒表示的。因此,一秒鐘內(nèi)在通信網(wǎng)絡上傳輸?shù)谋忍財?shù)就是波特率
    的頭像 發(fā)表于 08-14 15:23 ?8083次閱讀
    什么是<b class='flag-5'>波特率</b>?<b class='flag-5'>波特率</b>是如何影響CAN總線長度的?

    波特率的定義和計算方法 波特率與數(shù)據(jù)傳輸速度的關系

    波特率的定義 波特率(Baud Rate),又稱調(diào)制速率或傳符號,是指每秒傳輸?shù)姆枖?shù)目,單位為波特(Bd)。它是一個數(shù)字信號通信中重要的
    的頭像 發(fā)表于 11-22 09:49 ?9140次閱讀

    波特率與串行通信的關系 各種設備波特率轉換的方法

    波特率(Baud Rate)是串行通信中的一個重要參數(shù),它指的是信號傳輸?shù)乃俾剩磫挝粫r間內(nèi)傳輸?shù)姆枺ɑ?b class='flag-5'>信號狀態(tài))的數(shù)量。在串行通信中,波特率決定了數(shù)據(jù)傳輸?shù)乃俣?,因此對于通信效率?/div>
    的頭像 發(fā)表于 11-22 10:01 ?1652次閱讀