ppc can开发

CAN 驱动调试

硬件架构

1 硬件链路

CAN 信号从 P2020 处理器到外部接口经过以下环节:

  • P2020 e500mc 处理器 (eLBC Local Bus 控制器)
  • → 主板 CPLD (FSP2020-MC203, 地址译码)
  • → M890 载板 CPLD (EPM1270T144I4 MAXII)
  • → SN74LVC4245APW (3.3V ↔ 5V 电平转换)
  • → SJA1000T (U11, 独立 CAN 控制器, 16MHz 晶振 Y2)
  • → TJA1040T (U9, CAN 收发器)
  • → J3 接口 (1=GND, 3=CAN+, 5=CAN-, 7=GND)

2 关键芯片

|----------------|-------------|----------|------------------|
| 芯片型号 | 功能 | 位置 | 关键参数 |
| P2020 | PowerPC 处理器 | 主板 | e500mc, eLBC 控制器 |
| EPM1270T144I4 | 载板 CPLD | M890 载板 | MAXII, 协议转换 |
| SJA1000T | CAN 控制器 | M890 U11 | PeliCAN, 16MHz |
| TJA1040T | CAN 收发器 | M890 U9 | 5V, 1Mbps |
| SN74LVC4245APW | 电平转换 | M890 U8 | 3.3V↔5V |

3 内存映射

|----------|------------|--------------|--------|---------------|
| 区域 | 物理地址 | 虚拟地址(VA) | 大小 | 用途 |
| eLBC CS2 | 0xC0000000 | 0xC5000000 | 1MB | SJA1000 寄存器窗口 |
| CPLD 控制 | 0xFFA00000 | 0xC6000000 | 1MB | 载板 CPLD 控制寄存器 |

SJA1000 寄存器访问方式:8-bit 字节访问,基址偏移 0x020,stride=2。即 sja_rd(reg) = *(volatile uint8_t *)(0xC5000000 + 0x020 + reg*2)。

2 . SJA1000 驱动设计原理

1 PeliCAN 寄存器映射

|--------|--------------|--------|---------|-------------------------------------|
| 偏移 | 寄存器名 | 读写 | 复位值 | 说明 |
| 0x00 | MOD | R/W | 0x01 | 模式寄存器 (RM/STM/LOM/AFM/SM) |
| 0x01 | CMR | W | --- | 命令寄存器 (TR/AT/RRB/CDO/SRR) |
| 0x02 | SR | R | --- | 状态寄存器 (RBS/DOS/TBS/TCS/RS/TS/ES/BS) |
| 0x03 | IR | R | 0x00 | 中断寄存器 |
| 0x04 | IER | R/W | 0x00 | 中断使能 |
| 0x06 | BTR0 | R/W* | 0x00 | 总线定时 0 (BRP/SJW) |
| 0x07 | BTR1 | R/W* | 0x00 | 总线定时 1 (TSEG1/TSEG2/SAM) |
| 0x08 | OCR | R/W* | 0x12 | 输出控制 |
| 0x0E | RXERR | R | 0x00 | RX 错误计数器 |
| 0x0F | TXERR | R/W* | 0x00 | TX 错误计数器 |
| 0x10+ | TX/RX Buffer | R/W | --- | 发送/接收缓冲 |
| 0x1F | CDR | R/W* | 0x20 | 时钟分频 (bit7=PeliCAN) |

注:标 * 的寄存器仅在复位模式 (RM=1) 下可配置。

2 初始化流程

步骤 1: 进入复位模式:写 MOD = 0x01 (RM=1)

步骤 2: 切换 PeliCAN:写 CDR = 0x80 (bit7=1)

步骤 3: 配置波特率:写 BTR0/BTR1 (500kbps@16MHz)

步骤 4: 配置输出:写 OCR = 0x1A (推挽输出)

步骤 5: 配置验收滤波器:ACR=0x00, AMR=0xFF (全部接收)

步骤 6: 设置自测模式:写 MOD = 0x05 (RM=1 | STM=1)

步骤 7: 退出复位:写 MOD = 0x04 (RM=0, STM=1)

步骤 8: 等待稳定:延时后读 MOD/SR 确认状态

3 自回环测试原理

SJA1000 自测模式 (STM=1) 下,芯片发送的帧会被自身接收,无需外部 CAN 节点即可完成自收自发。测试流程:

  • 等待 TBS=1 (发送缓冲空闲)
  • 写入 TX Buffer:ID=0x123, DLC=8, data=11 22 33 44 55 66 77 88
  • 写 CMR = TR|SRR (请求发送+自接收)
  • 等待 TCS=1 (发送完成)
  • 等待 RBS=1 (收到帧)
  • 读 RX Buffer,与发送数据比对

