微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于ARM处理器的CAN-Ethernet通信模块实现

基于ARM处理器的CAN-Ethernet通信模块实现

时间:07-10 来源:电子设计信息网 点击:

图4  OE 和DIR 次态卡诺图

根据卡诺图重新写出的次态逻辑产生式,消除单独输入(包括OE 和DIR 的当前状态) 变化可能引起的竞争- 冒险现象后为:

  OEn = (nOE &nWE) # (nOE & ! DIR) # (nWE &DIR) # (nGCS3 &nGCS4 &nGCS5) ; ///

  DIRn = ( ! OE &DIR) # (nOE &DIR) # (nOE &OE) # (nGCS3 & nGCS4 &nGCS5) ;

  编译GAL 逻辑时应严格按照逻辑式生成与或逻辑。

  2. 2  CAN 总线通信控制芯片SJA1000 的读写

  CAN总线通信控制芯片SJA1000 没有提供单独的地址线,而使用可以与Intel 和Motorola系列微控制器兼容的分时复用地址/ 数据线。在一个读写周期内,微控制器首先输出操作地址并使地址锁存信号ALE 有效,SJA1000 在ALE 信号的下降沿将操作地址锁在片内;之后微处理器发出读写信号进行数据传输。但S3C44B0x 的数据线和地址线是分离的,对SJA1000 的读写操作需要模拟微控制器,先在数据线上写一个操作地址,并模拟产生一个ALE 信号锁存这个地址,之后进行正常的读写操作。系统使用地址线ADDR0 区分地址传输和数据传输:写奇地址时,不选通SJA1000 芯片,但给出一个有效的模拟ALE 信号;读写偶地址时,选通SJA1000 读写数据。另外,系统同时有两路CAN 总线接口,读写操作根据地址线ADDR1 区分两个SJA1000 芯片,两个片选信号和ALE 信号都要通过GAL 芯片产生,各信号如图5所示。

图5  SJA1000 控制信号的产生

图中虚线是向SJA1000 传输和锁存地址的过程,实线是读写操作的过程。用ABEL 语言书写的各信号产生逻辑式为:

  CAN-CS = nGCS4 # ADDR0 ;

  ALE = ! nWE &ADDR0 & ! nGCS4 ;

  对SJA1000 的操作地址如下:地址锁存向0x08000001端口写地址;数据读写通过地址0x08000000。

  3  通信模块的软件设计

  通信模块和CAN 总线上的设备节点之间直接通过SJA1000收发CAN 总线报文进行通信,报文中的数据格式可以是基于CAN 总线的上层标准协议,也可以由用户定义。为了方便与以太网上计算机的通信,CAN-Ethernet 通信模块在以太网一端使用UDP协议,这样,计算机上的软件可以使用操作系统提供的网络访问服务。

  每一个CAN-Ethernet 通信模块需要设定局域网内一个惟一的IP地址,通过固定的UDP端口和计算机通信。模块和计算机之间既可以使用对单点IP的通信,也可以在UDP端口发送广播报文。在以太网一端,通信模块接收到UDP 报文后,将其中的信息组织成CAN 总线报文发往CAN 总线;在CAN 总线一端,通信模块接收报文标识能够通过本节点接收码和接收掩码设置的CAN 总线报文,并封装为UDP 报文,转发到以太网上。各节点IP 地址、UDP工作端口和CAN报文接收掩码等设置在系统初始化时进行。

3. 1  通信控制芯片的初始化和收发操作

  对SJA1000T的基本操作如下:

  ①初始化:硬件复位,进入复位方式; 设置为BasicCAN 模式,CDR = 0x08 ;设置波特率控制字BTR0 ,BTR1 ;设置接收码和接收掩码ACR、AMR;完成设定,进入工作模式,CR = 0x1E。   

  ②发送:将CAN 总线报文写入SJA1000T 发送缓冲区TX2IDR1~2 , TXDR1~8 ;写发送命令,CMR = 0x01。

  ③接收:从RXIDR1~2、RXDR1~8 读出CAN 一帧CAN 总线报文;将SJA1000T 的接收缓冲区窗口滑动到下一帧,CMR =0x04。

  RTL8019AS内部有页地址为0x40~0x79 的256个缓冲页,每页256B。这些缓冲页的一部分作为接收缓冲区,起始页地址和结束页地址通过PSTART、PSTOP 寄存器配置,剩余可以作为发送缓冲区使用。硬件把接收缓冲区作为环形缓冲区使用,CURR寄存器和BNRY寄存器分别指明缓冲区中未使用部分的起始和结束页地址。硬件接收到数据后会自动修改CURR 的值,而BNRY需要读出一帧数据后由软件修改;对RTL8019AS的基本操作如下:

  ①初始化:硬件复位操作,进入停止方式;写入物理地址到PR0~PR5 ,写入0x00 到多点接收地址寄存器MAR;设置内部发送缓冲区器起止页地址到PSTART、PSTOP;写入当前
