首页 > 学习收获 > 嵌入式相关 > PIC之串行通讯
2007
08-27

PIC之串行通讯

呵呵。继续说PIC。上周本同学折腾了一周的串行通讯。下面和各位侃侃。

说到串行通讯,首先就要提到USART。USART,全称通用同步异步发送接收器(Universal Synchronous Asynchronous Receiver Transmitter),是一个很常见的芯片外设。广泛应用于各种单片机,从51到ARM都有他的身影。当然,各芯片的USART细节上肯定不会一样,但是大致的功用都是一样的,就是提供串行数据的通信。

众所周知,串行通信的关键在于移位。而USART这个小小的外设就是以硬件的方式完成移位的活动,我们所要做的,只是设置好其应有的参数,然后把数据放到待发送寄存器或者从接收寄存器里面把数据取出就好了。硬件层面的移位和波特率之类完全不用关心其实现细节。还是很方便的。

那么PIC使用USART进行串行通信需要哪些步骤呢?呵呵。这个问题,其实看DATASHEET是最好的。DS上面的USART一章会说的很明白。我这里就大致说一下:如其名字,USART可以进行同步和异步两种串行通信。通俗的说,同步就是打电话,双方同时在线,以相同的速率,发送方发一个数据,接受方就接收一个数据。好处是可以连续大量的传输,没有附加的损耗。不好处呢,第一是貌似不能全双工,同一时间只能一方发另一方收,然后就是这个同步要求双方不能进行别的操作,只能专心的通信,就像你在打电话时不能同时进行别的工作一样。。这对有些时候是不可接收的。。比如。。你想过你的PC连上串口之后就不能运行任何程序只能串口通信么?呵呵。。当然这个例子比较牵强。不过我们这里不讨论。

而异步发送模式就像发MAIL。发送方把要发的字节打个包,就像装进信封一样,然后按照要求串行发出去。接收方接到以后呢,就把信封去了,把信息拿出来。有时候发送方还在信封表面注上一些校验信息。接收方接到以后如果拆开一看:校验信息和内容对不上,那么,不对,信被掉包了!就把信该扔掉扔掉,该要求再发的要求再发。。异步的模式好就好在随机性可以很强,很适合随机的不确定的一些少量数据的发送。但是因为有了信封这个累赘,为了发送一个字节就要加上起始位啊停止位啊校验位啊之类的东西,额外损耗比较多。

具体选用哪种模式就要看具体需要了。不过貌似用异步模式的比较多。俺就是用的异步模式。呵呵

还有一个重要的参数叫波特率,这个很简单,就是双方通信的速率,只有双方波特率相同,才能正常通信。这一点也需要注意。

那么,在PIC中,和USART相关的寄存器有:TXSTA、RCSTA、SPBRG、TXREG、RCREG。其中前两个STA均为设置寄存器,通过不同位的设置来确定USART的工作模式是同步还是异步,以及一些别的状态,比如是否使用第九位发送接收啊之类的。而SPREG这个寄存器是一个波特率发生器。在DS中有一张表,上面有各种频率下各种波特率的该寄存器的值。应用时查表找到自己要用的值就好。也有相关的计算公式。由公式可知波特率一般会有一些误差,选择时要注意误差不能太大。貌似2%以下都能凑合接收?TXREG和RCREG两者就是发送寄存器和接收寄存器了。使用时向TXREG写入数据或者从RCREG读出数据即可。不需要关心移位的问题还是很方便的。

在使用USART收发数据时,首先按照自己的要求将USART设置好以后,就向TXREG写入数据或者从RCREG读出数据即可。USART正常工作时,若使能接收且有接受到数据就会将数据放入RCREG,并将PIR1的RCIF置一,若接收中断允许的话就将引起中断。那么中断也好软件查询也好,检测到此情况后,将数据从RCREG中拿出即可。而想发送数据时,向TXREG中写入数据,并使能发送后,USART就会把数据送入一个对用户不可见的移位寄存器开始移位发送了。若在使能发送的情况下TXREG为空,那么就会将PIR1的TXIF置一。这也造成了这么一种特殊的情况:当连续发送的第一个发送开始的时候,由于移位寄存器是空的,所以在将一个字节放入TXREG并使能发送后,USART可以立刻将TXREG送入移位寄存器,导致TXREG再度为空,从而可以再度放入第二个字节,引发一个“背对背发送”。呵呵,很有意思的小细节。但是中断方式发送一般不用管。因为首次中断处理完成后会立刻引发第二次中断,完成将第二个数据装入TXREG的过程。软件轮询的话可能需要注意一下,如果不是一直在轮询,那么至少在一开始发送的时候连续轮询从而连续发送两个字节过去比较好。嗯。。

具体的流程啊初始化实例啊还是请参看DATASHEET,尤其是那本 PICmicro®中档单片机系列参考手册(DS33023A),这一个还有中文版可以看。请多多研读。

最后稍微说一下USART和PC机COM口的连接。我本来以为很简单,但是我错了。COM口是12V的电压,USART只有5V的电平。所以转换电路是必要的。承蒙PIC16论坛某位大哥指点,得知可用MAX232这块伟大的小芯片稍微加几个电容就可以完成电平转换。具体可参看原帖:

http://www.pic16.com/bbs/dispbbs.asp?BoardID=8&replyID=81644&id=26857&skin=0

顺便再说一下,PROTEUS上面的话,连接到串口没那么复杂,PROTEUS中有个叫COMPIM的部件,可以直接完成将电路的USART连到串口的工作。再用虚拟串口连接器那个软件把串口虚拟连接起来,就可以方便的调试了。但是有个小问题就是这个COMPIM仅支持到57600的波特率。要是正常使用还好,要是需要用到115200这个BT波特率的话,那么就无法仿真了。呵呵。。

以上。乱谈PIC第二回结束。呵呵~

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

PIC之串行通讯》有 3 条评论

  1. 龙天说道:

    呵呵,共同学习,共同进步么。PIC其实很简单的~

  2. alan lu说道:

    感谢!感谢!
    学习中。
    最近想在PIC中学习点东西,看到你的文章,赞!
    坚持写下去,这样我才能坚持看下去哦!
    最近想学PIC是因为手头遇到一个关于PIC 的项目,以前没有自己开发过PIC
    用到PIC16F786-20/SP
    学习中。
    最近想在PIC中学习点东西,看到你的文章,赞!
    坚持写下去,这样我才能坚持看下去哦!
    最近想学PIC是因为手头遇到一个关于PIC 的项目,以前没有自己开发过PIC
    用到PIC16F786-20/SP

  3. alan lu说道:

    感谢!
    学习中。
    最近想在PIC中学习点东西,看到你的文章,赞!
    坚持写下去,这样我才能坚持看下去哦!
    最近想学PIC是因为手头遇到一个关于PIC 的项目,以前没有自己开发过PIC
    用到PIC16F786-20/SP

留下一个回复

你的email不会被公开。