精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

如何根據UART傳輸協議將數據發送出去呢?

冬至子 ? 來源:兩猿社 ? 作者:IC猿 ? 2023-06-05 15:59 ? 次閱讀

00 簡介

和接收部分相反,UART發送數據部分是CPU將需要發送的數據寫到發送數據寄存器(TX_DATA),發送模塊進行數據的發送。由于系統時鐘速率一般會比UART發送數據快,所以發送數據將緩存到發送數據FIFO(TX_FIFO)。當TX_FIFO非空時,發送數據模塊會根據UART傳輸協議將數據發送出去,直到TX_FIFO為空。

類似的,發送模塊也涉及到ARM時鐘和26MHz功能時鐘。其中 發送FIFO讀寫邏輯是ARM時鐘域,發送數據狀態機和同步邏輯等是功能時鐘域 。

01 模塊接口與描述

1.jpg

2.jpg

02 實現

UART_TX模塊主要由三部分組成: 配置信息同步 、TX_FIFO讀控制部分發送狀態機 。

配置信息是reg_if模塊由APB總線配置寄存器產生,功能時鐘域做兩級同步處理。(比如校驗位使能、奇偶校驗控制、停止位使能等)

發送數據FIFO控制部分將FIFO中的數據讀出,通過發送數據狀態機將數據發送。

發送狀態機是根據串口協議劃分,分為IDLE、IRQ、START_BIT、TX_DATA、CHECK_BIT、STOP和DELAY六種狀態。

配置信息同步

和接收模塊類似,由于配置信息是由APB時鐘產生,到接收模塊的功能時鐘域需要做同步處理。配置信息是電平信號,通常不會像數據一樣變化快,所以只需要兩級同步。

接收狀態機

使用典型的三段式狀態機設計,狀態轉移圖如下:

圖片

uart發送狀態轉移圖

IDLE: 發送狀態機的IDLE狀態會產生tx_start的發送請求信號,FIFO讀邏輯部分會判斷讀空信號tx_fifo_rempty和tx_start,如果TX_FIFO非空且發送請求有效,則產生發送響應tx_ack,并發出FIFO讀使能。IDLE狀態機內發現tx_ack有效,跳轉到IRQ狀態。IRQ: IRQ狀態目的是等待FIFO數據讀出。進入IRQ后使能波特率時鐘,tx_start信號disable,跳轉到START_BIT。

START_BIT: 發送起始位。拉低utxd_o后跳轉到發送數據狀態TX_DATA。

TX_DATA: 發送從TX_FIFO讀出的8bit數據,發送完8bit數據后判斷校驗位是否使能(check_syn2),使能則進入CHECK_BIT,不使能則進入STOP狀態。

CHECK_BIT: 8bit數據按位異或(偶校驗)或同或(奇校驗),計算出校驗位發送,判斷是否使能停止位(stop_bit_syn2),如使能停止位則進入STOP狀態,不使能則進入DELAY狀態。

這里提一下 奇偶校驗

所謂奇校驗,就是判斷發送的數據位中1的個數是否是奇數,如果數據位中1的個數是偶數,那就給校驗位賦值1;如果數據位中1的個數是奇數,那就給校驗位賦值0。目的是確保發送的數據中1的個數是奇數。

偶校驗則相反,判斷發送的數據位中1的個數是否是偶數,如果數據位中1的個數是偶數,那就給校驗位賦值0;如果數據位中1的個數是奇數,那就給校驗位賦值1。目的是確保發送的數據中1的個數是偶數。

實現時,奇偶校驗可以用同或和異或操作計算,相同的8bit數奇偶校驗的值一定是相反的。

STOP: STOP狀態拉高utxd_o,然后進入DELAY狀態。

DELAY: DELAY狀態控制相鄰兩次發送之間的間隔,間隔時間以波特率時鐘為單位,受CPU控制(配置字two_tx_delay),默認delay兩個波特率時鐘周期。延時后回到IDLE狀態進行等待或下一Byte數據傳輸。

前兩段狀態機,狀態跳轉:

// state to nextstate with clk in this block.
always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        state <= IDLE;
    end
    elsebegin
        state <= nextstate;
    end
end

