1. 项目概述
在工业控制和汽车电子领域,CAN总线通信因其高可靠性和实时性成为主流解决方案。本文将分享一个基于FPGA的SJA1000T芯片驱动实现,该方案已在Xilinx Artix-7开发板上成功验证,支持标准帧(11位ID)和扩展帧(29位ID)的双向通信。
不同于市面上常见的SJA1000T固件代码,本项目专注于FPGA端的Verilog驱动设计,通过硬件描述语言直接控制SJA1000T的寄存器接口,实现了800kbps波特率下的稳定数据传输。代码采用模块化设计,包含核心状态机、时序控制器和异常处理机制,特别适合需要高实时性的应用场景。
关键优势:相比MCU方案,FPGA驱动可实现纳秒级响应,且通过硬件并行处理能力,能同时管理多个CAN通道而不会增加CPU负载。
2. 硬件架构设计
2.1 系统组成框图
code复制FPGA(Xilinx Artix-7) ↔ 电平转换电路 ↔ SJA1000T ↔ CAN收发器(TJA1050) ↔ CAN总线
2.2 关键硬件选型
- FPGA芯片:Xilinx XC7A35T-1FTG256C
- 选择理由:内置Block RAM适合缓存CAN帧,逻辑资源足够实现多通道驱动
- CAN控制器:SJA1000T
- 优势:支持PeliCAN模式,兼容11/29位ID,内置错误计数和自动重传
- 电平转换:TXB0108PWR
- 解决FPGA(3.3V)与SJA1000T(5V)的IO电平匹配问题
2.3 接口信号定义
| FPGA引脚 | SJA1000T引脚 | 功能说明 |
|---|---|---|
| CAN_ALE | ALE | 地址锁存使能 |
| CAN_WR | WR | 写使能 |
| CAN_RD | RD | 读使能 |
| CAN_CS | CS | 片选信号 |
| DATA[7:0] | AD[7:0] | 双向数据总线 |
3. 核心模块实现
3.1 状态机设计(can_port.v)
采用五状态独热码编码:
verilog复制localp
