RS-232是PC世界中最常见的串行接口。大多数RS-232接口以固定传输速率与接收器通信,例如9600波特。但是如果变送器以不同的传输速率运行会发生什么?不同的传输速率要求接收器检测速率并将软件调整到新的通信速度。以下关于接收器如何检测RS-232接口的传输速率的描述没有描述接收和发送例程的实现。相反,它描述了一个由发射器和接收器组成的系统。发送器(例如,PC)将字符发送到接收器。接收器是一种低成本μC,可检测传输速率并根据新速率调整其软件。实现原理很简单。
发送器向接收器发送校准值。接收器测量接收校准值位的时间。基于该测量,接收器计算1比特的传输时间。该方法将此时间用于波特率发生器。诀窍是测量输入比特流的时间并计算接收1比特的平均时间。自动波特例程的这种实现假设接收器知道校准值的比特序列并且接收器知道何时校准。该技术使用PIC16C54BμC。 μC通过MAX232芯片连接到PC。 PC将校准字符发送到μC。我们选择ASCII值为“?”因为比特序列。自动波特率例程测量接收比特流中的那些的时间,然后将时间除以6。结果是例程接收或发送1位所需的时间。
由于PIC16C54B没有硬件USART,因此软件程序会测量位序列的时序。清单1给出了autobaud例程的源代码。校准字符包含一个起始位,一个停止位和无奇偶校验位。对于时间测量,该技术使用16位计数器,该计数器提供一系列传输速度。在例程的第一部分,软件初始化计数器和自动波特率状态寄存器AUTOB_STATUS。寄存器存储有关自动波特率例程的输入信号是否太慢或太快的信息。您可以使用此信息检查校准过程是否成功。初始化之后,自动波特率程序查找起始位,这是一个逻辑从一到零的转换。检测到起始位后,自动波特率程序会查找反向转换。检测到此转换后,例程开始使用16位软件计数器测量时间。软件递增16位计数器的低字节,直到计数器溢出。
当发生溢出时,16位计数器的高字节递增1。这个过程一直持续到从逻辑1变为零或计数器的高字节溢出为止。在任何一种情况下,例程都会在AUTOB_STATUS中设置一个标志,以指示输入信号是快还是慢。否则,软件计算1位的传输时间。此时间会生成发送或接收例程的波特率。这些例程需要1比特的传输时间,以产生用于比特采样的延迟或用于比特传输。软件通过将测量时间除以校准值中传输的数量来计算1位的传输时间。在校准值“?”的情况下,有必要将测量时间除以6。除以6需要将16位计数器/寄存器向右移动三次,同时从左侧绘制零。除法后,程序将位时间除以2,计算半位的传输。该时间图在接收例程中用于将位采样置于位的中间。除以2需要将16位计数器简单地移位到左侧的一个位置。程序将此操作的结果存储在两个寄存器中:AUTOHALF_LOW和AUTOHALF_HIGH。
程序完成此计算后,需要将1.5位的传输时间调整为软件开销。该调整涉及减去执行发送或接收例程所需的指令周期数。减法后,软件会验证结果是否小于零。如果是这样,输入信号太快,并且例程在AUTOB_STATUS寄存器中设置错误标志。调整后,软件通过验证16位计数器的值为零来验证输入信号是否过快。如果输入信号不是太快,则自动波特率例程返回到操作系统。
全部0条评论
快来发表一下你的评论吧 !