数控同步现场总线与CAN总线网关的设计
和地址的复用引脚。当CMD为低电平时,数据线为地址端口,否则为数据端口。DM9000的地址寄存器端121地址为Ox20000000,数据寄存器的端口地址为0x20000004。由此访问片上特定的寄存器时要先写地址再读写数据,下面是DM9000驱动程序读其内部寄存器的函数实现。
NCSF数据帧头部长18字节,图4为NCSF数据帧的头部结构。EthAREA六个字节填充0xFF,使NCSF帧能够通过以太网交换设备;帧的总长度G_Length;两个全局控制字G_CTRLI和G_CTRL2;①数据帧标识G_mtype;②帧类型标识G_stype;③从站计数器G_sno。
图4 NCSF帧头部结构
在DM9000的设备驱动和NCSF协议中,为了方便管理每个NCSF数据包及其控制信息,特设计数据结构ncsf buff。
在ncsf buff中next和prey使所有需发送的数据包构成一个双向链表;cb为数据包状态控制字,保存此数据包当前的状态和控制信息,ncsf buff中最重要的几个成员变量为head、data、tail和end,这四个成员变量指向同一连续内存区域的不同位置,其结构和关系如图5所示。
图5 ncsf_buff数据结构
在创建nesf_buff的同时会申请一段足够容纳最大的NCSF数据帧2倍的连续内存,head指向这一块内存的首地址,end指向其尾部,data指向head+LEN的位置,在tail和data之间是NCSF有效数据,即在data前预留LEN长空闲空间,以便在此有效数据前扩展数据包头部和其它数据,tail预留的空闲空间用于在尾部扩展有效数据。有效数据区前后预留的空闲空间可以避免在数据包扩展时重新分配内存和拷贝相关数据,由此提高了发送接收数据包的速度。
3.2 CAN总线接口模块
MPC2515是一款独立的CAN控制器,完全支持CAN2.0B技术规范。该器件能够收发标准和扩展的数据帧以及远程帧。MPC2515自带两个验收屏蔽寄存器、六个验收滤波寄存器,这些寄存器用于过滤不必要接收的报文,它们可以有效降低微控制器的负担。MPC2515和S3C2440之间的连接通过SPI实现。
图6中特别画出CAN模块的电源电路,为了增强CAN总线的抗干扰能力,MCP2515与总线收发器TJAl050之间采用高速光电耦合器6N137相连以实现电气隔离,而为了实现完全的电器隔离,6N137两端的电源也应该进行完全隔离,B0505S为它们提供了完全隔离的电源。
图6 CAN模块电路简图
S3C2440通过特定的SPI命令与MPC2515进行交互,命令包含复位、读、写、读RX缓冲器、装载TX缓冲器、请求发送报文、读状态和位修改命令等。通过这些命令S3C2440可以读写CAN控制器的状态、发送CAN数据帧,以及重置CAN控制器。S3C2440通过SPI向MPC2515发出每个命令字节前,CS都需要被置为低电平。在任何操作期间CS都要保持低电平,操作完成后需要把CS置为高电平。
CAN模块的初始化依次为:软件复位、设置CAN总线的波特率、关闭中断、设置验收屏蔽寄存器和验收滤波寄存器、切换MPC2515到正常模式、清空接收和发送寄存器,最后开启相应的中断。
can_frame是CAN数据帧发送队列的数据结构。为了能够兼容CAN扩展报文接收,在can_frame中ext_f标志为0表示为正常报文,为1表示为扩展报文;rtr_f对应数据帧仲裁场中的RTR位;pri为报文的优先级。为0按照先入先出顺序出队,少数紧急指令为1,此报文优先出队被发送。
4 NCSF与CAN数据帧封装转换模块
NCSF-CAN协议转换模块把CAN数据帧封装在NCSF数据包中。NCSF应用层提供四类设备应用服务:计数器、操作站、伺服电机和简单I/0设备,其中计数器设备服务数据包中可利用的字段比较多,所以选择把CAN报文封装在计数器数据包中。
CAN数据帧由七部分构成:帧起始、仲裁场、控制场、数据场、CRC场、应答场和帧结尾。其中,帧起始为一个“显性”位;仲裁场由11位标识符和远程发送请求位(RTR)构成;控制场有六位,最后四位是数据场长度,其余两位保留;数据场是数据帧中的有效数据,长度为0—8个字节;应答场有两位分别为应答间隙和应答定界符;最后是7位的帧结尾。CAN远程帧没有数据场,RTR位为“隐形”。综合CAN的各种帧,NCSF—CAN网关需要把标识符、RTR位、数据长度字段、0—8字节的数据封装在计数器数据包的计数器字段中,然后通过NCSF的链路传送给主站。
计数器数据包长48个字节,支持5个计数器,按绝对增量方式计数,采用32位计数。由此每个计数器数据包传输20字节的数据,每个CAN帧的数据至多8个字节,再加上标识符等字段也不多于20字节。表1为计数器数据包与CAN数据帧的封装转换。
表1 计数器数据包与CAN数据帧的封装转换
为了区分普通计数器数据包和封装CAN数据帧的特殊计数器数据包,规定前两个字节为0x0101的计数器数据包为封装CAN协议数据的数据包。IOIN和IO.OUT是输入输出端子控制字段。CNT0_CNT、CNTl_CNT、CNT2_CNT、CNT3_CNT和CNT4_CNT为五个计数器,在主站发往计数器从站的计数器数据包中这些字段为1表示对应的计数器清零,为0表示正常计数,其它值没有定义。
CAN总线数控系统数控同步现场总 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)