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

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

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

使用雙數(shù)據(jù)指針實現(xiàn)串行端口FIFO

星星科技指導員 ? 來源:ADI ? 作者:ADI ? 2023-02-21 16:06 ? 次閱讀

Dallas Semiconductor高速微控制器系列允許系統(tǒng)設計人員通過內(nèi)部UART優(yōu)化串行通信。本應用筆記演示了如何利用這些增強型8051微控制器中的雙數(shù)據(jù)指針使用循環(huán)緩沖器。提供的示例匯編代碼用于顯示簡單的 256 字節(jié)串行端口循環(huán)緩沖區(qū)的實現(xiàn)。

介紹

原始 8051 微處理器的架構包括一個標準的通用 同步/異步接收器/發(fā)射器(USART,通常稱為UART)。這 外設允許器件通過RS-232接口以各種波特率進行通信。其中之一 8051 UART實現(xiàn)的缺點是其接收和發(fā)送緩沖區(qū) 只有一個深度,即軟件必須從接收緩沖區(qū)中檢索一個字節(jié),然后才能被 下一個收到的字符??梢栽谠S多達拉斯半導體公司中實現(xiàn)快速軟件FIFO 和Maxim微控制器,增加了串行端口的實用性。

本應用筆記演示了一個簡單的256字節(jié)循環(huán)緩沖器,但原理可以擴展到 緩沖長度可達 64kB。數(shù)據(jù)由串行端口接收并存儲在緩沖區(qū)中,直到對其采取行動 通過用戶提供的例程。當緩沖區(qū)變滿時,接收器通過軟件流控制將 向主機發(fā)出停止傳輸?shù)?a target="_blank">信號。當用戶提供的例程清除緩沖區(qū)中的空間時,它將 向主機發(fā)出信號以恢復傳輸。本應用筆記中的示例足夠通用,可以 適用于各種用戶應用。示例隨附的匯編源代碼是 在網(wǎng)站上的文件AN603_SW中提供?;卮?51.

支持先進先出構建的硬件增強功能

高速和超高速微控制器系列具有許多功能,大大簡化了 軟件先進先出的實施。所有這些功能都旨在最大限度地減少軟件開銷 與存儲和檢索數(shù)據(jù)相關聯(lián)。其中第一個功能是極高速 達拉斯半導體和Maxim微控制器的性質(zhì)。他們增強的 4 時鐘和 1 時鐘 機器循環(huán)型芯最大限度地減少了維護緩沖區(qū)所花費的時間,并且通過擴展允許 應用程序運行得更快。

另一個重要功能是雙數(shù)據(jù)指針。最初的 8051 只有一個數(shù)據(jù)指針,它 使得同時實現(xiàn)輸入和輸出指針變得困難。每次系統(tǒng)需要 在指針之間切換,它必須保存當前值并加載另一個的值 指針。在嘗試將數(shù)據(jù)快速移入和移出緩沖區(qū)時,這會引入明顯的延遲。 使用兩個數(shù)據(jù)指針,一個可以分配給輸入(插入)指針,另一個分配給輸出 (刪除)緩沖區(qū)的指針,消除與處理指針相關的延遲。另外 一些微控制器集成了增強的數(shù)據(jù)指針,可以自動遞增數(shù)據(jù) 執(zhí)行某些數(shù)據(jù)指針相關指令后的指針。這節(jié)省了額外的機器 每個緩沖區(qū)訪問的周期。

通過使用內(nèi)部 1kB MOVX SRAM(其數(shù)據(jù)可用),可以進一步提高速度 可以在單個機器周期內(nèi)訪問。在此內(nèi)存中定位循環(huán)緩沖區(qū)允許 實現(xiàn)非??焖俚木彌_區(qū)。

軟件說明

此示例介紹串行端口的循環(huán) FIFO 緩沖區(qū)的基本體系結構。接收數(shù)據(jù) 通過串行端口 0 并存儲在 MOVX 存儲器中的循環(huán)緩沖區(qū)中,直到提取為止 并由用戶定義的算法操作。此示例使用達拉斯和 Maxim 微控制器 雙數(shù)據(jù)指針。DPTR(也稱為 DPTR0)用作輸入指針,并始終指定 應存儲通過串行端口接收的新信息的位置。DPTR1 是輸出指針, 顯示應用程序軟件將檢索下一個未處理字節(jié)的位置。伴隨的 軟件應該被認為是這樣一個例子的骨架。

做了一些假設來簡化軟件并減小其大?。?/p>

緩沖區(qū)長度為 256 字節(jié),從 0000h 開始,到 00FFh 結束。軟件可以快速檢查 表示非零數(shù)據(jù)指針高字節(jié),以指示翻轉(zhuǎn)。

輸入和輸出指針僅遞增,盡管軟件可以很容易地修改為 支持雙向指針。

