色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

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

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2022-01-12 13:56 ? 次閱讀

作者:Terry Deng

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

一 原理說明

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

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

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

二 Receiver 的校準(zhǔn)代碼

1. 初始化

需要配置以下模塊來校準(zhǔn)波特率:

  • 時鐘:使用 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ā)出校準(zhǔn)以后的波形

    // 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));

    //
    // Disable CAP1-CAP4 register loads
    //
    ECAP_disableTimeStampCapture(ECAP1_BASE);

    //
    // Configure eCAP
    //    Enable capture mode.
    //    One shot mode, stop capture at event 4.
    //    Set polarity of the events to rising, falling, rising, falling edge.
    //    Set capture in time difference mode.
    //    Select input from XBAR7.
    //    Enable eCAP module.
    //    Enable interrupt.
    //
    ECAP_stopCounter(ECAP1_BASE);
    ECAP_enableCaptureMode(ECAP1_BASE);
    ECAP_setCaptureMode(ECAP1_BASE, ECAP_ONE_SHOT_CAPTURE_MODE, ECAP_EVENT_4);

    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_1, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_2, ECAP_EVNT_RISING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_3, ECAP_EVNT_FALLING_EDGE);
    ECAP_setEventPolarity(ECAP1_BASE, ECAP_EVENT_4, ECAP_EVNT_RISING_EDGE);

    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_1);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_2);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_3);
    ECAP_enableCounterResetOnEvent(ECAP1_BASE, ECAP_EVENT_4);

    ECAP_selectECAPInput(ECAP1_BASE, ECAP_INPUT_INPUTXBAR7);

    ECAP_enableLoadCounter(ECAP1_BASE);
    ECAP_setSyncOutMode(ECAP1_BASE, ECAP_SYNC_OUT_DISABLED);
    ECAP_startCounter(ECAP1_BASE);
    ECAP_enableTimeStampCapture(ECAP1_BASE);
    ECAP_reArm(ECAP1_BASE);

    ECAP_enableInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);

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++)
        {
            //
            // if we still have samples left to capture, add it to the samples array
            //
            if(samplesArrIter

捕獲陣列滿后,計算陣列的平均脈沖寬度 (也就是波特率),并更新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;
            }

            //
            // Update the device's baud rate to match the measured baud rate
            //
            SCI_setBaud(SCIA_BASE, DEVICE_LSPCLK_FREQ, avgBaud);

            //
            // (OPTIONAL) Continuously send data to SCITX once tuning
            // is complete for external observation (by logic analyzer or scope)
            //
            //unsigned char *msg;
            //while(1)
            //{
            //    msg = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\0";
            //    SCI_writeCharArray(SCIA_BASE, (uint16_t*)msg, 91);
            //}

            //
            // Wait for user to view the results in "Expressions" window
            //
            ESTOP0;

            //
            // If continuing, reset the array iterator and unlock the ISR for new captures
            //
            samplesArrIter=0;
            stopCaptures=0;
        }
}

4. 平均脈沖寬度

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

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

b) 將 n 位值除以 n

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

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);

    //
    // get the rounded baud rate from the average number of clocks and the sysclk frequency
    //
    return (uint32_t)(((float)DEVICE_SYSCLK_FREQ/(float)averageBitWidth)+0.5);
}

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

)>

poYBAGGKRRaAJv7wAABId9BaVcc607.png

pYYBAGGKRRiAVuqrAAA6HkSAzxQ298.png

三 結(jié)果

按照以下設(shè)置進(jìn)行測試,結(jié)果詳見表格,校準(zhǔn)以后的誤差從3% 改善為0.1%左右甚至更小。

  1. “Transmitter”設(shè)置為正確的波特率 (我們嘗試匹配的波特率)
  2. “Receiver”設(shè)置為錯誤波特率 (-3% +3%)
  3. “Receiver”運行校準(zhǔn)程序以匹配“Transmitter

100K 波特

9601波特率

-3%

+3%

-3%

+3%

Transmitter

(我們正在嘗試匹配的內(nèi)容)

理想波特率

(僅供參考)

103306

96899

9889

9314.

