中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

您当前所在位置: 汽车电子 > 查看内容

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

文章作者头像
发布:清雅轩 作者: webmaster来源: job.cartech8.com
PostTime:16-5-2008 20:50

以下为文章全文:(本站微信公共账号:cartech8)


汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师

  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 报文长度

} ;

[文章纠错]

文章网友提供,仅供学习参考,版权为原作者所有,如侵犯到

你的权益请联系qchjl_admin@126.com,我们会及时处理。

会员评价:

0 发表评论

渝公网安备 50010802001066号

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-5-2024 23:16 , Processed in 0.172589 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.