USART发送器采用双缓冲结构,其系统结构示意图如图9-2所示。
图9-2 USART发送器的系统结构示意图
USART发送器的工作过程如下。
1)当USART工作模式选择位SYNC为0时,USART工作于异步模式。
2)当要通过USART发送一个数据时,用户把要发送的数据放到发送寄存器(TXREG)中,TXIF被自动清零。
3)系统会自动用一个指令周期(TCY)的时间把TXREG内容传送到发送移位寄存器TSR(TSR是内部寄存器,用户无法访问)中,传输完成会使TXIF置位。当USART发送中断使能位TXIE为1时,系统会向中断控制电路提出中断申请。若此时GIE和PEIE均为1便会产生中断响应。
4)当串行口使能位SPEN为1时,RC6会被系统用做串行输出引脚TX,TSR中的内容会在波特率时钟(由SPBRG和BRGH决定)的驱动下依次通过TX引脚逐位输出。
5)当TX9信号为1时,TX9D会作为数据的第9位通过TX输出。
6)输出完毕后,发送移位寄存器空标志位(TRMT)会被置位。
系统每发送一组数据的速度由发送器的波特率时钟来决定,用bit/s表示。USART的波特率时钟由一个8位的波特率发生器寄存器(SPBRG)和高波特率选择位(BRGH)决定。BRGH也位于TXSTA寄存器中。
波特率发生器的时钟来源于单片机主频,由SPBRG的内容和BRGH配合来产生某种频率的波特率时钟用来驱动USART发送器(或USART接收器)工作。给出所需的波特率数值和单片机主频FOSC,就可以用表9-2中的公式计算出SPBRG中应该写入的数值X。
表9-2 USART的波特率计算公式
然而实际应用中总是已知传输的波特率和单片机主频,所要求的是SPBRG应该写入的数值X。由表9-2可以得到求X的公式,如表9-3所示。
表9-3 USART的SPBRG写入值计算公式
下面举例说明SPBRG写入值与波特率误差的计算方法。
【例9-1】已知单片机主频是4MHz,希望USART异步模式下波特率为9600Baud/s,试计算SPBRG的写入值和波特率误差。
题意分析
●SPBRG的写入值通过表9-3的计算公式即可算出。表9-3中异步模式下有两种计算公式,分别计算一下写入值及其波特率误差。
●计算过程中要用到除法,但计算结果只能取整数,导致单片机运行时实际波特率与目标波特率之间存在误差,此误差被称为波特率误差,在实际应用中希望此误差小于5%。
计算过程(www.daowen.com)
1)根据表9-3中异步模式下的公式先计算BRGH=0时的写入值X。
X=(FOSC/(波特率×64))−1=(4000000/(9600×64))−1=5.51042≈6
2)当X为6、BRGH=0时,实际波特率可以通过表9-2得出。
波特率=FOSC/(64(X+1))=8928.57
3)此时的波特率误差如下。
波特率误差=(实际波特率-目标波特率)/目标波特率=|(8928.57−9600)/9600|=6.99%
4)根据表9-3中异步模式下的公式再计算BRGH=1时的写入值X。
X=(FOSC/(波特率×16))−1=(4000000/(9600×16))−1=25.0417≈25
5)当X为25、BRGH=1时,实际波特率可以通过表9-2得出。
波特率=FOSC/(16(X+1))=9615.38
6)此时的波特率误差如下。
波特率误差=(实际波特率−目标波特率)/目标波特率=|(9615.38−9600)/9600|=0.16%
由计算可知,当BRGH=1时误差小很多,符合USART通信的误差要求,可以用此计算值X进行USART通信,而当BRGH=0时波特率误差较大,不符合USART通信的误差要求,不建议使用这样的配置(X=6,BRGH=0)进行USART通信。
在实际应用中,波特率单位是bit/s,波特率数值往往都是300的倍数,如1200bit/s、9600bit/s、19200bit/s、38400bit/s等。为了方便读者使用,表9-4给出了常用主频下常用波特率对应的SPBRG写入值,表9-5给出了常用主频下常用波特率的相对误差。
表9-4 常用主频和波特率要求下SPBRG写入值
表9-5 常用主频和波特率要求下相对误差表
由表9-5可以看出在主频为3.6864MHz时,各种常用波特率的误差都为零,当读者的单片机系统要求精确的USART通信时推荐使用3.6864MHz的晶体振荡器作为主频。
波特率单位bit/s是表示每秒钟能够传输的数据位数,不是纯数据的传输速度。传输的数据中除内容信息外,还包括其他额外的控制位信息。
以上就是USART异步发送器的工作流程及相关数据的计算方法。下面总结USART工作于异步发送模式时需要用到的特殊寄存器。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。