页地址到CURR和页地址界寄存器BNRY中;进入正常工作方式,CR =0x02。

  ②发送:将以太网报文载入在RTL8019AS中设置的发送缓冲区中;写发送起始页地址到TPSR ,写发送内容长度到TBCR0~1 ;写发送命令,CMR = 0x1A。

  ③接收:从在RTL8019AS中设置的接收缓存页中读出一帧以太网报文;根据报文长度改变页地址界限BNRY的值。

  3. 2  UDP 和CAN 报文的转换

  CAN - Ethernet 通信模块收到CAN 总线报文时,将整个报文封装在一帧UDP 报文中;接收到目的端口与自己的工作端口相符的UDP 报文时,取出其中的数据段作为一帧CAN 总线报文。以太网报文到CAN 总线报文的具体转换过程如下:

  ①如果接收到的以太网报文包含IP 报文,分解出IP 报文,否则抛弃这帧报文;

  ②如果IP 报文的目的地址匹配,并且包含一帧UDP 报文,分解出UDP 报文,否则抛弃;

  ③如果UDP 报文的目的端口匹配,分解出其中的CAN 总线报文,否则抛弃。

  CAN 总线报文到UDP 报文的转换过程是:

  ①接收到的CAN 总线报文装入UDP 报文的数据段,计算校验和,完成UDP报文封装;

  ②加上IP 报文头部,计算校验和,完成IP报文封装;

  ③加上以太网报文的头部,报文尾部的校验和不需要软件完成,RTL8019AS在发送时会自动添加。

  为了减少在转换过程中的数据拷贝,定义了如下数据结构。从CAN总线上收到的报文直接放在Frame结构体的can[ ]成员中,并记录长度,封装为UDP报文的过程就是填充Frame结构体中其他成员的过程;从以太网上收到的报文逐字节放入Frame结构体中,CAN 报文就包含在can[ ]成员中。

  struct EthHead {
unsigned char DstPhyAddr[6 ] ;  / / 以太网目的地址
unsigned char SrcPhyAddr[6 ] ;  / / 以太网源地址
unsigned short Prt ;  / / 协议标识
} ;
struct IPHead {
unsigned char VerLen ;  / / 版本号和头长度
unsigned char ServType ;  / / 服务类型
unsigned short Len ;  / / 长度
unsigned short ID;  / / 报文ID
unsigned short FlagAndFrag ;  / / 标记和分段
unsigned char TTL ;
unsigned char Prt ;  / / 协议标识
unsigned short HdChksum;  / / 头校验和
unsigned char srcIP[4 ] ;  / / 源IP 地址
unsigned char dstIP[4 ] ;  / / 目的IP 地址
} ;
struct UDPHead {
unsigned short srcPort ;  / / 源端口号
unsigned short srcPort ;  / / 目的端口号
unsigned short Len ;  / / 长度
unsigned short Chksum;  / / 校验和
} ;
struct Frame {
 struct EthHead ethhd ;
 struct IPHead iphd ;
 struct UDPHead udphd ;
unsigned char can [ 10 ] ;  / / 放置CAN 报文 

  short canlen ;  / / 记录收到的CAN 报文长度
} ;

3. 3  通信程序的实现

  处理器对SJA1000T和RTL8019AS 的操作都使用了中断方式,通信模块的软件程序可以分成SJA1000T 中断服务程序、RTL8019AS中断服务程序和主程序3 个部分,是典型的前、后台处理结构。在中断服务程序中,将收到的CAN 总线报文和以太网报文读入内存中的缓冲区,并累加缓冲区内还未处理的报文计数。在主程序循环中,轮流处理两个缓冲区中的报文,并减小报文计数值。图6 是SJA1000T的中断服务流程、RTL8019AS中断服务流程、主程序的流程。由于SJA1000T内部的接收缓冲区只有64B ,所以在程序中定义了容纳32个Frame结构体数组can- rbuf [ ]并组成环形缓冲区。同时也定义了相同大小的数组eth- rbuf [ ]组成以太网接收的环形缓冲区。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top