使用双数据指针实现串行端口FIFO

描述

Dallas Semiconductor高速微控制器系列允许系统设计人员通过内部UART优化串行通信。本应用笔记演示了如何利用这些增强型8051微控制器中的双数据指针使用循环缓冲器。提供的示例汇编代码用于显示简单的 256 字节串行端口循环缓冲区的实现。

介绍

原始 8051 微处理器的架构包括一个标准的通用 同步/异步接收器/发射器(USART,通常称为UART)。这 外设允许器件通过RS-232接口以各种波特率进行通信。其中之一 8051 UART实现的缺点是其接收和发送缓冲区 只有一个深度,即软件必须从接收缓冲区中检索一个字节,然后才能被 下一个收到的字符。可以在许多达拉斯半导体公司中实现快速软件FIFO 和Maxim微控制器,增加了串行端口的实用性。

本应用笔记演示了一个简单的256字节循环缓冲器,但原理可以扩展到 缓冲长度可达 64kB。数据由串行端口接收并存储在缓冲区中,直到对其采取行动 通过用户提供的例程。当缓冲区变满时,接收器通过软件流控制将 向主机发出停止传输的信号。当用户提供的例程清除缓冲区中的空间时,它将 向主机发出信号以恢复传输。本应用笔记中的示例足够通用,可以 适用于各种用户应用。示例随附的汇编源代码是 在网站上的文件AN603_SW中提供。回答 51.

支持先进先出构建的硬件增强功能

高速和超高速微控制器系列具有许多功能,大大简化了 软件先进先出的实施。所有这些功能都旨在最大限度地减少软件开销 与存储和检索数据相关联。其中第一个功能是极高速 达拉斯半导体和Maxim微控制器的性质。他们增强的 4 时钟和 1 时钟 机器循环型芯最大限度地减少了维护缓冲区所花费的时间,并且通过扩展允许 应用程序运行得更快。

另一个重要功能是双数据指针。最初的 8051 只有一个数据指针,它 使得同时实现输入和输出指针变得困难。每次系统需要 在指针之间切换,它必须保存当前值并加载另一个的值 指针。在尝试将数据快速移入和移出缓冲区时,这会引入明显的延迟。 使用两个数据指针,一个可以分配给输入(插入)指针,另一个分配给输出 (删除)缓冲区的指针,消除与处理指针相关的延迟。另外 一些微控制器集成了增强的数据指针,可以自动递增数据 执行某些数据指针相关指令后的指针。这节省了额外的机器 每个缓冲区访问的周期。

通过使用内部 1kB MOVX SRAM(其数据可用),可以进一步提高速度 可以在单个机器周期内访问。在此内存中定位循环缓冲区允许 实现非常快速的缓冲区。

软件说明

此示例介绍串行端口的循环 FIFO 缓冲区的基本体系结构。接收数据 通过串行端口 0 并存储在 MOVX 存储器中的循环缓冲区中,直到提取为止 并由用户定义的算法操作。此示例使用达拉斯和 Maxim 微控制器 双数据指针。DPTR(也称为 DPTR0)用作输入指针,并始终指定 应存储通过串行端口接收的新信息的位置。DPTR1 是输出指针, 显示应用程序软件将检索下一个未处理字节的位置。伴随的 软件应该被认为是这样一个例子的骨架。

做了一些假设来简化软件并减小其大小:

缓冲区长度为 256 字节,从 0000h 开始,到 00FFh 结束。软件可以快速检查 表示非零数据指针高字节,以指示翻转。

输入和输出指针仅递增,尽管软件可以很容易地修改为 支持双向指针。

收到字符后对缓冲区状态的反馈限制为剩余 1 个字节 警告和 0 字节剩余关机方法。这种通过/不通过的方法允许非常快的错误 检查,可最大限度地减少缓冲区输入和输出例程中花费的时间。缓冲区状态 从缓冲区读取字符后,用户提供的算法负责。

主机的错误通知通过软件流控制执行。这是一个常见的 传输协议易于实现,占用的处理器开销很小。

 

当程序启动时,两个数据指针都初始化到缓冲区的开头。串口 也被初始化,然后软件流控制“就绪”字符(XON:11h)被发送到 主机以允许传输数据。然后,软件会等待,直到收到新字符或 应用程序需要从缓冲区读取一个字节。此示例仅显示例程的外壳,该 缓冲区中的字节;实际代码将由应用程序定义。

当串口收到字符时,调用串口0中断服务例程(ISR)。第一 例程从串行端口检索字节,并存储在缓冲区中由 输入指针 (DPTR)。然后调用子例程Increment_DPTx,这将递增所选数据 指针,然后执行两个操作。首先,它确保递增的值不超过 缓冲区的上限。如果是这样,它将指针值重置为缓冲区的开头。二、它 检查输入指针是否有覆盖输出指针的危险,这种情况可能是 如果主机清空缓冲区的速度不够快,则会遇到此问题。

溢出检测和处理

溢出检测和处理例程如图 1 所示。它在输入或 输出指针递增。首先,溢出例程确定输入和 输出指针。如果距离为一个字节,则软件会声明溢出警告。这将设置 溢出标志,并且还向另一个单元发送XOFF以停止传输,直到缓冲区 再次清空。串行端口接收器保持启用状态,以允许发送单元 在收到 XOFF 时的传输过程中。声明警告状态比 缓冲区已满状态允许接收这最后一个字符。

如果距离为零字节,则软件声明溢出关闭。这将设置溢出标志, 传输 XOFF,并禁用串行端口接收器以防止 缓冲区。退出溢出警告或关闭状态的唯一方法是让缓冲区输出例程 删除数据,直到距离增加到 2。

如果距离不是单个字节也不是零字节,则未检测到溢出。然后例程检查 溢出标志的状态。如果未设置该标志,则例程将退出。如果设置了溢出标志,则 当前状态指示缓冲区刚刚从溢出警告状态转换为否 警告。如果是这种情况,则缓冲区已准备好再次开始接收数据,因此例程将清除 溢出标志,重新启用串行端口接收器,并传输 XON 字符。

接收器

图1.溢出处理程序流程图。

程序集代码示例

以下汇编语言代码示例是使用 Keil 软件编译和模拟的 μVision2 集成开发环境。头文件 reg320.inc 是一个包含名称的文件 目标微控制器(本例中为DS80C320)的寄存器和位,以及类似的文件 通常会随您的汇编程序一起提供,以便与正在使用的特定微控制器一起使用。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分