1. 项目背景与核心价值
在工业控制、汽车电子和航空航天等领域,CAN总线通信技术因其高可靠性和实时性被广泛应用。SJA1000T作为经典的CAN控制器芯片,配合FPGA使用可以实现灵活高效的通信方案。这个项目要解决的问题是:如何用Verilog/VHDL在FPGA上实现SJA1000T的完整驱动,同时支持标准帧(11位标识符)和扩展帧(29位标识符)两种通信模式。
我去年在车载ECU测试设备开发中就遇到过类似需求。当时测试设备需要同时与多个不同协议的CAN节点通信,有的用标准帧,有的用扩展帧。市面上的现成IP核要么功能不全,要么授权费用高昂,最终我们决定自己开发驱动。这个过程中积累了不少实战经验,特别是时序控制和错误处理方面的技巧,都会在本文详细分享。
2. 硬件架构设计要点
2.1 SJA1000T接口特性分析
SJA1000T通过并行总线与FPGA连接,关键信号包括:
- AD[7:0]:复用地址/数据总线
- ALE:地址锁存使能(下降沿锁存地址)
- /RD、/WR:读写控制信号
- /CS:片选信号
- /INT:中断输出
特别注意:SJA1000T的时序参数要求严格,tAS(地址建立时间)最小20ns,tAH(地址保持时间)最小10ns。在100MHz的FPGA时钟下,必须插入等待周期才能满足时序。
2.2 FPGA侧接口设计
推荐采用三段式状态机实现驱动:
- 空闲状态:等待操作请求
- 配置状态:初始化寄存器(含波特率设置)
- 传输状态:处理数据收发
关键寄存器映射:
verilog复制localparam REG_MODE = 8'h00; // 模式寄存器
localparam REG_CMD = 8'h01; // 命令寄存器
localparam REG_STATUS = 8'h02; // 状态寄存器
localparam REG_INT = 8'h03; // 中断寄存器
localparam REG_ACR = 8'h04; // 验收代码寄存器
localparam REG_AMR = 8'h05; // 验收屏蔽寄存器
