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

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

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

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

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

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

介紹

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

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

支持先進(jìn)先出構(gòu)建的硬件增強(qiáng)功能

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

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

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

軟件說明

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

做了一些假設(shè)來簡(jiǎn)化軟件并減小其大小:

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

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

收到字符后對(duì)緩沖區(qū)狀態(tài)的反饋限制為剩余 1 個(gè)字節(jié) 警告和 0 字節(jié)剩余關(guān)機(jī)方法。這種通過/不通過的方法允許非常快的錯(cuò)誤 檢查,可最大限度地減少緩沖區(qū)輸入和輸出例程中花費(fèi)的時(shí)間。緩沖區(qū)狀態(tài) 從緩沖區(qū)讀取字符后,用戶提供的算法負(fù)責(zé)。

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

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

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

溢出檢測(cè)和處理

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

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

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

pYYBAGP0e5-AO7q0AAAusCS5RV4257.gif?imgver=1

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

程序集代碼示例

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

審核編輯:郭婷

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

    關(guān)注

    48

    文章

    7552

    瀏覽量

    151426
  • 接收器
    +關(guān)注

    關(guān)注

    14

    文章

    2472

    瀏覽量

    71913
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    388

    瀏覽量

    43682
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    如何重置fifo指針

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

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

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

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

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

    串行端口工作原理

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

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

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

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

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

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

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

    并行端口串行端口的區(qū)別在哪里?求解

    串行端口稱為串口,也稱為串行通信接口,即COM端口。
    的頭像 發(fā)表于 06-09 15:34 ?4809次閱讀

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

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

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

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

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

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