基于 FPGA 实现 CAN 数据传输与验证
1 CAN 总线简介
CAN(Controller Area Network,控制器局域网 )总线是一个多主机异步串
行总线,也是国际上应用最广泛的现场总线之一。在现场总线中,它是惟一被 ISO
国际标准化组织批准的现场总线。由于其成本低、容错能力强、支持分布式控制、
通信速率高等优点在汽车、工业控制、航天等领域得到广泛应用。特别是由于
CAN 总线具有抗干扰性强、高数据传输率及低成本等优点,在小卫星和微小卫星
中得到了越来越广泛的应用。
2 CAN 硬件设计
传统的 CAN 通信系统通常采用 MCU + SJA1000 + CAN 总线收发器的架构,但
是单片机速度较低、资源较少,当受到强电磁干扰便很容易出现程序跑飞。本文
基 FPGA + SJA1000 + CAN 总线收发器的 CAN 总线通讯如图 1 所示。与传统方案
相比,其优点在于可扩展性好,稳定性高,减轻了重量、体积和功耗。注意:对
于 FPGA 而言,接口电平不支持 5V I/O 标准,如果与 5V I/O 标准的器件直接相
连,将可能导致 FPGA 管脚流过极大电流,造成器件锁死或者烧毁。电平转换器就
是为了防止 FPGA 损坏。
3 CAN 逻辑设计
图 1 CAN 硬件框图
FPGA 对 CAN 总线通讯模块的控制主要包括 3 部分:CAN 总线节点初始化、报
文发送和报文接收。
1)CAN 读写时序图
本设计的核心是保证 FPGA 与 SJA1000 之间的准确通信,为了保证 FPGA 与
SJA1000 之间能够准确无误的通信,在他们之间进行数据通信时,必须要按照
SJA1000 的时序逻辑进行通信。在编写 FPGA 的控制逻辑时,需要严格根按照
SJA1000 的读/写时序图。
2)CAN 工作模式选择
SJA1000 控制器支持两种模式,分别是 Intel 和 Motorola 模式。两种模式
选择其一设计即可。
3)CAN 总线节点初始化
CAN 初始化属于 CAN 程序设计的难点,按照手册正确的配置相关寄存器的值
很关键。如果初始化失败,设备不能识别波特率,则 CAN 总线不能发送和接收数
据。初始化主要包括工作方式设置、验收滤波方式设置、验收屏蔽寄存器和验收
代码寄存器、波特率参数设置和中断允许寄存器的设置等。这里只描述基本初始
化 方 法 , 如 果 需 要 了 解 初 始 化 寄 存 器 地 址 及 寄 存 器 数 据 , 请 联 系 笔 者
(jhqwy888@163.com)。
4)CAN 报文发送和报文接收
由于通讯模块对接收数据的实时性要求并不是很高,因此 CAN 总线的数据接
收和发送采用查询方式。如果 SJA1000 的接收缓冲区状态标志位(RBS)为 1,即接
收缓冲区中有数据,就从 SJA1000 的接收缓冲区中读取数据,在内部 FIFO_RD 上缓
存,并释放接收缓冲区。如果 SJA1000 的发送缓冲区状态标志位(TBS)为 1,即发
送缓冲区释放,它读取缓存在内部 FIFO_WR 上的数据,写到发送缓冲区中,然后启
动发送命令。
4 CAN 功能验证
本设计在 vivado 2018.1 软件平台上进行了功能仿真,并在实际工程中得到
了硬件验证。硬件环境主要计算机、FPGA 板卡、USB 转 CAN 接口组成。利用 USB
转 CAN 设备产生 CAN 总线数据, 进行 FPGA 片上测试实验,用 Xilinx 公司的
ChipScope 软件做片上数据测试。
利用 USB 转 CAN 设备发送数据为 0102030405060708,FPGA 接收数据为
0102030405060708。FPGA 发送数据为 AA,CAN 调试助手接收数据为 AA。由此可
见,接收和发送数据正确,CAN 接口功能正确,设计符合预期。
5 CAN 结束语
笔者通过 FPGA 控制 SJA1000 实现 CAN 总线通信,可扩展性好,稳定性高,
降低了重量、体积以及功耗,有利于空间实现。此外 CAN 总线允许高达 1Mbit/s
通讯速率已经进行实际验证。如果需要进一步了解 CAN 总线设计,请发邮件沟通:
jhqwy888@163.com。