欧美日韩亚州综合,国产一区二区三区影视,欧美三级三级三级爽爽爽,久久中文字幕av一区二区不卡

你的位置:首頁 > 互連技術 > 正文

根據 SCI 輸入信號自動校準波特率

發布時間:2021-08-10 來源:Terry Deng 責任編輯:wenwei

【導讀】本文檔概述了一種基于 SCI/UART 輸入信號,可以自動校準本設備SCI/UART波特率的方法,該方法適用與所有第三代C2000芯片,比如F2807x/37x,F28004x,F28002x等等。
 
一 原理說明
 
假設有2塊電路板通過SCI進行通信。“Transmitter”向“Receiver”發送未知波特率的數據,“ Receiver”則使用 eCAP 測量未知的波特率,然后修改其自身的波特率和“Transmitter”匹配。
 
下面款圖是一種情況,其中“Transmitter” 的波特率設置為 9889,而“Receiver”的初始波特率設置為 9601 ,相比之下“Receiver”的波特率為 -3% 偏差。 經過算法的自動校準以后,“Receiver”將會把自身波特率校正為與“Transmitter”相同的9889。
 
根據 SCI 輸入信號自動校準波特率
 
下面框圖則是另一種情況,假如“Receiver”和“Transmitter”的初始波特率都是9889,但“Receiver”的內部晶振INTOSC有-3%的偏差。使用上述完全相同的方法原理和步驟,“Receiver”波特率設置將會從9889校準成9601,這樣“Receiver”的波特率設置被自動校準抵消內部晶振的偏差。在測量實際信號時,“Receiver”輸出到“Transmitter”的信號會是正確的 9889 波特率。
 
根據 SCI 輸入信號自動校準波特率
 
二 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 模塊:通訊數據使用,發出校準以后的波形
 
    // 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 內部連接到 INPUTXBAR7 與 ECAP1 配合使用
 
//
    // Configure GPIO 28 as eCAP input
    //
    XBAR_setInputPin(XBAR_INPUT7, 28);
 
●    ECAP 模塊:監控接收到的 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<NUMSAMPLES)
            {
                samplesArr[samplesArrIter] = capCountArr[capCountIter];
                samplesArrIter++;
            }
 
            //
            // else, all samples were received, break to begin tuning
            //
            else
            {
                stopCaptures=1;
                break;
            }
        }
    }
 
    //
    // Clear interrupt flags for more interrupts.
    //
    ECAP_clearInterrupt(ECAP1_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
    ECAP_clearGlobalInterrupt(ECAP1_BASE);
 
    //
    // Start eCAP
    //
    ECAP_reArm(ECAP1_BASE);
 
    //
    // Acknowledge the group interrupt for more interrupts.
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
}
 
3. 主循環
 
捕獲陣列滿后,計算陣列的平均脈沖寬度 (也就是波特率),并更新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?";
            //    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. 平均脈沖寬度
 
對于許多應用的SCI 通信,傳輸的數據 (例如 0xA5)是變化不固定的,因此SCI的高低電平脈沖寬度就是變化的。所以必須對樣本陣列進行如下的預處理,然后才能計算平均脈沖寬度。
 
a) 丟棄大于 10 位寬的脈沖寬度 (丟棄空閑時間)
 
b) 將 n 位值除以 n
 
c) 對修改后的樣本數組進行平均化
 
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);
}
 
以下是平均脈寬計算的原理和代碼流程圖
 
根據 SCI 輸入信號自動校準波特率
根據 SCI 輸入信號自動校準波特率
 
三 結果
 
按照以下設置進行測試,結果詳見表格,校準以后的誤差從3% 改善為0.1%左右甚至更小。
 
1. “Transmitter”設置為正確的波特率 (我們嘗試匹配的波特率)
2. “Receiver”設置為錯誤波特率 (-3% 或 +3%)
3. “Receiver”運行校準程序以匹配“Transmitter”
 
根據 SCI 輸入信號自動校準波特率
 
 
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理。
 
推薦閱讀:
 
助力高速光模塊市場,提供高集成度,更小封裝電源的解決方案
二極管仿真模式在同步BUCK里面的應用
基于UCC25800-Q1開環LLC驅動器的隔離電源方案設計
充電芯片BQ25601應用中的若干問題
AI視覺芯片研發及基礎算力平臺公司愛芯科技完成A+輪融資
特別推薦
技術文章更多>>
技術白皮書下載更多>>
熱門搜索
?

關閉

?

關閉