收到字符后對緩沖區(qū)狀態(tài)的反饋限制為剩余 1 個字節(jié) 警告和 0 字節(jié)剩余關機方法。這種通過/不通過的方法允許非??斓腻e誤 檢查,可最大限度地減少緩沖區(qū)輸入和輸出例程中花費的時間。緩沖區(qū)狀態(tài) 從緩沖區(qū)讀取字符后,用戶提供的算法負責。

主機的錯誤通知通過軟件流控制執(zhí)行。這是一個常見的 傳輸協(xié)議易于實現(xiàn),占用的處理器開銷很小。

當程序啟動時,兩個數(shù)據(jù)指針都初始化到緩沖區(qū)的開頭。串口 也被初始化,然后軟件流控制“就緒”字符(XON:11h)被發(fā)送到 主機以允許傳輸數(shù)據(jù)。然后,軟件會等待,直到收到新字符或 應用程序需要從緩沖區(qū)讀取一個字節(jié)。此示例僅顯示例程的外殼,該 緩沖區(qū)中的字節(jié);實際代碼將由應用程序定義。

當串口收到字符時,調(diào)用串口0中斷服務例程(ISR)。第一 例程從串行端口檢索字節(jié),并存儲在緩沖區(qū)中由 輸入指針 (DPTR)。然后調(diào)用子例程Increment_DPTx,這將遞增所選數(shù)據(jù) 指針,然后執(zhí)行兩個操作。首先,它確保遞增的值不超過 緩沖區(qū)的上限。如果是這樣,它將指針值重置為緩沖區(qū)的開頭。二、它 檢查輸入指針是否有覆蓋輸出指針的危險,這種情況可能是 如果主機清空緩沖區(qū)的速度不夠快,則會遇到此問題。

溢出檢測和處理

溢出檢測和處理例程如圖 1 所示。它在輸入或 輸出指針遞增。首先,溢出例程確定輸入和 輸出指針。如果距離為一個字節(jié),則軟件會聲明溢出警告。這將設置 溢出標志,并且還向另一個單元發(fā)送XOFF以停止傳輸,直到緩沖區(qū) 再次清空。串行端口接收器保持啟用狀態(tài),以允許發(fā)送單元 在收到 XOFF 時的傳輸過程中。聲明警告狀態(tài)比 緩沖區(qū)已滿狀態(tài)允許接收這最后一個字符。

如果距離為零字節(jié),則軟件聲明溢出關閉。這將設置溢出標志, 傳輸 XOFF,并禁用串行端口接收器以防止 緩沖區(qū)。退出溢出警告或關閉狀態(tài)的唯一方法是讓緩沖區(qū)輸出例程 刪除數(shù)據(jù),直到距離增加到 2。

如果距離不是單個字節(jié)也不是零字節(jié),則未檢測到溢出。然后例程檢查 溢出標志的狀態(tài)。如果未設置該標志,則例程將退出。如果設置了溢出標志,則 當前狀態(tài)指示緩沖區(qū)剛剛從溢出警告狀態(tài)轉(zhuǎn)換為否 警告。如果是這種情況,則緩沖區(qū)已準備好再次開始接收數(shù)據(jù),因此例程將清除 溢出標志,重新啟用串行端口接收器,并傳輸 XON 字符。

pYYBAGP0e5-AO7q0AAAusCS5RV4257.gif?imgver=1

圖1.溢出處理程序流程圖。

程序集代碼示例

以下匯編語言代碼示例是使用 Keil 軟件編譯和模擬的 μVision2 集成開發(fā)環(huán)境。頭文件 reg320.inc 是一個包含名稱的文件 目標微控制器(本例中為DS80C320)的寄存器和位,以及類似的文件 通常會隨您的匯編程序一起提供,以便與正在使用的特定微控制器一起使用。

審核編輯:郭婷

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

    關注

    48

    文章

    7454

    瀏覽量

    150852
  • 接收器
    +關注

    關注

    14

    文章

    2454

    瀏覽量

    71751
  • fifo
    +關注

    關注

    3

    文章

    386

    瀏覽量

    43492