3 . 调试过程与实测截图

1 寄存器全读 0xFF

最初 SJA1000 寄存器全部读 0xFF,芯片似乎完全不响应。尝试了 8/16/32 位访问、各种 base 偏移和 stride 值,均无效果。

图 1 早期状态:所有寄存器读 0xFF

最终确认:8-bit 访问,基址偏移 0x020,stride=2 可正确读写 MOD/CDR/BTR/OCR。

图 2 调整访问方式后寄存器读值仍为 FF(RM 未退出时正常)

2 复位模式 (RM) 无法退出

核心卡点:写 MOD 清 RM=0 后读回仍为 1。尝试了 PeliCAN/BasicCAN 切换、不同 OCR/BTR 参数、先设 STM 再清 RM、多次重试等,均无法让 RM 清除。

图 3 反复修改驱动代码过程中的编译错误

3 CPLD 窗口映射

通过阅读原厂 Linux 示例代码,发现载板 CPLD 控制寄存器在物理地址 0xFFA00000。添加 TLB 映射后,首次成功退出复位(MOD=0x04, RM=0)。但同时发现访问 CPLD 窗口后 SJA1000 其他寄存器全部读 0xFF,最终回退了 CPLD 窗口映射。

图 4 CPLD 窗口映射相关的内存配置

4 初始化成功

回退 CPLD 窗口后,SJA1000 成功退出复位:MOD=0x04, SR=0x0F。芯片进入正常工作模式,TBS/TCS/RS/TS/ES/BS 全部置位。

图 5 SJA1000 成功退出复位:MD=0x04, RM=0

5全寄存器扫描与 TX/RX Buffer 异常

通过全寄存器可写性扫描(写 0xAA 读回验证),发现复位模式下寄存器 5-31全部"可写可读",包括保留寄存器。这表明读路径可能存在总线浮空问题------读回值只是上次写入总线的数据。

图 6 全寄存器可写性扫描结果(reg5-reg31 全部可写)

自回环测试中,TX Buffer 写入后读回全 0xFF,RX 数据也全 0xFF。TBS/TCS 均正常置位(芯片认为发送完成),但 RBS 未置位(没有收到帧)。

图 7 发送后状态:TBS=1 TCS=1,但 RX Buffer 为 FF

图 8 TX/RX Buffer 读取异常:全部返回 0xFF

6 完整测试套件输出

编写了全量测试套件(T1-T4),一次性测试所有可能配置:T1 基本寄存器读写、T2 复位退出、T3 可写寄存器扫描、T4 五种波特率/OCR 组合回环。所有配置均自回环失败,RX 数据全 0xFF。

图 9 完整测试套件 T1-T4 输出(5 种配置全部 FAIL)

7 当前版本启动日

图 10 最新版最小化初始化启动日志

图 11 自回环测试结果:data mismatch

5. 问题 发现

**■ 总线浮空现象:**SJA1000 写操作正常(可写入寄存器),但读操作返回 0xFF 或上次写入值。往保留寄存器写 0xAA 后读回仍为 0xAA,说明读数据通路可能存在连接问题。

**■ 批量读寄存器风险:**连续读取多个寄存器(特别是保留寄存器)会导致总线浮空,后续所有读取均返回 0xFF。必须逐个寄存器读写,写后立即读。

**■ CPLD 窗口副作用:**添加 0xFFA00000 的 TLB 映射后,SJA1000 寄存器从正确值变为 0xFF。推测 TLB 表项影响了 eLBC 总线配置。

**■ RM 退出条件:**必须先在复位模式下设置 STM=1,再清 RM=0。直接写 MOD=0x00 会导致芯片立即重新进入复位。

**■ 波特率参数:**500kbps@16MHz:BTR0=0x41, BTR1=0x56, OCR=0x1A (推挽)。

相关推荐
普通人66 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
猫猫不是喵喵.1 天前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
fish_zzzz4 天前
笔记-论数据结构2
1024程序员节
普通人65 天前
PHP文件读写完全指南
开发语言·php·1024程序员节
Martina_03215 天前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节
星云_byto6 天前
CSS布局
人工智能·机器学习·目标跟踪·1024程序员节
张小姐的猫9 天前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
工业HMI实战笔记10 天前
印刷电路板HMI:SMT贴装的元件定位界面
制造·设计规范·设计语言·1024程序员节
Martina_032110 天前
AI生成3D模型一合并网格,材质就串色?用6步检查材质槽、UV与图集重映射
图像处理·人工智能·3d·材质·uv·游戏策划·1024程序员节
橙光成长10 天前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节