欧美日韩亚州综合,国产一区二区三区影视,欧美三级三级三级爽爽爽,久久中文字幕av一区二区不卡
一区二区在线观看免费| 欧美一区二区三区喷汁尤物| 免费在线观看视频一区| 视频在线观看91| 日韩专区欧美专区| 天天色天天操综合| 日韩精品一二三四| 亚洲va在线va天堂| 日本视频在线一区| 奇米色777欧美一区二区| 乱中年女人伦av一区二区| 蜜臀va亚洲va欧美va天堂 | 91麻豆精品国产91久久久| 91精品国产综合久久精品app| 欧美日韩黄色影视| 6080日韩午夜伦伦午夜伦| 日韩欧美一卡二卡| 久久久久久99精品| 国产精品久久久久久久裸模| 亚洲欧美激情一区二区| 视频一区二区中文字幕| 久久国产生活片100| 粉嫩蜜臀av国产精品网站| 91在线视频免费91| 欧美男人的天堂一二区| 2023国产精品自拍| 亚洲视频一区二区在线| 五月婷婷另类国产| 国产69精品久久久久毛片| 91久久国产综合久久| 精品少妇一区二区三区免费观看| 国产无遮挡一区二区三区毛片日本| 国产精品情趣视频| 天天综合天天做天天综合| 丰满亚洲少妇av| 欧美日韩精品一区二区三区| 久久久.com| 亚洲一级在线观看| 国产成人在线色| 欧美精品丝袜中出| 国产精品乱人伦中文| 免费看黄色91| 欧美性感一区二区三区| 国产午夜亚洲精品不卡| 日韩精品乱码av一区二区| 成人影视亚洲图片在线| 69堂精品视频| 亚洲亚洲人成综合网络| 成人毛片老司机大片| 精品久久人人做人人爰| 亚洲一区二区三区视频在线播放 | 日韩av网站在线观看| 成人午夜av影视| 欧美成人精品3d动漫h| 亚洲午夜免费福利视频| 91在线精品一区二区| 久久久91精品国产一区二区精品| 肉色丝袜一区二区| 在线国产电影不卡| 中文字幕一区二区三区在线观看| 激情综合网av| 欧美mv日韩mv亚洲| 蜜桃精品视频在线观看| 欧美一卡二卡在线| 日韩精品电影在线| 欧美日韩国产另类一区| 亚洲一二三专区| 欧美综合天天夜夜久久| 亚洲欧美国产三级| 色哟哟一区二区在线观看| 国产精品成人在线观看| 成人午夜电影小说| 国产精品嫩草影院com| 国产精品亚洲成人| 国产欧美视频一区二区| 成人综合激情网| 中文字幕av一区二区三区高| 波多野结衣亚洲| 亚洲色图清纯唯美| 欧美三级视频在线观看| 午夜国产不卡在线观看视频| 欧美片网站yy| 久久精品国产77777蜜臀| 久久综合九色综合欧美98| 国产精品18久久久| 国产精品国产自产拍在线| 色噜噜夜夜夜综合网| 调教+趴+乳夹+国产+精品| 日韩欧美一二区| 国产成人av福利| 夜夜亚洲天天久久| 欧美酷刑日本凌虐凌虐| 久久99久久久久| 国产精品美女www爽爽爽| 色偷偷久久人人79超碰人人澡| 亚洲在线观看免费视频| 欧美一级国产精品| 国产美女一区二区| 亚洲综合激情网| 精品剧情v国产在线观看在线| 国产精品18久久久久久vr| 亚洲视频综合在线| 日韩一级二级三级精品视频| 国产成人夜色高潮福利影视| 亚洲色图欧洲色图| 欧美精品一区二区三区一线天视频 | 日韩你懂的在线播放| 成人午夜免费视频| 日韩高清在线不卡| 国产精品动漫网站| 欧美成va人片在线观看| www.日韩大片| 国产一区二区三区四区五区美女 | 亚洲国产精品一区二区www在线 | 国产日本欧美一区二区| 97久久超碰精品国产| 蜜桃视频一区二区| 18成人在线观看| 亚洲精品一区二区三区香蕉| 日本乱码高清不卡字幕| 精东粉嫩av免费一区二区三区 | 正在播放一区二区| 国产.欧美.日韩| 日本欧美久久久久免费播放网| 亚洲三级在线播放| 久久精品一区二区三区av| 678五月天丁香亚洲综合网| 99精品偷自拍| 国产成人在线电影| 极品少妇一区二区| 日本伊人色综合网| 亚洲电影在线播放| 亚洲一区二区三区不卡国产欧美| 中文幕一区二区三区久久蜜桃| 日韩欧美一级特黄在线播放| 欧美日韩在线精品一区二区三区激情| 高清不卡一区二区在线| 国模冰冰炮一区二区| 看片的网站亚洲| 蜜臀精品久久久久久蜜臀| 日本aⅴ亚洲精品中文乱码| 午夜精品免费在线| 亚洲一二三四区不卡| 亚洲综合久久久久| 亚洲午夜激情网页| 亚洲一区二区三区爽爽爽爽爽| 亚洲视频电影在线| 亚洲老妇xxxxxx| 亚洲福利一区二区三区| 亚洲综合视频在线| 首页国产丝袜综合| 另类的小说在线视频另类成人小视频在线 | 欧美激情一二三区| 国产欧美一区二区精品秋霞影院 | 国产精品成人免费| 中文字幕一区二区三区蜜月| 亚洲精品日韩综合观看成人91| 欧美韩国日本一区| 亚洲色图一区二区| 亚洲成人午夜影院| 久久er99热精品一区二区| 国产乱码一区二区三区| 成人久久久精品乱码一区二区三区| 成年人国产精品| 欧美午夜一区二区三区 | 91丝袜国产在线播放| 色综合久久久久久久久| 欧洲激情一区二区| 欧美一区二区三区喷汁尤物| 欧美电视剧免费全集观看| 国产精品沙发午睡系列990531| 亚洲情趣在线观看| 日本不卡不码高清免费观看| 国产一区二区三区最好精华液| 波多野结衣欧美| 在线播放日韩导航| 国产人久久人人人人爽| 亚洲激情自拍视频| 国产一区欧美二区| 色欧美片视频在线观看 | 99久久婷婷国产综合精品电影 | 麻豆一区二区三区| 成人精品视频网站| 91精品午夜视频| 国产精品久久久久久久久图文区| 亚洲一区欧美一区| 国产精品中文欧美| 欧美日产在线观看| 国产精品初高中害羞小美女文| 婷婷久久综合九色综合伊人色| 成人一级视频在线观看| 欧美久久久久免费| 亚洲三级电影全部在线观看高清| 美日韩黄色大片| 色妞www精品视频| 日本一区二区三区四区 | 亚洲国产你懂的| a亚洲天堂av| 久久综合色综合88| 日韩影视精彩在线|