收藏 人收藏

    評論

    相關推薦

    基于FPGA的異步FIFO實現(xiàn)

    大家好,又到了每日學習的時間了,今天我們來聊一聊基于FPGA的異步FIFO實現(xiàn)。 一、FIFO簡介 FIFO是英文First In First Out 的縮寫,是一種先進先出的
    的頭像 發(fā)表于 06-21 11:15 ?6464次閱讀
    基于FPGA的異步<b class='flag-5'>FIFO</b>的<b class='flag-5'>實現(xiàn)</b>

    Keil C51中對雙數(shù)據(jù)指針的直接利用

    在8051體系中,數(shù)據(jù)指針DPTR作為一個特殊的16位寄存器,用于尋址64 KB的XDATA或CODE空間,通常它被當作一個16位指針,指向一個常數(shù)表。雙數(shù)據(jù)
    發(fā)表于 11-30 17:30

    異步FIFO指針同步產(chǎn)生的問題

    如圖所示的異步FIFO,個人覺得在讀寫時鐘同步時會產(chǎn)生兩個時鐘周期的延時,如果讀寫時鐘頻率相差不大,某一時刻讀寫指針相等,當寫指針同步到讀模塊時會產(chǎn)生延時,實際同步到讀模塊的寫指針是兩
    發(fā)表于 08-29 18:30

    如何使用串行端口發(fā)送和接收數(shù)據(jù)

    你好,我必須發(fā)送3個長TIPE可變形式的PLC到CY8C KIT01,我應該使用這個工具包的串行端口,但我沒有任何線索如何開始。我應該使用哪些組件來編程它來使用串行端口發(fā)送和接收
    發(fā)表于 04-09 12:06

    如何重置fifo指針

    它不會產(chǎn)生額外的SLWR信號。在傳輸開始時,F(xiàn)IFI重置FIFO,第一個字是不確定的。我不知道為什么。所以我認為如果我能重置FIFO指針,問題就可以解決了。那么有人知道如何重置FIFO
    發(fā)表于 04-24 14:06

    輕松上手單片機編程軟件——keil單片機編程軟件雙數(shù)據(jù)指針+二進制

    keil對雙數(shù)據(jù)指針的支持情況以及其代碼生成機制,并為大家介紹keil c51直接使用二進制的方法。在8051體系中,數(shù)據(jù)指針DPTR作為一個特殊的16位寄存器,用于尋址64 KB的X
    發(fā)表于 12-28 08:00

    如何通過一個簡單的INC AUXR1指令來回切換兩個數(shù)據(jù)指針?

    Keil C51對雙數(shù)據(jù)指針的支持情況Keil C中直接生成雙數(shù)據(jù)指針的代碼
    發(fā)表于 04-26 06:11

    串行端口工作原理

    串行端口工作原理 串行端口工作原理 9針連
    發(fā)表于 07-24 00:21 ?1864次閱讀

    Keil C51中對雙數(shù)據(jù)指針的支持情況及代碼生成

    在8051體系中,數(shù)據(jù)指針DPTR作為一個特殊的16位寄存器,用于尋址64 KB的XDATA或CODE空間,通常它被當作一個16位指針,指向一個常數(shù)表。雙數(shù)據(jù)
    發(fā)表于 07-20 17:36 ?1382次閱讀
    Keil C51中對<b class='flag-5'>雙數(shù)據(jù)</b><b class='flag-5'>指針</b>的支持情況及代碼生成

    使用mxtni的串行端口

    外部串行端口 在使用外部串行端口之前,必須添加必要的硬件。外部串行端口包括五個模塊:DUART、
    發(fā)表于 04-12 11:08 ?6次下載
    使用mxtni的<b class='flag-5'>串行</b><b class='flag-5'>端口</b>

    FPGA的FIFO實現(xiàn)過程

    FIFO隊列有兩個位置指示指針。一個是寫指針,指向隊列的第一個存儲單元。一個讀指針,指向隊列的最后一個存儲單元。當有寫命令的時候,數(shù)據(jù)寫入寫
    發(fā)表于 06-29 08:51 ?1.6w次閱讀

    Keil C51是如何支持雙數(shù)據(jù)指針,有哪些特別的要求

    在8051體系中,數(shù)據(jù)指針DPTR作為一個特殊的16位寄存器,用于尋址64 KB的XDATA或CODE空間,通常它被當作一個16位指針,指向一個常數(shù)表。雙數(shù)據(jù)
    的頭像 發(fā)表于 09-19 16:47 ?3643次閱讀
    Keil C51是如何支持<b class='flag-5'>雙數(shù)據(jù)</b><b class='flag-5'>指針</b>,有哪些特別的要求

    同步FIFO和異步FIFO的區(qū)別 同步FIFO和異步FIFO各在什么情況下應用

    簡單的一種,其特點是輸入和輸出都與時鐘信號同步,當時鐘到來時,數(shù)據(jù)總是處于穩(wěn)定狀態(tài),因此容易實現(xiàn)數(shù)據(jù)的傳輸和存儲。 而異步FIFO則是在波形的上升沿和下降沿上進行處理,在輸入輸出
    的頭像 發(fā)表于 10-18 15:23 ?1613次閱讀

    什么是串行端口?有哪幾種分類?

    什么是串行端口?有哪幾種分類? 串行端口是計算機中用于進行數(shù)據(jù)傳輸?shù)囊环N接口類型,通過單一的數(shù)據(jù)
    的頭像 發(fā)表于 02-02 15:40 ?1877次閱讀

    Keil+C51中對雙數(shù)據(jù)指針的直接利用

    Keil+C51中對雙數(shù)據(jù)指針的直接利用
    發(fā)表于 06-18 10:15 ?0次下載