刘玉江LIU Yu-jiang
(辽宁对外经贸学院 信息技术系,大连 116052)
数据通信交换技术是指网络中各台计算机之间或者是计算机与计算机网络设备之间进行数据通信时的信息交换技术。简单的数据通信就是两台计算机之间或者计算机与计算机网络设备(如打印机等)之间链路上的通信,数据通信交换技术的基本原理是通过某种交换方法,从源站点发出的信息经过多个节点或者网络设备后到达目标站点。目前存在两种数据传输方式,一种是并行传输,一种是串行传输。并行方式虽然使用了较多的线路和连接,但是传输速度更快。串行方式通信最少只需三根连接线,但是传输速度要比并行方式慢的多。因此在短距离数据通信方面以往主要采用并行方式。而在长距离通信时,基于连接线路复杂和成本高的考虑,主要采用串行方式。但是目前这种区别已经越来越不适用。由于系统小型化的要求越来越高,其内部部件也越来越小,串行通信由于其简洁的通信方式越来越受到人们的重视。随着技术的提高,串行传输的速率也得到了明显的提高。
PIC16F877A内部是由MSSP模块构成的SPI接口,可同步发送和接收8位数据, 通信只需3个或4个引脚。它支持SPI的所有四种方式。由于用SPI方式通信的两台设备在同一个时钟下工作,因此,SPI至少需要发送(SDO)、接收(SDI)和时钟(SCK)3根引脚线。为了加强主从机之间通信的灵活性,增加了从动方式选择(SS)作为控制信号线。
SPI(Serial Peripheral Interface,串行外围接口)是由MOTOROLA公司在20世纪70年代末至80年代初最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口。本文所采用的微芯公司的 PIC单片机的SPI接口就是在充分吸收了这两种规范优点的基础上开发出来。在PIC16F877A中配置了主控同步串行接口MSSP (Master Synchronous Serial Port ) 模块[1,2],它兼容SPI和I2C两种串行通信模式。在PIC16F877A中配置了主控同步串行接口MSSP(Master Synchronous Serial Port)模块,兼容SPI和I2C 两种串行通信模式[3]。
通信的双方总有一方处于主动位置,负责通信过程的建立、结束,发送同步时钟; 另一方则接受主控方的相应命令或时钟,被动地发送或接收信号。主控方通过送出时钟信号来启动数据传输,在双方约定好的时钟边沿(主从方时钟边沿一致) 下,数据从主、从方的移位寄存器中同步传输,并在下一个边沿上被锁定。每个时钟周期完成一位数据交换,8个时钟周期以后主从移位寄存器中的内容交换一次,并分别装载到相应的缓冲器中与此同时缓冲器满标志位和中断标志位置位[4]。在SPI通信中这个过程可精简为图1的过程。
图1 SPI数据收发示意图
SSPEN是同步串端口使能位,置1则启动串行端口并配置SCK,SDO,SDI,SS为串行端口引脚。CKP为时钟极性选择位,置1则时钟空闲状态为高电平。SSPM3到SSPM0四位为同步串行端口模式选择位,在主控模式下用来设置时钟,从动模式下用控制是否启用SS\引脚控制。WCOL、SS-POV分别为写冲突检测位和接收溢出标志位。
SMP为采样位,主控模式下置1表示在数据输出结束时采样输入信号,0表示在数据输出中段采样输入信号;从动模式下该位必须清零。CKE是SPI时钟极性选择位,1表示数据传输发生在时钟信号由活动状态转向空闲状态时,为0正好相反。BF是缓冲器满状态位(仅在接收模式下),1表示接收完成,SSPBUF满。
在使用PIC16F877A的SPI口之前必须先对 MS S P进行初始化设置。与此相关的寄存器主要是同步串口控制寄存器(SSPCON1)和同步串口状态寄存器(SSPSTAT )要设置的项目包括以下七点:
1)主控方式( Master Mode,SCK为时钟输出引脚 )
2)从动方式( Slave Mode,SCK为时钟输入引脚 )
3)时钟极性( Polarity ,空闲时SCK的电平高低设置)
4)数据输入采样点(中间点或结束点)
5)时钟沿选择(数据是在时钟SCK的上升沿还是下降沿输出)
6)主控方式下的时钟频率(仅用于主控方式下)
7)从动方式下的从动选择设置
首先将PIC单片机的SPI控制寄存器SSPCON的使能位SSPEN置1,这样就可以使用SPI串行端口了,此时引脚SDI、SDO、SCK、SS为SPI接口的专用引脚。除了按照上述要求设置SSPCON和SSPSTAT寄存器以外,还需要对以上四个引脚进行方向控制位的设置。
在双机通信中,分主控方( Master )和从控方(Slave)两个模块。主控方控制SCK信号。双方严格按照“SPI串口通信协议” 发送和接收数据。其工作过程为:主控方发起传送过程, 数据一旦写入主控方缓冲器SSPBUF就开始读取或发送数据,数据高位在前,低位在后。并自动在SCK端产生8个SCK时钟周期给从控方。但是从控方,只有在SS\端被拉低时,才接收主控方SCK时钟信号,并与 SCK同步发送或接收数据。主从控双方,都在同一个SCK信号的一个跳变沿进行数据移位,在数据稳定后的另一跳变沿进行采样。
正常接收或发送的相关标志位: 当接受完一个字节后,中断标志位SSPIF和缓存器满标志位BF相应置1。当接受数据的最后一位被锁定,或发送数据的最后一位被移出后,中断标志位SSPIF置1。
图2为系统硬件连接示意图。
图2 双机通信电路连接示意图
图3和图4是简化后的数据收发流程图。
在以上通信过程中用到了握手信号,这主要是考虑到主从控双方除了相互通信以外还可能执行其他功能,这样做提高了程序的通用性。另外程序用汇编语言编写, 这样提高了代码的执行效率。
图3 主控方程序流程 图4 从控方程序流程
/*主控端SPI初始化程序*/
…
bcf status, rpl
bsf status, rp0
movlw B`10000000`;设置C端口,SDO和SCK为输出
movwf trisc
…
movlw B`01000000`;设置SMP=0, CKE=1
movwf sspstat
movlw B`00000110`
movwf adcon1
bcf status, rp0
movlw B`00110001`
movwf sspcon; 时钟空闲为高,主控频率为fosc/16,
…
/*主控端发送数据程序*/
…
movlw B`01010101`; 发送命令字B`01010101`
movwf sspbuf
call ready; 等待握手信号
nop
nop
movlw B`00101010;发送数据给从控端
movwf sspbuf
call ready
…
/*从控端主程序*/
…
bcf portb,1
bsf portb,1
call chaxun
movf sspbuf ,0 ;接受数据1
movwf data1
bcf portb,1
…
bsf portb,1
…
/*握手信号子程序*/
Ready
a btfss porta , 1; 等待数据可发送,可以添加握手信号来检测
goto a
return
/*查询是否接收到数据的子程序*/
Chaxun
bcf status, rp1
bsf status, rp0 STATUS,RP0
b btfss sspstat, bf
goto b
bcf status, rp0 BCF STATUS,RP0
return
通过试验证明这种双机通信方式是切实可行的,在高达5MHz的通信速率下没有发生传输错误。尽管本文是双机通信的模式,但主机可以通过增加从动器选择线来控制从机的SS引脚的方式,扩展为一主多从的通信模式。另外本文中SS引脚的控制也可以放开。因此本文的设计方法具有较强的通用性和扩展性。
当然这种模式依然不可避免的存在诸如不能很好的适应多主控器情况、不能寻址、不够灵活等局限性。但是正是由于它的简单实用,在很多对通信要求不太高的场合,仍有它的实用价值。
[1] Korb,J,A Standard for the Transmission of IP Datagram over Public Data Network. RFC877,Purdue University,September,1993.
[2] 罗翼,张宏伟.PIC单片机应用系统开发典型实例[M].北京:中国电力出版社,2005.
[3] Tim wilmshurst,等.PIC嵌入式系统开发[M].北京:人民邮电出版社,2008.
[4] 金惠文,陈建亚,等.现代交换原理[M].北京:电子工业出版社,2005.