CAN控制器是CAN的核心元件,它实现了CAN协议中数据链路层的全部功能,能够自动完成CAN协议的解析。CAN控制器一般有两种,一种是控制器IC(SJA1000),另一种是集成CAN控制器的MCU(LPC11C00)。

MCU负责实现对功能电路和CAN控制器的控制:在节点启动时,初始化CAN控制器参数;通过CAN控制器读取和发送CAN帧;在CAN控制器发生中断时,处理CAN控制器的中断异常;根据接收到的数据输出控制信号;

接口管理逻辑:解释MCU指令,寻址CAN控制器中的各功能模块的寄存器单元,向主控制器提供中断信息和状态信息。

发送缓冲区和接收缓冲区能够存储CAN总线网络上的完整信息。

验收滤波是将存储的验证码与CAN报文识别码进行比较,跟验证码匹配的CAN帧才会存储到接收缓冲区。

CAN内核实现了数据链路的全部协议。

CAN协议应用层概述

CAN总线只提供可靠的传输服务,所以节点接收报文时,要通过应用层协议来判断是谁发来的数据、数据代表了什么含义。常见的CAN应用层协议有: CANOpen、DeviceNet、J1939、iCAN等。

CAN应用层协议驱动是运行在主控制器(如P89V51)上的程序,它按照应用层协议来对CAN报文进行定义、完成CAN报文的解析与拼装。例如,我们将帧ID用来表示节点地址,当接收到的帧ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送时,将帧ID设置为接收节点的地址。

CAN收发器

SJA1000的输出模式有很多,使用最多的是正常输出模式,输入模式通常不选择比较器模式,可以增大通信距离,并且减少休眠下的电流。

收发器按照通信速度分为高速CAN收发器和容错CAN收发器。

同一网络中要使用相同的CAN收发器。

CAN连接线上会有很多干扰信号,需要在硬件上添加滤波器和抗干扰电路

也可以使用CAN隔离收发器(集成滤波器和抗干扰电路)。

CAN控制器与MCU的连接方式

SJA1000可被视为外扩RAM,地址宽度8位,最多支持256个寄存器

#define REG_BASE_ADDR 0xA000 // 寄存器基址

unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ;

// 写SJA1000寄存器

void WriteSJAReg(unsigned char RegAddr, unsigned char Value) {

*(SJA_CS_Point + RegAddr) = Value;

return;

}

// 读SJA1000寄存器

unsigned char ReadSJAReg(unsigned char RegAddr) {

return (*(SJA_CS_Point + RegAddr));

}

将缓存区的数据连续写入寄存器

…… for (i=0;i将连续多个寄存器连续读入缓存区

…… for (i=0;i头文件包含方案:

每个程序包含用到的头文件

每个程序包含一个公用头文件,公用头文件包含所有其他头文件

#ifndef __CONFIG_H__ // 防止头文件被重复包含