實際波特率

(必須與此匹配)

104174.

96906

9890

9315.

Receiver

(初始錯誤波特率)

波特率

(校準(zhǔn)前)

100154.

100157.

9622.

9622.

出錯百分比

(校準(zhǔn)前)

-3.859%

3.355%

-2.706%

3.296%

Receiver

(校準(zhǔn)后波特率)

波特率

(校準(zhǔn)后)

104336.

97047.

9888

9314.

出錯百分比

(校準(zhǔn)后)

0.156%

0.146%

-0.016%

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

    關(guān)注

    0

    文章

    341

    瀏覽量

    10013
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1237

    瀏覽量

    101420
  • SCI
    SCI
    +關(guān)注

    關(guān)注

    1

    文章

    56

    瀏覽量

    20128
收藏 人收藏

    評論

    相關(guān)推薦

    RS232通信的波特率設(shè)置說明

    RS232通信中,波特率的選擇需要根據(jù)設(shè)備的通信能力和通信距離來確定。 二、波特率的設(shè)置范圍 RS232通信的波特率可以設(shè)置多種不同的速率,常見的
    的頭像 發(fā)表于 12-10 16:26 ?778次閱讀

    波特率設(shè)置中的常見問題解析

    在數(shù)字通信系統(tǒng)中,波特率是一個關(guān)鍵參數(shù),它直接影響數(shù)據(jù)傳輸?shù)男屎涂煽啃浴H欢趯嶋H應(yīng)用中,波特率的設(shè)置往往會引起一些常見的問題。 一、波特率與數(shù)據(jù)速率的混淆 問題描述: 許多人會將波特率
    的頭像 發(fā)表于 11-22 10:06 ?382次閱讀

    波特率與串行通信的關(guān)系 各種設(shè)備波特率轉(zhuǎn)換的方法

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

    常見的波特率標(biāo)準(zhǔn)和協(xié)議

    波特率是指在數(shù)據(jù)通信中,每秒鐘傳輸?shù)姆枖?shù)(或比特數(shù)),是衡量數(shù)據(jù)通信速度的重要指標(biāo)。在不同的通信協(xié)議和場景中,常見的波特率標(biāo)準(zhǔn)和協(xié)議有所不同。以下是一些常見的波特率標(biāo)準(zhǔn)和協(xié)議: 一、串口通信
    的頭像 發(fā)表于 11-22 09:56 ?1431次閱讀

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

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

    MCU串口自動識別波特率原理分析

    現(xiàn)在的單片機資源越來越豐富了,其中我們常用的串口也是內(nèi)部集成了多個,關(guān)鍵功能也越來越強了。 我們有些應(yīng)用可能會用到串口自動識別波特率,今天就來講講MCU串口自動識別波特率底層的常見的原
    的頭像 發(fā)表于 10-23 16:12 ?599次閱讀
    MCU串口<b class='flag-5'>自動</b>識別<b class='flag-5'>波特率</b>原理分析

    波特率9600和115200的區(qū)別

    限性。 1. 波特率的定義與計算 波特率,或稱為波特,是衡量數(shù)據(jù)傳輸速率的單位,它表示每秒鐘傳輸?shù)?b class='flag-5'>信號單元數(shù)。在串行通信中,一個信號單元可以
    的頭像 發(fā)表于 10-18 14:56 ?1651次閱讀

    波特率與比特有何關(guān)系 波特率與數(shù)據(jù)傳輸速率的關(guān)系

    波特率(Baud Rate)和比特(Bit Rate)是衡量數(shù)據(jù)通信系統(tǒng)性能的兩個重要參數(shù),它們之間有著密切的關(guān)系,但并不完全相同。 波特率(Baud Rate): 波特率是指在數(shù)據(jù)
    的頭像 發(fā)表于 10-18 14:55 ?892次閱讀

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    UART(Universal Asynchronous Receiver/Transmitter)是一種廣泛使用的異步串行通信技術(shù),它允許兩臺設(shè)備之間進(jìn)行雙向數(shù)據(jù)傳輸。在UART通信中,波特率和傳輸
    的頭像 發(fā)表于 10-06 16:12 ?2823次閱讀
    uart<b class='flag-5'>波特率</b>和傳輸頻率的關(guān)系 UART串口的常用<b class='flag-5'>波特率</b>為多少

    485自動收發(fā)電路的波特率是多少

    485自動收發(fā)電路的波特率并不是一個固定的值,而是可以根據(jù)具體的應(yīng)用需求和電路設(shè)計進(jìn)行調(diào)整的。在實際應(yīng)用中,波特率的設(shè)置會受到多種因素的影響,包括傳輸距離、
    的頭像 發(fā)表于 07-13 09:41 ?2641次閱讀

    如何使用示波器測量串口波特率

    在通信和電子測量領(lǐng)域,串口波特率是一個至關(guān)重要的參數(shù),它決定了數(shù)據(jù)在串行通信線上的傳輸速率。使用示波器來測量串口波特率是一種常見且有效的方法,尤其是在沒有專業(yè)串口調(diào)試工具或需要更精確測量時。本文將
    的頭像 發(fā)表于 05-27 16:25 ?5061次閱讀

    波特率有什么危害尼?又該如何避免?

    深入探討了波特率過高可能帶來的危害,并提供了一些實用建議來保護(hù)設(shè)備不受影響。在通信領(lǐng)域,波特率是決定數(shù)據(jù)傳輸速度的重要參數(shù)。然而,波特率設(shè)置不當(dāng)可能會對設(shè)備造成嚴(yán)重的影響。本文旨在揭示波特率
    的頭像 發(fā)表于 04-03 16:45 ?1408次閱讀

    為啥要轉(zhuǎn)換波特率 波特率和傳輸速率的關(guān)系

    對于串行多主 CAN 總線,如果波特率被稱為“500000波特”,則 CAN 上的該端口每秒最多可傳輸500000位。
    的頭像 發(fā)表于 03-06 17:38 ?5125次閱讀
    為啥要轉(zhuǎn)換<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和傳輸速率的關(guān)系

    波特率發(fā)生器使用哪個定時器 波特率發(fā)生器的時鐘來源是什么

    波特率發(fā)生器是一種用于控制串行數(shù)據(jù)通信速率的設(shè)備,它可以生成特定波特率的時鐘信號。在嵌入式系統(tǒng)、通信設(shè)備和計算機硬件中,波特率發(fā)生器的使用十分常見。
    的頭像 發(fā)表于 01-24 09:56 ?2217次閱讀

    什么是串口波特率?串口通信為什么要設(shè)置波特率

    什么是串口波特率?串口通信為什么要設(shè)置波特率波特率與比特的關(guān)系 如何選擇串口波特率?? 串口波特率
    的頭像 發(fā)表于 01-22 16:10 ?2179次閱讀
    主站蜘蛛池模板: 亚洲精品成人AV在线观看爽翻 | 黑人巨茎vide抽搐| 草莓视频在线看免费高清观看 | 成人中文字幕在线| adc我们的永久网址| 97视频在线免费播放| 最新国产麻豆精品| 在线观看免费av网站| 又黄又肉到湿的爽文| 伊人网综合网| 伊人久久影院| 在线国产a不卡| 在线视频免费观看| 365电影成人亚洲网在线观看| 综合亚洲桃色第一影院| 在线免费视频国产| 55夜色66夜亚洲精品播放| 中文无码在线观| 91精品婷婷国产综合久久8| 91日本在线观看亚洲精品| 97国产在线播放| MD传媒MD0021在线观看| 别插我B嗯啊视频免费| 大迪克黑人异族| 国产精品JIZZ在线观看A片| 国产欧美一区二区三区在线看| 国产婷婷综合在线视频中文 | 午夜一级视频| 亚洲精品喷白浆在线观看| 亚洲专区区免费| 69日本xxⅹxxxxx18| 99热这里只有精品视频2| 草莓AV福利网站导航| 国产电影尺度| 狠狠色丁香婷婷久久综合五月 | 2021精品乱码多人收藏| 99成人在线| 国产91综合| 激情办公室| 内射少妇36P亚洲区| 手机在线免费观看毛片|