CAN经典
第12期陈 萍,等:基于FPGA的CAN总线通信系统 2483
离虽然能增强系统的抗干扰能力,但也会增加CAN总线有效
回路信号的传输延迟时间,导致通信速率或距离减少。82C250等型号的CAN收发器本身具备瞬间抗干扰、降低射频干扰(RFI)以及实现热防护的能力,它具有的电流限制电路还提供了对总线的进一步保护功能。如果现场传输距离近、电磁干扰小,可以不采用光电隔离,以使系统达到最大的通信速率。CAN-H端和CAN-L端与物理CAN总线之间各串联一个起限流作用的5Ω电阻,并在总线两端接一个120Ω的总线阻抗匹配电阻。由于使用了82C250的集成的收发器电路,SJA1000的RX1引脚接地,使用旁路功能(时钟分频寄存器CBP位置1),在这种情况下,减少了内部传播延迟,提高了CAN总线的最大长度,休眠模式的电流也显著降低[2-3]。测试实验表明,硬件设计成功实现了CAN
总线的数据收发。
图2设计的顶层模块
,读写过程结束后也返回空闲,,置位相应位
,释放接收缓冲或者启动发送命令,完成数据的接收和发送。
图1 硬件组成原理图
2 FPGA控制程序的设计
FPGA对SJA1000的顶层控制模块如图2所示。CON2TROL_MODULE是控制的核心模块,初始上电时,FPGA
接到复位信号,即对SJA1000内部寄存器初始化。ROM中存
储着初始化寄存器的地址和数据。CONTROL_MODULE从ROM中读取地址,锁存地址信号,然后拉低写控制信号WR,打开写允许,把数据写到复用总线上,对相应地址的寄存器赋值。初始化过程包括依次对时钟分频器、验收码寄存器、屏蔽寄存器、总线时序寄存器0和1、输出控制寄存器的寻址和赋值。本文中依次对它们初始化的值为0xC8,0xFF,0xFF,0x80,0x2B,0x1A。图2中计数器COUNTER的作用是通过使地址加1,指向ROM中下一个数据。当CONTROL_MODULE的读控制信号CONTROL_RD有效时,如果SJA1000的接收缓冲区状态标志位(RBS)为1,即接收缓冲区中有数据,就从SJA1000的接收缓冲区中读取数据,在内部FIFO_RD上缓存,并释放接收缓冲区。当CONTROL_MODULE的发送控制信号CONTROL_WR有效时,如果SJA1000的发送缓冲区状态标志位(TBS)为1,即发送缓冲区释放,它读取缓存在内部FIFO_WR上的数据,写到发送缓冲区中,然后启动发送命令。设计中FPGA内部的FIFO和ROM采用IP核实现,模块CONTROL_MODULE,计数器COUNTER用VHDL语言编写实现。ALE、CS、RD和WR是FPGA对SJA1000的控制信号,DIR1和DIR2是FPGA对74ALVC164245的方向选择控制信号。
图2中CONTROL_MODULE模块的设计参照图3所示的状态图。接到复位请求即进入初始化过程,完成相应寄存器的初始化,则转到空闲状态。由于采用查询方式,进入空闲状态后就转到查询状态寄存器的状态。查询完成后,如果收到读信号则转到读过程;如果收到写信号则转到写过程
;如果读写信
图3 controlmodule的状态图
3 查询方式下的数据发送和接收
FPGA对CAN控制器SJA1000的读写通过模拟总线的方
法实现。SJA1000的发送缓冲区的寄存器地址是16~26,共
11个字节。其中前3个字节分别是帧信息字节和两个标识码,后8个字节是数据。因此CONTROL_MODULE向发送缓冲区写入一条报文,需要连续写入11个字节。实现此过程的VHDL程序按照以下的状态转移设计:
(1)状态WR1:写状态的初始化,异步控制信号ALE、CS、WR和RD均为非有效状态。双向复用总线的值为发送缓冲区的首地址0X10,转到状态WR2。
(2)状态WR2:锁存控制信号ALE有效,其他三个控制信号均为非有效,双向复用总线的值保持要写入的寄存器地址,转到状态WR3。
(3)状态WR3:锁存控制信号ALE以及WR、RD信号非有效,而片选信号CS变为有效,在锁存控制信号的下降沿,寄存器地址被打入,完成寻址,转到状态WR4。
(4)状态WR4:片选信号CS保持有效,写使能控制信号WR有效,而ALE及RD非有效,双向复用总线的值为写入寄存器的数据;在这一状态要判断目的寄存器的地址是否为发送缓冲区的前3个寄存器,如果是则要写入特殊数据,如帧信息字节、标识码等;如果不是则写入待发送的数据,转到状态WR5。
(5)状态WR5:片选信号CS保持有效,WR信号变为非
中华测控网
http://www.77cn.com.cn