// nextstate transform
always@(*) begin
    case(state)
    IDLE: begin
        if(tx_ack_delay2) begin
            nextstate = IRQ;
        end
        elsebegin
            nextstate = IDLE;
        end
    end
    IRQ: begin
        if(tx_bpsclk) begin
            nextstate = START_BIT;
        end
        elsebegin
            nextstate = IRQ;
        end
    end
    START_BIT: begin
        if(tx_bpsclk) begin
            nextstate = TX_DATA;
        end
        elsebegin
            nextstate = START_BIT;
        end
    end
    TX_DATA: begin
        // send 8 bit data
        if(data_cnt < 4'd8) begin
            nextstate = TX_DATA;
        end
        elsebegin
            if(tx_bpsclk) begin
                if(check_syn2) begin
                    nextstate = CHECK_BIT;
                end
                elsebegin
                    nextstate = STOP;
                end
            end
            elsebegin
                nextstate = TX_DATA;
            end
        end
    end
    CHECK_BIT: begin
        if(tx_bpsclk) begin
            if(stop_bit_syn2) begin
                nextstate = STOP;
            end
            elsebegin
                nextstate = DELAY;
            end
        end
        elsebegin
            nextstate = CHECK_BIT;
        end
    end
    STOP: begin
        if(tx_bpsclk) begin
            nextstate = DELAY;
        end
        elsebegin
            nextstate = STOP;
        end
    end
    DELAY: begin
        if(baud_cnt < two_tx_delay_syn2) begin
            nextstate = DELAY;
        end
        elsebegin
            nextstate = IDLE;
        end
    end
    default: begin
        nextstate = IDLE;
    end
    endcase
end

第三段狀態機,信號賦值:

// output signal
always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        tx_bpsen <= 1'b0;
        tx_start <= 1'b0;
        utxd_o   <= 1'b1;
        data_cnt <= 4'd0;
        baud_cnt <= 4'd0;
    end
    elsebegin
        case(nextstate)
        IDLE: begin
            tx_start   <= 1'b1;
            baud_cnt   <= 4'd0;
            data_cnt   <= 4'd0;
        end
        IRQ: begin
            tx_bpsen   <= 1'b1;
            tx_start   <= 1'b0;
        end
        START_BIT: begin
            if(tx_bpsclk) begin
                utxd_o <= 1'b0;
            end
        end
        TX_DATA: begin
            if(tx_bpsclk) begin
                utxd_o   <= data_tx[data_cnt];
                data_cnt <= data_cnt + 1'b1;
            end
        end
        CHECK_BIT: begin
            if(tx_bpsclk) begin
                // odd check
                if(parity_syn2) begin
                    utxd_o <= ^data_tx;
                end
                // even check
                elsebegin
                    utxd_o <= ^~data_tx;
                end
            end
        end
        STOP: begin
            if(tx_bpsclk) begin
                utxd_o <= 1'b1;
            end
        end
        DELAY: begin
            if(tx_bpsclk) begin
                baud_cnt <= baud_cnt + 1'b1;
                utxd_o   <= 1'b1;    // the delay between twice send data is 1
            end
        end
        endcase
    end
end

接收數據FIFO控制

TX_FIFO使用同步FIFO設計,工作在APB時鐘域。

TX_FIFO的讀邏輯使用一段式狀態機產生。首先判斷FIFO是否為空,發送狀態機的發送請求tx_start是否有效。兩個信號都有效時將產生讀FIFO使能和發送數據響應,通知發送狀態機可以開始發送數據。

注意讀FIFO使能僅有效一個APB時鐘周期,待tx_start不使能時disable發送數據響應。等待一個狀態后狀態機回到初始態(等待一個狀態是為了確保發送狀態機已經進行跳轉,避免tx_ack和FIFO讀使能一直有效)。

// this state machine to receive data from RX FIFO
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        tx_ack       <= 1'b0;
        tx_fifo_rinc <= 1'b0;
        rdata_state  <= 2'b0;
    end
    elsebegin
        case(rdata_state)
        2'b00: begin
            if(!tx_fifo_rempty && tx_start_delay2) begin
                tx_ack       <= 1'b1;
                tx_fifo_rinc <= 1'b1;
                rdata_state  <= 2'b01;
            end
        end
        2'b01: begin
            tx_fifo_rinc <= 1'b0;
            if(!tx_start_delay2) begin
                tx_ack      <= 1'b0;
                rdata_state <= 2'b10;
            end
        end
        2'b10: begin
            rdata_state <= 2'b0;
        end
        endcase
    end
end

TX_FIFO寫邏輯放在reg_if模塊,APB寫TX_DATA寄存器時,產生寫使能信號,將寄存器數據放到TX_FIFO中。

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

    關注

    134

    文章

    9054

    瀏覽量

    366827
  • 寄存器
    +關注

    關注

    31

    文章

    5321

    瀏覽量

    120017
  • 有限狀態機
    +關注

    關注

    0

    文章

    52

    瀏覽量

    10316
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    5963
  • UART接口
    +關注

    關注

    0

    文章

    124

    瀏覽量

    15268
收藏 人收藏

    評論

    相關推薦

    如何算得的數據(10進制)轉換為16進制通過串口發送出?

    我用公式節點算得一組數據,好比是1212,1313,1414等,這些數據轉為16進制就是04BC,0521,0586,如何十進制的數據轉換為十六進制然后通過串口
    發表于 01-30 14:05

    程序是ADC采集的數據和串口接收的數據通過ble藍牙發送出去,請問為什么打開uart后找不到搜索藍牙?如何解決?

    我寫的程序是ADC采集的數據和串口接收的數據通過ble藍牙發送出去,不知道為什么,打開uart后,手機無法搜索藍牙,通過調試發現卡在0x0
    發表于 06-29 16:27

    請問用光敏實驗采集的數據,怎么樣通過WIFI發送出去

    比如用光敏實驗采集的數據,怎么樣通過WIFI發送出去?怎么樣通過WIFI用電腦控制開發板上面的LED燈,這類的問題,謝謝解答。
    發表于 06-03 21:35

    lwip中數據不能發送出去

    我現在在stm32上用lwip和上位機通訊,正常情況下數據每次能發送出去,并且lwip中tcp_output函數里 pcb->unacked == NULL的,但是當出現異常情況時,數據發送
    發表于 07-04 04:35

    請問特征值發送出去用什么函數?

    請問下,我想把特征值 里面的值發送出去需要用什么函數呢?還是說我只要用SimpleProfile_SetParameter()這個函數設置好要發的特征值就可以了,讓主機自己去讀呢?小白請教大家。謝謝。
    發表于 03-05 10:30

    CC2541的串口沒法發送出去

    你好,在使用CC2541時目前遇到一個很困惑的問題,我的程序希望通過串口發送,同樣的程序在開發板上運行能夠正常的收發,程序下載到我們自己的目標板上,就沒法發送出去了,跟蹤到
    發表于 03-18 08:32

    NRF24L01如何才能將所有數據發送出去呢?

    利用NRF24L01通信發送數據,資料說的是可以發送最長32個字節但是我只能發送16個字節,只能發送一半,后面的全部都為了0了,請問這是為什
    發表于 06-10 09:25

    DSP處理結果如何通過SCI發送出去

    在工程實際應用中需要將DSP處理結果通過SCI發送出去,但是所要傳輸數據是浮點float型,無法通過SCI發送,該如何處理?謝謝~
    發表于 07-23 06:27

    為什么文章無法提交 發送出去

    為什么文章無法提交 發送出去
    發表于 07-22 14:23

    一個浮點型的數通過串口發送出去 精選資料分享

    可能大家對發送字符串,整數,數組等待的沒有問題,也想的明白,可是對于浮點型的數,或許有些不知所措(大佬繞過,小白我是這樣)今天搞懂了,就記錄下!其實發送原理還是通過字符串的形式發送出去的。只不過
    發表于 08-18 07:14

    如何一個浮點型的數通過串口發送出去?

    如何一個浮點型的數通過串口發送出去?
    發表于 11-22 06:16

    如何printf()函數的數據用STM32的串口發送出去呢

    如何去使用C語言中的printf()函數呢?如何printf()函數的數據用STM32的串口發送出去呢
    發表于 12-01 07:58

    智能家居設備可能會將數據通過網絡發送出去 數據安全受到威脅

    你可能覺得你的智能家居設備只會與你進行溝通,然而事實并非如此,你的設備可能會將數據通過網絡發送出去,以便與服務器進行通信,甚至可能會發送到你不希望擁有這些數據的人手中?,F在,普林斯頓的
    發表于 04-19 08:48 ?643次閱讀

    Linux如何操作數據發送出去

    ? Linux 服務器收到網絡數據包,需要經過哪些處理,一步步數據傳給應用進程的呢?應用進程發送數據包時,Linux 又是如何操作
    的頭像 發表于 06-17 16:00 ?991次閱讀
    Linux如何操作<b class='flag-5'>將</b><b class='flag-5'>數據</b>包<b class='flag-5'>發送出去</b>

    stm32 HAL庫spi接收的同時為什么有數據發送出去

    stm32 HAL庫spi接收的同時為什么有數據發送出去? 在STM32 HAL庫中,SPI接口的數據收發是通過DMA傳輸完成的。因此,通過SPI接收
    的頭像 發表于 10-26 17:42 ?1695次閱讀