ETC SJA1000

广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
SJA1000 独立的 CAN 控制器应用指南
目录
1
介绍 ............................................................................................................................................. 2
2
概述 ............................................................................................................................................. 2
3
2.1
SJA1000 的特征 ................................................................................................................ 2
2.2
CAN 节点结构.................................................................................................................... 3
系统 ............................................................................................................................................. 4
3.1
SJA1000 的应用 ................................................................................................................ 4
3.2
电源 ................................................................................................................................... 5
3.3
复位 ................................................................................................................................... 5
3.4
振荡器和时钟策略.............................................................................................................. 5
3.4.1
4
3.5
CPU 接口........................................................................................................................... 6
3.6
物理层接口......................................................................................................................... 7
CAN 通迅的控制 .......................................................................................................................... 8
4.1
4.2
5
睡眠和唤醒 .............................................................................................................. 6
控制 SJA1000 的基本功能和寄存器................................................................................... 8
4.1.1
发送缓冲器/接收缓冲器............................................................................................ 9
4.1.2
验收滤波器 ............................................................................................................ 10
CAN 通讯的功能 .............................................................................................................. 14
4.2.1
初始化.................................................................................................................... 15
4.2.2
传输 ....................................................................................................................... 19
4.2.3
中止发送 ................................................................................................................ 22
4.2.4
接收 ....................................................................................................................... 23
4.2.5
中断 ....................................................................................................................... 27
PELICAN 模式的功能 ................................................................................................................ 30
5.1
接收 FIFO/报文计数器/直接 RAM 访问 ............................................................................ 30
5.2
错误分析功能 ................................................................................................................... 32
5.2.1
错误计数器 ............................................................................................................ 33
5.2.2
出错中断 ................................................................................................................ 33
5.2.3
错误码捕捉 ............................................................................................................ 34
5.3
仲裁丢失捕捉 ................................................................................................................... 36
5.4
单次发送 .......................................................................................................................... 37
5.5
仅听模式 .......................................................................................................................... 38
5.6
自动位速率检测 ............................................................................................................... 38
5.7
CAN 的自测试.................................................................................................................. 39
5.8
接收同步脉冲的产生 ........................................................................................................ 40
6
参考文献 .................................................................................................................................... 41
7
附录 ........................................................................................................................................... 41
第 1 页 共 1 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
1
介绍
SJA1000 是一个独立的 CAN 控制器
它在汽车和普通的工业应用上有先进的特征
PCA82C200 在硬件和软件都兼容 因此它将会替代 PCA82C200
于多种应用
特别在系统优化
由于它和
SJA1000 有一系列先进的功能 适合
诊断和维护方面非常重要
本文是要指导用户设计基于 SJA1000 的完整的 CAN 节点 同时本文还提供典型的应用电路图和编程
的流程图
2
概述
SJA1000 独立的 CAN 控制器有 2 个不同的操作模式
−
BasicCAN 模式 和 PCA82C200 兼容
−
PeliCAN 模式
BasicCAN 模式是上电后默认的操作模式 因此
用 PCA82C200 开发的已有硬件和软件可以直接在
SJA1000 上使用 而不用作任何修改
PeliCAN 模式是新的操作模式 它能够处理所有 CAN2.0B 规范的帧类型
而且它还提供一些增强功
能使 SJA1000 能应用于更宽的领域
2.1
SJA1000 的特征
SJA1000 的特征能分成 3 组
1
已建立的 PCA82C200 功能
2
改良的 PCA82C200 功能 这组功能的部份已经在 PCA82C200 里实现 但是 在 SJA1000
里 这些功能在速度
3
这组的功能已经在 PCA82C200 里实现
大小和性能方面得到了改良
PeliCAN 模式的增强功能 在 PeliCAN 模式里 SJA1000 支持一些错误分析功能支持系统诊断
系统维护
系统优化
而且这个模式里也加入了对一般 CPU 的支持和系统自身测试的功能
SJA1000 所有的特征包括它们在应用中主要的优点都被列在下面的表中
表1
SJA1000 应用中的优点
已建立的 PCA82C200 功能
灵活的微处理器接口
允许接口大多数微型处理器或微型控制器
可编程的 CAN 输出驱动器
对各种物理层的分界面
CAN 位频率高达 1Mbit/s
SJA1000 覆盖了位频率的所有范围
包括高速应用
提高的 PCA82C200 功能
CAN2.0B(passive)
SJA1000 的 CAN2.0B passive 特征允许 CAN 控制器接收有 29 位标识
符的报文
64 个字节接收 FIFO
接收 FIFO 可以存储高达 21 个报文
这延长了最大中断服务时间
避
免了数据超载
24MHz 时钟频率
微处理器的访问更快和 CAN 的位定时选择更多
接收比较器旁路
减少内部延迟
由于改进的位定时编程
使 CAN 总线长度更长
PeliCAN 模式的增强功能
CAN2.0B active
CAN2.0B active 支持带有 29 位标识符的网络扩展应用
发送缓冲器
有 11 位或 29 位标识符的报文的单报文发送缓冲器
增强的验收滤波器
两个验收滤波器模式
可读的错误计数器
支持错误分析 在原型阶段和在正常操作期间可用于 诊断 系统维护
可编程的出错警告界限
系统优化
支持 11 位和 29 位标识符的滤波
第 2 页 共 2 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
错误代码捕捉寄存器
出错中断
仲裁丢失捕捉中断
支持系统优化包括报文延迟时间的分析
单次发送
使软件命令最小化和允许快速重载发送缓冲器
仅听模式
SJA1000 能够作为一个认可的 CAN 监控器操作 可以分析 CAN 总线
通信或进行自动位速率检测
支持全部 CAN 节点的功能自测试或在一个系统内的自接收
自测试模式
2.2
CAN 节点结构
通常 每个 CAN 模块能够被分成不同的功能块
SJA1000 用使应用[3]
[4]
[5]最优化的 CAN 收发
器连接到 CAN 总线 收发器控制从 CAN 控制器到总线物理层或相反的逻辑电平信号
上面一层是一个 CAN 控制器 它执行在 CAN 规范[8]里规定的完整是 CAN 协议 它通常用于报文缓
冲和验收滤波
而所有这些 CAN 功能都由一个模块控制器
模块控制器控制
它负责执行应用的功能 例如 控制执行器 读传感
模块控制器
MMI
器和处理人机接口
如图 1 所示
SJA1000 独立的 CAN 控制器通常位于微型控制器和收发器之间 大多数情况下这个控
制器是一个集成电路
Sensors
Actuators
MMI
Sensors
Actuators
MMI
CAN bus
图1
2.3
CAN 模块装置
结构图
下图是 SJA1000 的结构图
第 3 页 共 3 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
CAN-Bus Line
SJA1000
Transceiver
Transmit
Buffer
图2
根据 CAN 规范
SJA1000 的结构图
CAN 核心模块控制
CAN 帧的发送和接收
核心模块
接口管理逻辑负责连接外部主控制器
该控制器能可以是微型控制器或任何其他器件 经过 SJA1000
接口管理逻辑
复用的地址/数据总线访问寄存器和控制读/写选通信号都在这里处理
BasicCAN 功能 还加入了一个新的 PeliCAN 功能
因此
SJA1000 的发送缓冲器
发送缓冲器能够存储一个完整的报文
发送缓冲器
另外除了 PCA82C200 已有的
附加的寄存器和逻辑电路主要在这块里生效
扩展的或标准的
当主控制器初始化发送
接口
管理逻辑会使 CAN 核心模块从发送缓冲器读 CAN 报文
当收到一个报文时 CAN 核心模块将串行位流转换成用于验收滤波器的
验收滤波器的并行数据
通过这个可编程的
验收滤波器的
滤波器
SJA1000 能确定主控制器要接收哪些报文
所有收到的报文由验收滤波器验收并存储在接收
接收 FIFO 储存报文的多少由工作模式决定 而最多能存
储 32 个报文
3
因为数据超载可能性被大大降低
这使用户能更灵活地指定中断服务和中断优先级
系统
为了连接到主控制器 SJA1000 提供一个复用的地址/数据总线和附加的读/写控制信号 SJA1000 可
以作为主控制器外围存储器映射的 I/O 器件
3.1
SJA1000 的应用
SJA1000 的寄存器和管脚配置使它可以使用各种各样集成或分立的 CAN 收发器 由于有不同的微控
制器接口 应用可以使用不同的微控制器
图 3 所示是是一个包括 80C51 微型控制器和 PCA82C251 收发器的典型 SJA1000 应用 CAN 控制器
功能像是一个时钟源 复位信号由外部复位电路产生 在这个例子里 SJA1000 的片选由微控制器的 P2.7
口控制 否则 这个片选输入必须接到 VSS 它也可以通过地址译码器控制 例如 当地址/数据总线用于
其他外围器件的时侯
第 4 页 共 4 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
23
AD0 / P0.0
24
AD1 / P0.1
25
AD2 / P0.2
26
AD3 / P0.3
27
AD4 / P0.4
28
AD5 / P0.5
1
AD6 / P0.6
2
AD7 / P0.7
4
P2.7
3
ALE / PROG
5
RD / P3.7
6
WR/ P3.6
16
INT0 / P3.2
7
XTAL1
17
RST
AD0
TX0
AD1
TX1
AD2
RX0
AD3
RX1
AD4
AD5
MODE
AD6
VDD1
AD7
VSS1
CS
VDD2
ALE
VSS2
RD
VDD3
WR
INT
VSS3
CLK OUT
XTAL1
13
TXD
CANH
14
19
RXD
20 *
11
CANL
( Intel Mode )
V
22
V
8
V
CAN bus
18
21
12
15
9
C1
C1 = C2 = 15pF
6 ... 24 MHz
RST
XTAL2
10
C2
* Comparator Bypass = active
图3
3.2
典型的 SJA1000 应用
电源
SJA1000 有三对电源引脚
用于 CAN 控制器内部不同的数字和模拟模块
VDD1/VSS1
内部逻辑
数字
VDD2/VSS2
输入比较器
模拟
VDD3/VSS3
输出驱动器
模拟
为了有更好的 EME 性能 电源应该分隔开来 例如为了抑制比较器的噪声 VDD2 可以用一个 RC 滤
波器来退耦
3.3
复位
为了使 SJA1000 正确复位 CAN 控制器的 XTAL1 管脚必须连接一个稳定的振荡器时钟 见 3.4 节
引脚 17 的外部复位信号要同步并被内部延长到 15 个 tXTAL
见[1]
3.4
这保证了 SJA1000 所有寄存器能够正确复位
要注意的是上电后的振荡器的起振时间必须要考虑
振荡器和时钟策略
SJA1000 能用片内振荡器或片外时钟源工作 另外 CLKOUT 管脚可被使能 向主控制器输出时钟频
率 图 4 显示了 SJA1000 应用的四个不同的定时原理 如果不需要 CLKOUT 信号 可以通过置位时钟分
频寄存器 Clock Off=1
关断 这将改善 CAN 节点的 EME 性能
CLKOUT 信号的频率可以通过时钟分
频寄存器改变
fCLKOUT = fXTAL / 时钟分频因子 1
2
4
6
8
10
12
14
上电或硬件复位后 时钟分频因子的默认值由所选的接口模式
引脚 11
决定
如果使用 16MHz 的
晶振 Intel 模式下 CLKOUT 的频率是 8 MHz Motorola 模式中 复位后的时钟分频因子是 12 这种情况
CLKOUT 会产生 1.33MHz 的频率
第 5 页 共 5 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
Clock Off = 1
Clock Off = 1
µ
Clock Off = 0
Clock Off = 1
µ
µ
图4
3.4.1
时钟策略
睡眠和唤醒
置位命令寄存器的进入睡眠位
BasicCAN 模式 或模式寄存器
PeliCAN 模式
的睡眠模式位后
如果没有总线活动和中断等待 SJA1000 就会进入睡眠模式 振荡器在 15 个 CAN 位时间内保持运行状态
此时 微型控制器用 CLKOUT 频率来计时 进入自己的低功耗模式 如果出现三个唤醒条件之中的一个[1]
振荡器会再次启动并产生一个唤醒中断 振荡器稳定后
3.5
CLKOUT 频率被激活
CPU 接口
SJA1000 支持直接连接到两个著名的微型控制器系列 80C51 和 68xx 通过 SJA1000 的 MODE 引
脚可选择接口模式
Intel 模式
MODE 高
Motorola 模式
MODE 低
地址/数据总线和读/写控制信号在 Intel 模式和 Motorola 模式的连接如图 5 所示
Philips 基于 80C51
系列的 8 位微控制器和 XA 结构的 16 位微型控制器都使用 Intel 模式
为了和其他控制器的地址
数据总线和控制信号匹配
必须要附加逻辑电路
间不产生写脉冲 另一个方法在这个时候使片选输入是高电平
第 6 页 共 6 页
禁能 CAN 控制器
但是必须确保在上电期
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
80C51 C
SJA1000
AD0
:
:
:
:
AD7
AD 7 .. 0
68xx C
AD0
:
:
:
:
AD7
AD0
:
:
:
:
AD7
RD
RD
WR
WR
R/W
ALE
ALE
AS
V
80C51XA
SJA1000
AD 7 .. 0
E
MODE
AD0
:
:
:
:
AD7
RD
WR
ALE
GND
MODE
C
A0
SJA1000
A3
A4D0
:
:
:
:
A11D7
AD 7 .. 0
RD
AD0
:
:
:
:
AD7
RD
WRL
WR
ALE
ALE
V
MODE
图5
3.6
SJA1000 的 CPU 时钟接口
物理层接口
为了和 PCA82C200 兼容 SJA1000 包括一个模拟接收输入比较器电路 如果收发器的功能由分立元
件实现
就要用刀这个集成的比较器
第 7 页 共 7 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
Comparator Bypass =
inactive
Comparator Bypass =
(CBP = 0)
active
(CBP = 1)
t
t
图6
SJA1000 的接收输入比较器
如果使用外部集成收发器电路 而且没有在时钟分频寄存器里使能比较器旁路功能 RX1 输出要被连
接到 2.5V 的参考电压
现有的收发器电路参考电压输出
和 CBP=非激活 另外唤醒信号的通道被下拉
使用 SJA1000 的比较器旁路功能 图 7
图 6 显示了两种设置的相应电路 CBP=激活
对于使用集成的收发器电路的所有新应用
我们建议激活
如果这个功能被使能 施密特触发器的输入有效 内部的传
播延迟 tD2 比接收比较器的延迟 tD1 要小得多 它对最大的总线长度[6]有正面的影响 另外 休眠模式的电
流将显著降低
TX0
SJA1000
TX1
TxD
PCA82C250
PCA82C251
TJA1053
n.c.
RxD
RX0
CANH
CANL
RX1
OCR= 1A H
CDR= X1XX XXXX H
图7
4
4.1
带有集成收发器电路的标准应用
CAN 通迅的控制
控制 SJA1000 的基本功能和寄存器
SJA1000 的功能配置和行为由主控制器的程序执行 因此 SJA1000 能满足不同属性的 CAN 总线系统
的要求
主控制器和 SJA1000 之间的数据交换经过一组寄存器
控制段
和一个 RAM 报文缓冲器
完
成 RAM 的部分的寄存器和地址窗口组成了发送和接收缓冲器 对于主控制器来说就象是外围器件寄存器
表 2 根据它们在系统的作用分组列出了这些寄存器
注意 一些寄存器只在 PeliCAN 模式有效 控制寄存器就仅在 BasicCAN 模式里有效 而且一些寄存
器是只读的或只写的
还有一些只能在复位模式中访问
关于寄存器的读 和
或
写访问
位定义和复位值等更多信息
第 8 页 共 8 页
可在数据表[1]中找到
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
表2
SJA1000 内部寄存器的分类
使用类型
选择不
寄存器地址
寄存器名称 符号
PeliCAN 模式
MOD
模式
功能
BasicCAN 模式
0
选择睡眠模式
同的操
验收滤波器模式
自测试模式 只听模式和复位模式
作模式
控制
CR
0
在 BasicCAN 模式里选择复位模式
的要素
命令
CMR
1
BasicCAN 模式的睡眠模式命令
31
在 CLKOUT 设置时钟信号
CDR
时钟分频器
31
引脚
7 选择 PeliCAN 模式 比较器旁
路模式 TX1 管脚 14 输出模式
设
定
ACR
验收码
16~29
4
20~23
5
验收滤波器位的模式选择
CAN 通
验收屏蔽
讯的要
总线定时寄存器0 BTR0
6
6
素
总线定时寄存器1 BTR1
7
7
8
8
输出驱动器属性的选择
1
1
自接收 清除数据超载 释放接收缓
AMR
OCR
输出控制
命令
CMR
位定时参数的设置
冲器 中止传输和传输请求的命令
状态
SR
2
2
报文缓冲器的状态
CAN 核心模
块的状态
中断
IR
3
IER
中断使能
控制
3
CAN 中断标志
4
在 PeliCAN 模式使能和禁能中断
CR
0
在 BasicCAN 模式使能和禁能中
断事件
复杂的
仲裁丢失捕捉
ALC
11
显示仲裁丢失位的位置
错误检
错误代码捕捉
ECC
12
显示最近一次的错误类型和位置
测和分
出错警告界限 EWLR
13
产生出错警告中断的阀值选择
析的要
RX 错误计数 RXERR
14
反映接收错误计数器的当前值
素
TX 错误计数 TXERR
14
Rx 报文计数器 RMC
29
接收 FIFO 里的报文数量
RX 缓 冲 器 起 始 地 址
30
显示接收缓冲器提供的报文的当
15
反映发送错误计数器的当前值
前内部 RAM 地址
RBSA
信息缓
发送缓冲器
TXBUF
16~28
10~19
冲器
接收缓冲器 RXBUF
16~28
20~29
4.1.1
发送缓冲器/接收缓冲器
要在 CAN 总线上发送的数据被载入 SJA1000 的存储区 这个存储区叫 发送缓冲器
上收到的数据也存储在 SJA1000 的存储区
这个存储区叫 接收缓冲器
字节的标识符和帧信息 取决于模式和帧类型
义和组成等更多信息
•
•
PeliCAN 模式
缓冲器长 10 个字节
见表 3
−
2 个标识符字节
−
最多 8 个数据字节
这些缓冲器是 13 个字节长
−
这些缓冲器包括 2
3或5个
而最多可以包含 8 个数据字节 关于报文缓冲器各位的定
见数据表[1]
BasicCAN 模式
从 CAN 总线
见表 4
1 字节帧信息
第 9 页 共 9 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
表3
2 个或 4 个标识符字节
−
最多 8 个数据字节
标准帧或扩展帧
BasicCAN 模式里的 RX 和 TX 缓冲器
CAN 地址
十进制
TX 缓冲器 10
RX 缓冲器
RX 缓冲器
组成和注释
标识符字节 1
8 位标识符
标识符字节 2
3 位标识符
21
数据字节 1~8
4 位数据长度代码
最多 8 个数据字节
由数据长度代码指明
22~29
PeliCAN 模式里的 RX 缓冲器
CAN 地址
1 位远程传输请求位
表示数据字节的数量
TX 缓冲器 12~19
RX 缓冲器
名称
20
TX 缓冲器 11
表4
−
十进制
16
1
读访问
和 TX 缓冲器
名称
组成和标注
帧信息
1 位说明
写访问
2
如果报文包括一个标准帧或扩展帧
1 位远程传输请求位
4 位数据长度码
17
18
标识符字节 1
2
标准帧 11 位标识符
扩展帧
19
20
标识符字节 3
帧类型
数据字节 1~8
标准帧
19~26
扩展帧
21~28
4
16 位标识符
仅扩展帧 13 个标识符
由数据长度代码说明 最多 8 个数据字节
1
整个接收 FIFO 64 个字节
2
TX 缓冲器的读访问可通过 CAN 地址 96~108 完成
4.1.2
说明数据字节的数量
能通过 CAN 地址 32~95 访问
见 5.1 节
也见 5.1 节
验收滤波器
独立的 CAN 控制器 SJA1000 装配了一个多功能的验收滤波器 该滤波器允许自动检查标识符和数据
字节
使用这些有效的滤波方法
可以防止对于某个节点无效的报文或报文组存储在接收缓冲器里
因此
降低了主控制器的处理负载
滤波器由验收码寄存器和屏蔽寄存器根据数据表[1]给定算法来控制
器中的值进行逐位比较
接收屏蔽寄存器定义与比较相关的位的位置
文的相应
相应的位与验收代码寄存器相应的位相同
相应
接收到的数据会和验收代码寄存
0=相关
1=不相关
只有收到报
报文才会被接收
BasicCAN 模式里的验收滤波
SJA1000 在这个模式可以即插即用地取代 PCA82C200
PCA82C200 的一样
硬件和软件
也可以使用 这个滤波器是由两个 8 位寄存器
因此验收 滤波功能与
验收码寄存器
ACR 和验收屏
蔽寄存器 AMR 控制 CAN 报文标识符的高 8 位和这些寄存器里值相比较 见图 8 因此可以定义若干
组的标识符为被任何一个节点接收
MSB
例子
ACR 包括
验收码寄存器
验收屏蔽寄存器
AMR 包括
带有 11 位的标识符信息被接收
X=无关
LSB
0
1
1
1
0
0
1
0
0
0
1
1
1
0
0
0
0
1
X
X
X
0
1
0
ID.10
第 10 页 共 10 页
X
X
X
ID.0
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
在验收屏蔽寄存器里是 1 的位置上 标识符相应的位可以是任何值 这对于三个最低位也一样 因
此在这个例子里可以接收 64 个不同的标识符
标识符其他的位必须等于验收代码寄存器相应位的值
Filter
JK710011.GWM (1)
图8
BasicCAN 模式的验收滤波
PeliCAN 模式的验收滤波
PeliCAN 模式的验收滤波已被扩展
4 个 8 位的验收码寄存器 ACR0
ACR1
ACR2 和 ACR3
和
验收屏蔽寄存器 AMR0 AMR1 AMR2 和 AMR3 可以用多种方法滤波报文 如图 9 和图 10 所示 这
些寄存器可用于控制一个长的滤波器或两个短的滤波器 报文的哪些位用于验收滤波 取决于收到的帧 标
准帧或扩展帧 和选择的滤波器模式 单滤波器或双滤波器
有关报文的哪些位和验收码和屏蔽位相比较
的更多信息请看表 5 从图和表可以看出 标准帧的验收滤波可以包括 RTR 位甚至数据字节 对于不需要
经过验收滤波的报文位
例如报文组被定义为接受
如果报文不包括数据字节
例如
验收屏蔽寄存器必须相应的位位置上置
是一个远程帧或者数据长度码为零
则如果标识符直到 RTR 位都有效的话
1
但是验收滤波包括数据字节
报文会被接收
例1
假设前面描述的同样的 64 个标准帧报文要在 PeliCAN 模式里滤波 可以通过使用一个长滤波器完成
单滤波器模式
验收代码寄存器 ACRn
和验收屏蔽寄存器
n
0
AMRn
包括
1(高四位)
2
3
ACRn
01XX X010
XXXX
XXXX XXXX
XXXX XXXX
AMRn
0011
1111
1111
1111
接收的报文 ID.28~ID.18 RTR
01xx x010
X
不相关
x
任意
1000
1111
1111
xxxx
只使用了 ACR1 和 AMR1 的高四位
在验收屏蔽寄存器是 1 的位置上 标识符相应的位可以是任何值 譬如远程发送请求位和数据字节
1 和 2 的位
JK710011.GWM (2)
图9
PeliCAN 模式的验收滤波
第 11 页 共 11 页
单滤波器模式
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
例2
假设下面 2 个有标准帧标识符的报文在标识符不用进一步译码就被接收
收
数据和远程帧必须被正确接
数据字节不要求验收滤波
报文 1
ID.28
1011 1100
101
ID.18
信息 2
ID.28
1111 0100
101
ID.18
使用单滤波器模式可以接收到四个报文而不仅是要求的两个
N
0
1(高 4 位)
2
3
ACRn
1X11
X100
101X
XXXX
XXXX
XXXX
XXXX
AMRn
0100
1000
0001
1111
1111
1111
1111
1011
0100
101x
1111
0100
101x
报文 2
1011
1100
101x
报文 1
1111
1100
101x
接收的报文
ID.28~ID.18
RTR
X
不相关
x
任意
只使用了 ACR1 和 AMR1 的高四位
这个结果不满足不进一步解码而接收两条信息的要求
使用双滤波器可以得到正确的结果
滤波器 1
n
0
滤波器 2
1
3
2
3
低四位
高四位
ACRn
1011
1100
101X
XXXX
XXXX
1111
0100
101X
AMRn
0000
0000
0001
1111
1111
0000
0000
0001
1011
1100
101X
1111
0100
101X
接收的信息
ID.28~ID.18
RTR
报文 1
X
不相关
x
报文 2
任意
报文 1 被滤波器 1 接收 报文 2 被滤波器 2 接收 如果报文至少被两个滤波器中的一个接收 报文就
被存到接收 FIFO 这种方法可满足于这种要求
例3
在这个例子里 使用一个长的验收滤波器滤波一组带有扩展帧标识符的报文
n
0
1
2
3
ACRn
1011
0100
1011
000X
1100
XXXX
0011
0XXX
AMRn
0000
0000
0001
0001
0000
1111
0000
0111
1011
0100
1011
000x
1100
xxxx
0011
0x
高六位
接收的报文
ID.28~ID.18
X
RTR
不相关
x
任意
只使用了 ACR1 和 AMR1 的高六位
第 12 页 共 12 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
JK710011.GWM (3)
图 10
PeliCAN 模式的验收滤波
双滤波器模式
例4
有些使用标准帧系统仅用 11 位标识符和头两个数据字节识别报文 如果报文超过 8 个数据字节 头两
个数据字节定义为报文头和使用分段存储协议就会使用像这样的协议
例如 DeviceNet 对于这种系统类
型 SJA1000 除了滤波 11 位标识符和 RTR 位外 在单滤波器模式里能滤波两个数据字节 在双滤波器模
除了 11 位标识符和 RTR 位
式里能过滤一个数据字节
下面的例子显示了用双滤波器模式 在这种系统里有效地滤波报文
滤波器 1
n
0
滤波器 2
1
3
2
3
低四位
高四位
ACRn
1110
1011
0010
1111
1001
1111
0100
XXX0
AMRn
0000
0000
0000
0000
0000
0000
0000
1110
接收的报文
1110
1011
0010
1111
1001
1111
0100
xxx 0
标识符+RTR
X
不相关
x
头一个数据字节
标识符
任意
滤波器 1 滤波的报文有
−
标识符
11101011001
−
RTR
0
−
数据字节 11111001
也就是说是数据帧
以及
这是指例如 DeviceNet
滤波器 2 用来过滤一组 8 个报文
其中报文有
−
标识符 11110100 000
11110100111
−
RTR
0
到
一个信息的所有段都被过滤
以及
也就是数据帧
第 13 页 共 13 页
RTR
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
PeliCAN 模式的验收滤波器总结
表5
图9
双滤波器模式 图 10
帧类型
单滤波器模式
标准
验收的报文位
滤波器 1
- 11 位标识符
验收的报文位
- RTR 位
- 11 位标识符
- 第一个数据字节
8位
- RTR 位
- 第二个数据字节
8位
- 第一个数据字节
8位
使用的验收码寄存器和屏蔽寄存器
使用的验收码寄存器和屏蔽寄存器
- ACR0 或 ACR1/ACR2/ACR3 的高四位
- ACR0/ACR1 或 ACR3 的低四位
- AMR0 或 AMR1/AMR2/AMR3 的高四位
- AMR0/AMR1 或 AMR3 的低四位
接收屏蔽寄存器的未使用的位应设为
1
滤波器 2
用于验收测试的报文位
- 11 位标识符
- RTR 位
使用的验收码寄存器和验收屏蔽寄存器
- ACR2 或 ACR3 的高四位
- AMR2 或 AMR3 的高四位
扩展
用于验收的报文位
滤波器 1
- 11 位基本的标识符
用于验收的报文位
- 18 位扩展的标识符
- 11 位基本标识符
- RTR 位
- 扩展标识符的 5 个最高位
使用的验收码和验收屏蔽寄存器
使用的验收码和验收屏蔽寄存器
- ACR0/ACR1/ACR2 或 ACR3 的高六位
- ACR0/ACR1 和 AMR0/AMR1
- AMR0/AMR1/AMR2 或 AMR3 的高六位
验收屏蔽寄存器的未使用的位应设为
1
滤波器 2
用于测试验收的报文位
- 11 位基本的标识符
- 扩展标识符的 5 个最高位
使用的验收码和验收屏蔽寄存器
- ACR2/ACR3/和 AMR2/AMR3
4.2
CAN 通讯的功能
通过 CAN 总线建立通讯的步骤是
•
系统上电后
−
根据 SJA1000 的硬件和软件连接设置主控制器
−
根据选择的模式 验收滤波 位定时等等设置 CAN 控制器的通讯 这也是在 SJA1000 硬件
复位后进行
•
在应用的主过程中
−
准备要发送的报文并激活 SJA1000 发送它们
−
对被 CAN 控制器接收的报文起作用
−
在通讯期间
对发生的错误起作用
第 14 页 共 14 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
图 11 表示了程序的总体流程
4.2.1
接下来会详细地解说那些直接控制 SJA1000 的流程
初始化
如上面提到的一样 独立的 CAN 控制器 SJA1000 必须在上电或硬件复位后设置 CAN 通讯 在由主
控制器操作期间
如图 12
它可能会发送一个
软件
复位请求
SJA1000 会被重新配置 再次初始化
流程图
本章还会给出一个使用 80C51 派生的微控制器编程的例子
上电后 主控制器在运行完自已的特殊复位程序后进入 SJA1000 的设置程序 由于图 11 的 configure
control lines...
部份和使用的控制器有关 所以这里不作讨论
但是这章的例子主要显示了如何配置一个
80C51 派生器件
初始化过程的描述见图 12
假设上电后独立 CAN 控制器在管脚 17 得到一个复位脉冲
低电平
使
它进入复位模式 在设置 SJA1000 的寄存器前 主控制器通过读复位模式/请求标志来检查 SJA1000 是否
已达到复位模式 因为要得到配置信息的寄存器仅在复位模式可写
在复位模式中 主控制器必须配置下面的 SJA1000 控制段寄存器
•
•
•
•
•
模式寄存器
仅在 PeliCAN 模式
−
验收滤波器模式
−
自我测试模式
−
仅听模式
时钟分频寄存器
为应用选择下面的工作模式
定义
−
使用 BasicCAN 模式还是 PeliCAN 模式
−
是否使能 CLKOUT 管脚
−
是否旁路 CAN 输入比较器
−
TX1 输出是否用作专门的接收中断输出
验收码寄存器和验收屏蔽寄存器
−
定义接收报文的验收码
−
对报文和验收码进行比较的相关位定义验收屏蔽码
总线定时寄存器
见[6]
−
定义总线的位速率
−
定义位周期内的采样点 位采样点
−
定义在一个位周期里采样的数量
输出控制寄存器
−
定义 CAN 总线输出管脚 TX0 和 TX1 的输出模式 正常输出模式 时钟输出模式 双相输出
模式或测试输出模式
−
定义 TX0 和 TX1 输出管脚配置
悬空
下拉
上拉或推挽以及极性
第 15 页 共 15 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
power on reset of
microcontroller
application specific reset
process
wait untill SJA1000 is powered
up properly
depends on type of
micro controller
configure control lines
(interrupt, reset, chip select
etc.) for the communication
between microcontroller and
SJA1000
see flow
"Initialization of SJA1000"
initialize the SJA1000 for the
communication on the CAN
bus
main and interrupt processes
of the application incl. the
communication with SJA1000
see flows
"Transmission of a message",
"Reception of a message"
etc.
end of program
图 11
程序的总体流程图
第 16 页 共 16 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
start of initialization or
reconfiguration
disable CAN interrupt source in the
host controller
enter reset mode/request
NO
reset mode/request =
reset/present?
YES
configure clock divider register:
1. PeliCAN or BasicCAN
2. CAN input comparator bypass
3. CLK OUT control and frequency
4. usage of TX1
con gure acceptance co e an
configure bus timing registers
configure output control register
enter operating/normal mode
NO
reset mode/request
= normal/absent?
YES
if used: enable CAN interrupts,
enable CAN interrupt source in the
host controller
end of configuration
图 12
SJA1000 的初始化
在将这个信息发送到 SJA1000 的控制段后
须先检查标志是否确实被清除
在硬件复位等待期间
求标志变成 复位/存在
流程图
SJA1000 会清除复位模式/请求标志进入工作模式 要必
是否进入了工作模式才能进行下一步的操作
管脚 17 是低电平
不能清除复位模式/请求标志
查阅数据表[1]可得到进一步的信息
第 17 页 共 17 页
这通过循环读标志实现
因为这将迫使复位模式/请
因此这个循环是不断尝试清除标志和检查
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
是否成功离开复位模式
CAN 控制器的中断可被使能
进入工作模式后
如果适合的话
例子 SJA1000 的配置和初始化
这个例子是基于图 3 的应用例子 在下面编程例子里
SJA1000 输出的时钟作为时钟信号
位信号 在复位[1]期间
钟输出使能
它以
一个复位电路为微型控制器和 CAN 控制器提供硬件复
SJA1000 的时钟分频寄存器清零 因此 CAN 控制器进入 BasicCAN 模式 且时
CAN 控制器能够给 S87C654 传送时钟信号
当晶振起振后
它支持 80C51 系列控制器
在附录里
在上电期间
假设微型控制器 S87C654 是主控制器
收到这个时钟信号后
管脚 11 的时钟频率是 fCLK/2
微控制器启动自已的复位过程
给出了不同的常数和变量等等的定义
如图 11 所示
变量在 BasicCAN 和 Pelican 模式里的的含意可以
不同 例如 InterruptEnReg 在 BasicCAN 模式里是指控制寄存器但在 Pelican 模式里是指中断使能寄存
器
编程使用的是 C 语言
在这个例子里
假设 CAN 控制器要被初始化然后在 PeliCAN 模式里使用
这很容易地就可以从
BasicCAN 模式相应的初始化程序实现
第一步必须在主控制器和 SJA1000 之间设定一个通讯链路 片选 中断等等
如图 11 的 configure
Control lines...
/*定义中断优先级和控制 电平
激活
见 4.2.5 章
*/
PX0=PRIORITY_HIGH
/*设 CAN 有一个高优先级中断
*/
IT0
/*中断 0 为电平激活
*/
INTLEVELACT
/*使能 SJA1000 的通讯接口
*/
CS ENABLE_N;
/*SJA1000 接口使能
/*通讯连接的定义结束―――――――――――――――――――――――――――――
*/
*/
第二步是初始化 SJA1000 的所有内部寄存器 因为一些寄存器在仅复位模式期间可被写 所以在写入
之前必须检查
上电后
/*中断禁能 如果使用
SJA1000 被设定为复位模式
如果复位模式已被置位 在循环里面可以检查到
*/
上电后不需要
EA DISABLE
/*所有中断禁能
*/
SAJIntEn=DISABLE;
/*来自 SJA100 的外部中断禁能
*/
/*设定复位模式/请求位
注
上电后
SJA1000 处于 BasicCAN 模式
*/
在超时和出现错误信号后跳出循环
while((ModeControlReg & RM_RR_Bit)= =ClrByte)
{
/*其他位而不是复位模式/请求位没有改变
ModeControlReg = ModeControlReg
*/
RM_RR_Bit
}
/*根据图 3 给定的硬件设定时钟分频寄存器
选择 PeliCAN 模式
旁路 CAN 输入比较器作为外部收发器使用
为控制器 S87C654 选择时钟
*/
第 18 页 共 18 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
ClockDiv 标识符 eReg=CANMode_Bit
/*如果需要 在上电后总是必须的
CBP_Bit
DivBy2
CAN 中断禁能
写 SJA1000 中断使能/控制寄存器
*/
InterruptEnReg=ClrIntEnSJA
/*定义验收代码和屏蔽
*/
AcceptCode0Reg=ClrByte
AcceptCode1Reg=ClrByte
AcceptCode2Reg=ClrByte
AcceptCode3Reg=ClrByte
AcceptMask0Reg=DontCare
/*接收任何标识符
*/
AcceptMask1Reg=DontCare
/*接收任何标识符
*/
AcceptMask2Reg=DontCare
/*接收任何标识符
*/
AcceptMask3Reg=DontCare
/*接收任何标识符
*/
/*配置总线定时
*/
/*位频率
*/
1Mbit/s@24MHz 总线被采样一次
BusTiming0Reg=SJW_MB_24
Prec_MB_24
BusTiming1Reg=TSEG2_MB_24
/*配置 CAN 输出
TSEG1_MB_24
TX1 悬空 TX0 推挽
*/
正常输出模式
OutControlReg = Tx1Float
Tx0PshPull
NormalMode
/*离开复位模式/请求 也就是转向操作模式
S87C654 的中断使能
但 SJA1000 的 CAN 中断禁能
这可以在一个系统里面分别完成
*/
/*清除复位模式位 选择双验收滤波器模式
关闭自我测试模式和仅听模式
清除休眠模式
*/
唤醒
do
/*等待 直到 RM_RR_Bit 清零
/*在超时和出现错误后跳出循环
*/
*/
{
ModeControlReg = ClrByte
}while((ModeControlReg&RM_RR_Bit) != ClrByte)
SJAIntEn = ENABLE
/*SJA1000 的外部中断使能
*/
EA
/*所有中断使能
*/
= ENABLE
/*------------------------------ SJA1000 初始化例子的结束 --------------------------------------------------*/
4.2.2
传输
根据 CAN 协议规范[8]
报文的传输由 CAN 控制器 SJA1000 独立完成
第 19 页 共 19 页
主控制器必须将要发送传送
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
到发送缓冲器的报文 然后将命令寄存器里的 发送请求 标志置位 发送过程可由 SJA1000 的中断请求
控制或由查询控制段的状态标志控制
中断控制的发送
根据图 13 给出的控制器的主要过程 CAN 控制器的发送中断以及为和 SJA1000 通讯主控制器使用的
中断使能标志是位于 BasicCAN 模式的控制寄存
外部中断使能而且优先级高于启动发送 也由中断控制
器和 PeliCAN 模式的中断使能寄存器
见表 2 及[1]
当 SJA1000 正在发送报文时 发送缓冲器被写锁定 所以在放置一个新报文到发送缓冲器之前 主控
制器必须检查状态寄存器
•
见[1]
的
发送缓冲器状态
标志
TBS
发送缓冲器被锁定
主控制器将新报文暂时存放在它自已的存储器里并设置一个标志
表示一个报文正在等待发送
如何处理可以设计来保存几个要发送的报文的临时存储计器是软件设计者的问题
启动传输报文
会在中断服务程序中处理 程序在当前运行的发送末端被初始化
从 CAN 控制器收到中断 见图 13 的中断处理过程 后 主控制器会检查中断类型 如果是发送
中断
它会检查是否有更多的报文要被发送
缓冲器
志
•
表示要发送更多信息的标志被清除
一个正在等待的报文会从从临时存储器复制到发送
置位命令寄存器
见[1]
的
发送请求
TR 标
使 SJA1000 启动发送
发送缓冲器被释放
主控制器将新报文写入发送缓冲器并置位命令寄存器 见[1] 的
使 SJA1000 启动发送
发送请求
TR 标志 这将
在发送成功结束时 CAN 控制器产生会一个发送中断
preparation:
enable CAN Transmit Interrupt
CAN Transmit
Interrupt?
NO
request:
transmit a message
YES
Transmit Buffer
Status released?
"further
message" to be
transmitted?
NO
YES
claear flag "further message"
YES
write message into the
Transmit Buffer
temporary storage of
message to be transmitted
set Transmission Request bi
copy message from temporary stor
into the Transmit Buffer
set flag "further message"
图 13
发送一个报文
set Transmission Request bit
的流程图
第 20 页 共 20 页
中断控制
NO
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
查询控制的发送
流程如图 14 所示
CAN 控制器的发送中断在这类传输控制中禁能
只要 SJA1000 正在发送报文 发送缓冲器就被写锁定 因此在将新报文放入发送缓冲器之前 主控制
器必须检查状态寄存器
•
见[1]
的
发送缓冲器状态
TBS
发送缓冲器被锁定
周期查询状态寄存器 主控制器等待
•
标志
直到发送缓冲器被释放
发送缓冲器被释放
主控制器将新的报文写入发送缓冲器并置位命令寄存器
见[1]
的
发送请求
TR
标志
此
时 SJA1000 将启动发送
PeliCAN 模式的例子
在附录里 给出了不同的常数和变量等等的定义
变量在 BasicCAN 和 Pelican 模式里的的含意可以
不同 例如 InterruptEnReg 在 BasicCAN 模式里是指控制寄存器但在 Pelican 模式里是指中断使能寄存
器
编程使用的是 C 语言
根据 4.2.1 节给出的例子
初始化 CAN 控制器后
可启动正常的通讯
:
/*等待 直到发送缓冲器被释放
*/
Do
{
/*等待时
启动查询定时器并运行一些任务
*/
在超时和出现错误后跳出循环
}while((statusReg & TBS_Bit) != TBS_Bit)
/*释放发送缓冲器 信息可写入缓冲器
*/
/*在这个例子里
*/
会发送一个标准帧信息
TxFrameInfo = 0x08
/*SFF(data) DLC 8
TxBuffer1
= 0xA5
/*标识符 1
A5
1010
0101
*/
TxBuffer2
= 0x20
/*标识符 2
20
0010
0000
*/
TxBuffer3
= 0x51
/*data1 =51
*/
TxBuffer10
= 0x58
/*data8 =58
*/
/*启动发送
*/
*/
CommandReg
=TR_Bit
/*置位发送请求位
状态寄存器的 TS 和 RS 标志能检测 CAN 控制器是否已达到空闲状态
*/
TBS 标志和 TCS 标志可以检
查是否成功发送
BasicCAN 模式的例子
在附录里
给出了不同的常数和变量等等的定义
变量在 BasicCAN 和 Pelican 模式里的的含意可以
不同 例如 InterruptEnReg 在 BasicCAN 模式里是指控制寄存器但在 Pelican 模式里是指中断使能寄存
第 21 页 共 21 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
器 编程使用的是 C 语言
根据 4.2.1 节给出的例子
初始化 CAN 控制器后
可启动正常的通讯
:
/*等待 直到发送缓冲器被释放
*/
Do
{
/*等待时
启动查询定时器并运行一些任务
*/
在超时和出现错误后跳出循环
}while((StatusReg & TBS_Bit) != TBS_Bit)
/*发送缓冲器被释放 信息可写入缓冲器
*/
/*BasicCAN 模式里只有标准帧信息
*/
TxBuffer1
= 0xA5
/* 标识符 1
A5
1010
0101
TxBuffer2
= 0x28
/* 标识符 2
28
0010
0000
TxBuffer3
= 0x51
/* data1=51
*/
TxBuffer10
= 0x58
/* data8=58
*/
/*置位发送请求位
*/
*/
DLC 8
/*启动发送
*/
*/
CommandReg = TR_Bit
TBS 和 TCS 标志用于检查是否成功发送
request:
transmit a message
Transmit Buffer
Status released?
run other tasks or
simply loop back
NO
YES
load message to be transmitted
into the Transmit Buffer
set Transmission Request bit
图 14
4.2.3
发送一个报文
的流程图
查询控制
中止发送
一个已经请求发送的报文
可通过置位命令寄存器[1]的相应位执行
第 22 页 共 22 页
中止发送
命令中止发送
这个
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
功能可用于例如
发送一个比现在的报文更紧急的报文
而这个报文已被写入发送缓冲器
但是直到现在
没有被成功地发送
图 15 显示了一个使用发送中断的流程 这个流程显示了为了发送更高优先级的报文而中止当前发送的
报文的情况
不同原因的中止报文发送要求不同的中断流程
一个相应的流程能从查询控制发送的处理中得到
以免报文由于不同的原因仍然等待处理
个紧急报文
发送缓冲器会锁定
置位命令寄存器里中止发送位
器被释放
同时产生一个发送中断被
是否成功
状态
未完成
送 例如 在检查后重复发送中止的报文
要检查状态寄存器的发送完成标志
在这种情况下
发送缓冲
确定前面的发送
主控制器要运行一个特殊程序来处理中止发
如果它仍然有效的话
preparation:
enable CAN Transmit Interrupt
NO
CAN Transmit
Interrupt?
request:
transmit a message
YES
NO
"further message"
to be transmitted?
YES
NO
Transmit Buffer
Status released?
如果要求发送一
当这条等待处理的报文已被成功的发送或中止后
在中断流程
表示发送被中止
见图 15 的主流程图
copy message from temporary
store into the Transmit Buffer,
clear flag "further message"
YES
write message into the
Transmit Buffer
temporary storage of
message to be transmitted
set Transmission Request bit
Transmission
Complete Status =
incomplete?
set flag "further message"
NO
YES
NO
set
Transmission
Re uest bit
Message has
hi h priorit ?
set
Transmission
Re uest bit
YES
set Abort Transmission bit
图 15
4.2.4
中止发送一个报文
application specific processing:
react according to a defined
"Abort Transmission" strategy
e.g. retransmission of aborted
message
的流程图
中断控制
接收
根据 CAN 协议规范[8] 报文的接收由 CAN 控制器 SJA1000 独立完成 收到的报文放在接收缓冲器(见
4.1.1 和 5.1)
可以发送给主控制器的报文 由状态寄存器的接收缓冲器状态标志
第 23 页 共 23 页
RBS
见[1]
和接收
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
中断标志 RI
见[1]
标出
如果使能
主控制器会将这条信息发送到本地的报文存储器
然后释放接
发送过程能被 SJA1000 的中断请求或查询 SJA1000 的控制段状态标志来控制
收缓冲器并对报文操作
查询控制接收
流程如图 16 所示
CAN 控制器在这种接收类型下接收中断禁能
主控制器如常读 SJA1000 的状态寄存器 检查接收缓冲状态标志 RBS 看是否收到一个报文 这些
标志的定义位于控制段的寄存器
•
见[1]
接收缓冲器状态标志表示 空
也就是没有收到报文
主控制器继续当前的任务直到收到检查接收缓冲器状态的新请求
request:
check for received messages
Receive Buffer
Status = full?
NO
YES
continue with other tasks
read new message from
Receive Buffer and save it
release Receive Buffer
(set command bit RRB = released)
application specific processing:
e.g. process received message
图 16
•
接收缓冲器状态标志表示
接收一个报文
满
的流程图
查询控制
也就是说收到一个或多个报文
主控制器从 SJA1000 得到第一个报文 然后通过置位命令寄存器的相应位 发送一个释放接收缓
冲器命令 如图 16 所示 主控制器在检查更多信息报文前可以处理每个收到的报文 但也可以通
过再次查询接收缓冲器状态位立即检查更多报文
并将在以后一起处理所有收到的报文
情况下
可以存储多于一条报文
主控制器的本地报文存储器必须足够大
条或所有报文后
在这种
在已经发送和处理一
主控制器继续执行其他的任务
中断控制接收
根据图 17 给出的控制器的主要过程 CAN 控制器的接收中断以及为和 SJA1000 通迅主控制器的外部
中断使能而且优先级高于中断控制报文
中断使能寄存器里
对于 PeliCAN 模式
中断使能标志位于控制寄存器里
见表 2 和[1]
第 24 页 共 24 页
对于 BasicCAN 模式
或位于
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
request:
check for received messages
NO
Receive Buffer
Status = full?
YES
continue with other tasks
read new message from
Receive Buffer and save it
release Receive Buffer
(set command bit RRB = released)
application specific processing:
e.g. process received message
图 17
接收一个报文
的流程图
中断控制
如果 SJA1000 已接收一个报文 而且报文已通过验收滤波器并放在接收 FIFO 那么会产生一个接收
中断
因此主控制器能立刻作用
应标志 RRB
将收到的报文发送到自己的报文存储器
然后通过置位命令寄存器的相
见[1] 发送一个释放接收缓冲器命令 接收 FIFO 里的更多报文将产生一个新的接收中断
因此不可能将所有在接收 FIFO 中的有效信息在一个中断周期内读出 和这个方法相反 图 18 显示了一个
将所有信息一次读出的过程
RBS 看是否有更多报文
SJA1000 会检查状态寄存器中接收缓冲器状态
在释放了接收缓冲器后
而所有有效的信息都会被循环读出
如图 17 所示 整个接收过程在一个中断程序中完成 而且和主程序没有相互作用 如果可行的话 报
文的处理甚至也可以在中断程序里完成
例子
在附录里
给出了不同的常数和变量等等的定义
变量在 BasicCAN 和 Pelican 模式里的的含意可以
不同 例如 InterruptEnReg 在 BasicCAN 模式里是指控制寄存器但在 Pelican 模式里是指中断使能寄存
器
编程使用的是 C 语言
根据 4.2.1 节给出的例子
1
初始化 CAN 控制器后
可启动正常的通讯
部分主程序
:
/*接收中断使能
InterruptEnReg
*/
RIE_Bit
:
2
中断 0 服务程序的部分程序
:
/*从 SJA1000 读中断寄存器的内容并临时保存
接收中断
RI
被首先清除
所有中断标志被清除
当给出释放缓冲器命令时
*/
第 25 页 共 25 页
在 PeliCAN 模式里
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
CANInterrupt = InterruptReg
/*检查接收中断和读一个或所有接收到的信息
If
(RI_VarBit
*/
YES)
/*检测到接收中断
*/
/*从 SJA1000 得到接收缓冲器的内容
并将它存入控制器的内部存储器
{
可以立刻对帧信息和数据长度代码解码并适当地取出
*/
/*释放接收缓冲器 接收中断标志被清除
新的信息将产生一个新中断
*/
/*释放接收缓冲器
*/
CommandReg
RRB_Bit
}
:
数据超载处理
在接收 FIFO 满了但还接收其他报文的时侯 就会通过置位状态寄存器中的数据超载状态位
能
如果使
通知主控制器有数据超载的情况 SJA1000 会产生一个数据超载中断
如果运行在数据超载的状态下
由于主控制器没有足够的时间及时从接收缓冲器取收到的报文而变得
极度超载 一个表示数据丢失的数据超载信号
可能会导致系统矛盾
信息要被足够快地传输和处理避免产生数据超载
通常一个系统应该设计成
如果数据超载不能避免
收到的
那么主控制器应该执行一个特
殊的处理程序来处理这些情况
图 18 是有关处理数据超载中断的程序流程
在已经传输这条报文后 该报文产生接收中断并释放接收缓冲器
会通过读接收缓冲器状态来检查在
接收 FIFO 中是否还有有效报文 因此在继续下一步之前 所有的信息都能从接收 FIFO 取出 当然在中断
中读一条报文并且处理它
可能的话
要比 SJA1000 接收一条新报文更快点
否则主控制器将一直在中
断里读报文
检测到数据超载后 可以根据 数据超载 策略启动一个异常处理 这个策略可以在两种情况下决定
−
数据超载和接收中断一起发生
−
数据超载发生时 没有检测到接收中断
信息可能已经丢失
信息可能已经丢失
主控制器怎样对这些情况采取相应的动作由系统设计者决定
相应的处理也可以在查询控制报文接收中处理
第 26 页 共 26 页
接收中断可能禁能
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
preparation:
enable CAN Receive Interrupt
and
Data Overrun Interrupt
CAN Receive
Interrupt?
NO
YES
read new message from Receive
Buffer and save it
release Receive Buffer
(set command bit RRB = released)
application specific processing:
e.g. process received message
Receive Buffer Status
= empty?
NO
YES
NO
Data Overrun Interrupt?
YES
application specific processing:
react according to a defined
"Data Overrun" strategy
clear Data Overrun
(set command bit CDO = clear)
图 18
4.2.5
数据超载和接收报文
的流程图
中断控制
中断
在 PeliCAN 模式里 SJA1000 有 8 个不同的中断 在 BasicCAN 模式里仅有 5 个
这些中断可使主
控制器立即作用在 CAN 控制器的某些状态上
一旦 CAN 产生中断 SJA1000 就将中断输出 管脚 16 设为低电平 直到主控制器通过读 SJA1000
的中断寄存器对中断采取相应措施 或在 PeliCAN 模式里 释放接收缓冲器后产生接收中断 在主控制器
第 27 页 共 27 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
这个动作后 SJA1000 将输出中断跳到高电平 如果这段时间有更多中断
或接收 FIFO 里有更多有效报
文 SJA1000 立刻将中断输出再次设为低电平 因此输出仅在很短的时间里保持高电平 处理中断请求的
握手信号和在两个中断之间的高电平脉冲要求主控制器的中断由电平触发
图 19 的流程给出所有可能中断的概述 详细的描述可以参考本应用指南 在这个流程里不同的中断被
处理的次序仅是一种可能的解决方法
中断被处理的次序很大程度上取决于系统和它所要求的行为
这必
须由整个系统的设计者决定
发送
图 20
接收和数据超载中断的进行的动作已经在前面讨论过了
21
22 详细地给出唤醒中断 仲裁丢失中断和三个不同出错中断的流程
以执行系统的一个通用错误策略程序
系统维护
号
所有的出错中断可
这个策略完成
在开发期的系统优化和在操作期的系统自动优化和
仲裁丢失中断也可以用于系统优化和维护
见下面的章节和数据表[1]可获得关于不同的错误信
仲裁丢失处理和相关的信息的详细资料
External Interrupt received
from the SJA1000
read Interrupt Register of SJA1000,
store value temporarily
preparation:
upon reading this register,
all bits are cleared
( except "RI" in PeliCAN mode)
interrupt processing:
CAN controller wakes up
see Figure 20
Wake Up Interrupt
Data Overrun Interrupt
Error (Warning) Interrupt
Transmit Interrupt
Receive Interrupt
interrupt processing:
transmission of messages
see Figure 13 and Figure 15
and for PeliCAN mode only:
Bus Error Interrupt
Arbitration Lost Interrupt
Error Passive Interrupt
interrupt processing:
reception of messages and
data overrun detected
see Figure 17 and Figure 16
interrupt processing:
CAN error warning handling
see Figure 21
if appropriate, enable
interrupt processing:
bus error handling
interrupt processing:
error passive handling
PeliCAN mode only
see Figure 22
interrupt processing:
arbitration lost handling
end of interrupt processing
图 19
总体的中断流程
第 28 页 共 28 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
preparation:
enable CAN Wake Up Interrupt
NO
Wake-Up
Interrupt?
YES
application specific processing
reaction on
CAN controller wakes up
Enterin sleep mode was not successfull
图 20
CAN 控制器唤醒
的流程图
in BasicCAN mode:
Error Interrupt
preparation:
enable CAN Error Warning Interrupt
(BasicCAN: Error Interrupt)
NO
Error Warning
Interrupt?
Check flags of Status Register
YES
Bus Status =
"Bus-Off"?
NO
Error Status =
"error"?
YES
YES
application specific processing:
react according to a defined
"Bus-Off"-strategy
application specific processing:
react according to a defined
"Error"-strategy
processing:
e.g. reconfigure SJA1000
(reset mode/request bit is set)
图 21
出错中断
的流程图
第 29 页 共 29 页
NO
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
preparation:
enable CAN Bus Error Interrupt
and/or Arbitration Lost Interrupt
and/or Error Passive Interrupt
YES
Error Passive
Interrupt?
NO
application specific processing:
reaction on bus errors
e.g for system maintenance and optimization
NO
Bus Error
Interrupt?
NO
Arbitration Lost
Interrupt?
YES
YES
read Error Code Capture Register
read Arbitration Lost Capture Register
application specific processing:
reaction on bus errors
e.g for system maintenance and diagnostics
application specific processing:
e.g. for system optimization
图 22
5
5.1
处理特殊的 PeliCAN 中断
流程图
PELICAN 模式的功能
接收 FIFO/报文计数器/直接 RAM 访问
SJA1000 寄存器和报文缓冲器对于主控制器来说是外围寄存器 它们可以通过复用的地址/数据总线寻
址
在不同的模式
括用于初始化
时
操作或复位
可以访问不同的寄存器
状态和控制的寄存器
正常操作的地址范围是
Address0~31
它包
而且 CAN 报文存储器位于地址 16 和 28 之间 在主控制器写访问
用户能够寻址 CAN 控制器的发送缓冲器
在读访问时
读出接收缓冲器的内容
第 30 页 共 30 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
除了上面所说的范围外 整个接收 FIFO 映射在 CAN 地址 32 和 95 之间
见图 23
而且
是内部
80 个字节 RAM 一部分的 SJA1000 发送缓冲器在 CAN 地址 96 和 108 之间
图 23
直接访问 RAM 时
在 PeliCAN 模式里
寄存器和 RAM 地址分配
可以读发送缓冲器和完整的接收 FIFO
接收 FIFO 能够存储高达 n=21 条报文 用下面的方程
可以算出报文的最大数
量
n=
接收缓冲器被定义为一个 13 字节的窗口
64
3 + data _ length _ code
总是包括接收 FIFO 当前的接收报文 如图 24 所示
下面
的部份或全部的报文都在接收缓冲器窗口
但是 在 释放接收缓冲器 命令之前 接收 FIFO 里的下一个收到的报文在接收缓冲器窗口 从 CAN
地址 16 开始
将完全可以看到
第 31 页 共 31 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
message 3
64 byte
Receive
FIFO
28
message 2
27
26
25
24
Receive
Buffer
Window
Incoming
Messages
23
22
21
message 1
20
19
18
17
16
图 24
为了分析的需要
SJA1000 另外提供两个寄存器
•
Rx 缓冲器起始地址寄存器
•
Rx 报文计数器寄存器
接收 FIFO
处理接收报文
RBSA 允许接收 FIFO 范围里识别单个 CAN 报文
表示接收 FIFO 里的当前存储的报文数量
图 23 显示了物理 RAM 地址和 CAN 地址之间的关系
5.2
错误分析功能
基于错误计数器的值 每个 CAN 控制器能够在三种错误状态之一中工作 错误激活 错误认可或总线
离线 如果错误计数器的值都在 0~127 之间 CAN 控制器是错误激活的 此时产生错误激活标志 6 个显
性位
如果一个错误计数器的值在 128
产生认可错误标志 6 个隐性位
255 之间
SJA1000 是错误认可的 此时
在检测到错误前
如果发送错误计数器的值高于 255 则到达总线离线状态 在这种状态
下 自动置位复位请求位 SJA1000 对总线没有影响
如图 25 所示 总线离线状态只能在主控制器用命
令 Reset Request = 0 退出 这将启动总线离线恢复定时器 发送错误计数器计数 128 个总线释放信号
计数结束后 两个错误计数器都是 0
器件再次处于错误激活状态
第 32 页 共 32 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
External Reset
Error Active
0
0
Error Passive
1
Bus-Off
1
图 25
SJA1000 的出错中断
而且图上显示在不同的错误状态下错误和总线状态的值
5.2.1
错误计数器
如上面描述 CAN 的错误状态和发送错误计数器和接收错误计数器的值直接有关
为了仔细研究错误界定 支持 SJA1000 的增强的错误分析功能 CAN 控制器提供可读的错误计数器
另外
在复位模式 允许对于两个错误计数器进行写访问
5.2.2
出错中断
见图 25 使用了 3 个错误中断源来向主控制器发信出错的状态 每个中断都能在中断使能寄存器里分
别使能
总线出错中断
在 CAN 总线上检测到任何一个错误都会产生中断
出错警告中断
第 33 页 共 33 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
如果超过出错警告界限 产生出错警告中断 而且它在 CAN 控制器进入总线离线状态和在此之前再一
次进入错误激活状态也会产生这个中断 SJA1000 的出错警告界限在复位模式中可编程 复位后的默认值
是 96
错误认可中断
如果错误状态从错误激活变成错误认可或相反
5.2.3
将产生错误认可中断
错误码捕捉
如前几部分描述 SJA1000 可以执行在 CAN2.0B 规范[8]定义的所有错误界定 每个 CAN 控制器处
理错误的整个过程是完全自动的 但是 为了向用户提供某个错误的详细信息 SJA1000 提供了错误代码
捕捉功能 无论什么时候发生 CAN 总线错误 它都会强制产生相应的总线出错中断 同时 当前位的位置
被捕捉入错误代码捕捉寄存器
在主控制器将捕捉的数据读出前
它都会被保存在寄存器中
然后捕捉机
制再次激活 寄存器可以内容区分四种错误类型 格式出错 填充出错 位出错和其他错误 如图 26 所示
寄存器还另外表明在错误是在报文的接收还是发送期间发生 这个寄存器中的五个位表示 CAN 帧内错误的
位位置
更多信息请看下面的表和数据表
ACK
Field
MSB
x
0
x
1
Form Error
during
x
0
Transmission
x
1
x
1
x
0
x
1
x
1
图 26
Type of Error
in Acknowledge
Delimiter
Position of an Error
in the CAN bit stream
错误码捕捉功能举例
CAN 规范定义了 CAN 总线上的每个位只有特殊类型的错误 下面两张表显示了在 CAN 报文发送和
接收期间可能出现的所有错误
左边的部份包括位置和错误的类型
这些由错误码捕捉寄存器捕捉
每张
表的右边部分是将错误码转换成上层的错误描述 可以直接从寄存器内容知道其含意 通过使用这些表格
能得到有关错误计数器的变化和在器件发送和接收管脚的错误状态的更多信息
使用这些表时
例如在错
误分析软件里 可以详细地分析每一个错误状态 关于 CAN 错误类型和位置的信息能用于错误统计和系统
维护或在系统优化期间进行纠正
第 34 页 共 34 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
表6
接收时可能出现的错误
错误码捕捉
CAN 位流里的错误位置
标识符
错 误
RX 错
类型
误计数
填充
1
收到 5 个电平相同的连续的位
――
格式
1
Rx = 显性
位必须是隐性
填充
1
收到超过 5 个电平相同的连续的位
位
1
TX=显性
格式
1
RX=显性 或
描述
SRR IDE 和 RTR 位
保留位
数据长度码
数据场
CRC 序列
CRC 定界符
应答位
1
应答定界符
但 RX=隐性
不能写显性位
临界的总线定时
或总线长度
检测到 CRC 错误
帧结束
1
CRC 序列不正确
格式
1
RX=头六位是显性
――
其他
0
RX=最后一位的显性
反应 发出超载标
志 如果发送器重新
发送 数据可能重复
间隔
其他
0
RX=显性
反应 接收器发出
超载标志
激活错误标志
位
8
TX=显性
容许的显性位 Tolerate
其他
8
RX=出错标志后的第一位是显性
Dominant Bit
错误定界符
超载标志
1
但 RX=隐性
不能写显性位
RX=出错或过载标志后有超过 7 位显性位
格式
1
RX=头七位是显性位
――
其他
0
RX=定界符的最后一位是显性位
发送超载标志
位
8
TX=显性
不能写显性位
如果 CRC 不正确 应答定界符内的错误是
但 RX 隐性
格式错误
第 35 页 共 35 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
表7
发送时可能出现的错误
错误代码捕捉
CAN 位流里的错误位置
错误
TX 错
类型
误计数
帧起始
位
标识符
位
填充
SRR 位
位
填充
IDE 和 RTR 位
8
+8
0
+8
0
描述
Tx=显性 但 Rx=隐性
不能写显性位
Tx=显性 但 Rx=隐性
不能写显性位
Tx 隐性
――
但 Rx=显性
Tx=显性 但 Rx=隐性
不能写显性位
Tx=隐性
――
但 Rx=显性
位
+8
Tx=显性 但 Rx=隐性
不能写显性位
填充
+8
Tx=隐性
――
位
+8
Tx=显性 但 Rx=隐性
不能写显性位
CRC 定界符
格式
+8
Rx=显性
位必须为隐性
应答隙
其他
+8
Rx=隐性 错误激活
没有应答
Rx=隐性
没有应答 节点可能单
保留位
但 Rx=显性
数据长度码
数据场
CRC 序列
其他
0
错误认可
独在总线上
应答定界符
格式
+8
Rx=显性
临 界 的 总线定时或总
线长度
帧结束
格式
+8
Rx=头六个位是显性位
――
其他
+8
Rx=最后一位是显性位
帧 已 经 被一些节点接
收 再次发送可能导致
接收器里数据重复
间隔
其他
0
Rx=显性
来自于
旧
CAN 控
制器的超载标志
激活错误标志
位
8
Tx=显性 但 Rx=隐性
不能写显性位
格式
8
Rx=在 激活 错误 标志 或过载
――
过载标志
允许显性位
Tolerate
Dominant Bit
错误定界符
认可错误标志
标志后有超过 7 个显性位
格式
8
Rx=头七位是显性位
――
其他
0
Rx=定 界符 的最 后一 位是显
来自于
性位
制器的超载标志
Rx=显性 错误认可
没有收到应答 节点不
其他
8
旧
CAN 控
是单独在总线上
5.3
仲裁丢失捕捉
SJA1000 能够确定 CAN 位流丢失仲裁的确切位置 并立即产生 仲裁丢失中断
码被捕捉到仲裁丢失捕捉寄存器
主控制器读出这个寄存器的内容后
第 36 页 共 36 页
而且 这个位的号
仲裁丢失捕捉功能被再次激活
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
bit number
SOF
00
01
02
03
04
05
Node A
Node A looses
arbitration
Node B
read interrupt
register
Arbitration
Lost
Interrupt
Arbitration
Lost Capture
Register
of node A
MSB
x
-
x
x
图 27
在这个功能的帮助下
MSB
x
0
x
0
x
1
x
0
x
0
arbitration lost in
bit number 04 ==> ID 24
仲裁丢失捕捉功能
SJA1000 能够监控每个 CAN 总线的访问 诊断或在系统配置期间
可以识别
仲裁失败的所有位置
下面这个例子显示了钟裁丢失功能怎样使用
首先使能中断使能寄存器里的仲载丢失中断
失中断标志被置位
中断后
中断寄存器的内容就被保存起来
如果仲裁丢
表示仲裁丢失捕捉寄存器的内容被分析过了
例子 仲载丢失
InterruptEnReg
ALIE_Bit
/*仲裁丢失中断使能
*/
/*-------------------------------------中断服务程序-----------------------------------------------------------------
*/
int_reg_copy InterruptReg
/*保存中断寄存器内容
*/
/*读仲裁丢失捕捉寄存器
*/
if
(int_reg_copy & ALIE_Bit)
candat = ArbLostCapReg
5.4
单次发送
在一些应用中 自动重发 CAN 报文没有意义
为了请求一个 单次发送
1
发送请求
2
等待发送状态
3
中止发送
它造成一个节点几次仲裁和数据变得无效
CAN 控制器必须完成下面的步骤
通过同时置位命令位 CMR.0 和 CMR.1
处理软件能将初始化
单次发送
在这种情况下 没有必要查询状态位 主控制器能集中于其他任务上
第 37 页 共 37 页
选项减少到一个命令
单次发送 功能能与 SJA1000
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
的仲裁丢失和错误代码捕捉功能完美结合
如果仲裁丢失或发生错误 SJA1000 不会重新发送报文 一旦置位状态寄存器的发送状态位 内部发
送请求位就自动清除
使用两个捕捉寄存器的附加信息
如在 5.7 章里描述的
5.5
一个报文是否被重发由用户控制
单次发送能和自我测试模式一起使用
仅听模式
在仅听模式里
SJA1000 不能在 CAN 总线上写显性位 激活错误标志或超载标志不能都写
成功接
收后的应答信息也不会给出
错误就像在错误认可模式里处理
错误分析功能如
错误码捕捉和出错中断就像在正常操作模式一样
工作
但是 错误计数器的状态被冻结
可以接收报文
但不可以发送
因此
这个模式可用于自动的位速率检测
见 5.6 节和其他带有监控
功能的应用
注意
在进入仅听模式之前
必须进入复位模式
例子 仅听模式
ModeControlReg
RM_RR_Bit
ClockDiv 标识符 eReg
ModeControlReg
5.6
CANMode_ Bit
LOM_Bit
/*进入复位模式
*/
/*PeliCAN 模式
*/
/*进入仅听模式
*/
/*离开复位模式
*/
自动位速率检测
自动位速率已有的测试和错误概念的主要缺点是产生的 CAN 出错帧不被接受 SJA1000 支持 PeliCAN
模式的自动位速率检测的请求 这里将简短地描述一个不影响网络运行操作的应用例子
在仅听模式 SJA1000 不能发送报文也不能产生出错帧 这个模式里只能接收报文 软件里预定义的
表格包含所有可能的位速率以及它们的位定时参数 在启动用最高位速率接收报文之前 SJA1000 使能接
收中断和出错中断 如果在 CAN 总线产生了错误 软件会转向下一个较低的位速率 在成功地接收到一个
报文后 SJA1000 已经检测到正确的位速率而且能转向正常工作模式 从现在起 这个节点能够象系统其
他激活的 CAN 节点一样工作
第 38 页 共 38 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
unknown
bit-rate
Enter
Listen Only Mode
Set highest
bit-rate
Enable Receive and
Error Interrupt
Switch to next
lower bit-rate
Bus Error
Interrupt ?
YES
NO
NO
Receive
Interrupt ?
YES
bit-rate found
图 28
5.7
位速率检测的算法
CAN 的自测试
SJA1000 支持两种不同的自测试
•
局部自测试
•
总体自测试
局部自测试 例如能很好地用于单个节点测试 因为它不需要来自于其他节点的应答 此时 SJA1000
必须处于 自测试模式
模式寄存器
并发出 自接收请求
命令
对于总体自测试 在操作模式下 SJA1000 执行同样的命令 但是 在运行系统中 需要 CAN 的应答
注意 在这两种情况下 物理层接口包括带有终端的 CAN 总线必须有效 发送或自接收通过置位命令
寄存器的相应位初始化
SJA1000 提供三个命令位用于 CAN 发送和自接收的初始化
表 8 显示了所有可能的组合
取决于所
选的工作模式
表8
CAN 发送请求命令
命令
CMR=
成功操作后的中断
自我测试模式
操作模式
自接收请求
0x10
RX 和 TX
局部自测试
总体自测试
发送请求
0x01
TX
正常发送
1
正常发送
1
单次发送
0x03
TX
没有重发的发送
单次发送和自我接收请求
0x12
RX 和 TX
无重发的局部自测试
下面的例子表示了初始化局部自测试的基本编程元素
1
有或没有重发的正常发送通常在工作模式里完成
第 39 页 共 39 页
没有重发的发送
无重发的总体自测试
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
例 局部自测试
ModeControlReg
ClockDivideReg
ModeControlReg
=RM_RR_Bit
/*进入复位模式
*/
=CANMode_Bit
/*PeliCAN 模式
*/
=STM_Bit
/*进入自我测试模式
*/
/*离开复位模式
*/
TxFramInfo
=0x03
/*填满发送缓冲器
*/
TxBuffer1
=0x53
/*
*/
TxBuffer5
=0xAA
/*最后一个发送的字节
*/
=SRR_Bit
/*自我接收请求
*/
CommandReg
if
(RxBuffer1 != TxBufferRd1)
comparison
=false
if
(RxBuffer2 != TxBufferRd2)
comparison
=false
5.8
接收同步脉冲的产生
在成功地接收到报文后 SJA1000 允许 TX1 管脚上产生一个脉冲 如果报文被完整地存储在接收 FIFO
里
这个脉冲在时钟分频驱动寄存器里使能 在第 6 位 帧结束 持续期间内激活 因此 它能用于通用
的事件触发任务
例如
在分布式系统内
钟 带有时钟相移
作为一个专用的触发中断源或将在下面讨论的分布式系统内的总体时钟同步
很难用一个不带额外同步信号线的系统时钟
假设 CAN 网络内的一个节点作为
主
所有连接到总线上的节点都有本地时
时钟
网络里其余的时钟都同步到主时钟
自身接收请求特征和每个 SJA1000 在接收到信息后的一定时间内产生一个脉冲 可以同步分布式系统
里的系统时钟
在图 29
一个系统主机发送
生一个接收同步脉冲
自接收报文
到 CAN 总线上
这个脉冲使每个从机节点的定时器复位
报文接收后
每个节点包括主机
都产
同时主机节点用这个脉冲去捕捉主时钟值
tM
在下一步 主机将 tM 值作为一个 参考时序报文 发送到所有从机 在每个从机的简单的加法程序和
在 tS 内重载所有定时器
同步了整个系统时钟
Message 1
Message 2
t
t
Receive
Sync Pulse
Master transmits
a
Self Reception Message
Master captures
current
timer value M
Master transmits
timer value M
`Reference Time Message`
∆t
All Slaves
reset their timers
(t = 0)
图 29
Slaves calculate
new timer value
t =t + t
系统同步的时序图
这种方法的主要好处是简化了复杂的时间标志处理
使用软件循环计数 而且它独立于网络参数
由于关键路径是由硬件控制确定
中断事件可能会在整个周期内发生
第 40 页 共 40 页
所以没有必要
但不影响同步过程
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
6
参考文献
[1] Data Sheet SJA1000, Philips Semiconductors
[2] Eisele, H. and Jöhnk, E.: PCA82C250/251 CAN Transceiver, Application Note AN96116, Philips
Semiconductors, 1996
[3] Data Sheet PCA82C250, Philips Semiconductors, September 1994
[4] Data Sheet PCA82C251, Philips Semiconductors, October 1996
[5] Data Sheet TJA1053, Philips Semiconductors,
[6] Jöhnk, E. and Dietmayer, K.: Determination of Bit Timing Parameters for the CAN Controller
SJA1000, Application Note AN97046, Philips Semiconductors, 1997
[7] Data Sheet PCx82C200, Philips Semiconductors, November 1992
[8] CAN Specification Version 2.0, Parts A and B, Philips Semiconductors, 1992
[9] Hank, P.: PeliCAN: A New CAN Controller Supporting Diagnosis and System Optimization, 4th
International CAN Conference, Berlin, Germany, October 1997
7
附录
在应用指南里的例子 我们用 C 语言
子里
Keil 的 C 编译器 描述 SJA1000 可能的编程流程 在这些例
目标控制器是 Philips Semiconductors 的 S87C654 也可以使用其他 80C51 系列器件 务必确保
在主程序里包括对目标器件寄存器正确的说明
SJA1000 的寄存器和位定义
/*定义直接对 8051 的存储区访问
#define
XBYTE
*/
unsigned char volatile xdata
*
0
/*模式和控制寄存器
模式和控制寄存器的地址和位定义
模式和控制寄存器
#define
ModeControlReg
#define
RM_RR_Bit
#if defined
*/
XBYTE[10]
0x01
/*复位模式
请求
位
*/
(PeliCANMode)
#define
LOM_Bit
0x02
/*仅听模式位
*/
#define
STM_Bit
0x04
/*自我测试模式位
*/
#define
AFM_Bit
0x08
/*验收滤波器模式位
*/
#define
SM_Bit
0x10
/*进入休眠模式位
*/
#endif
/*中断使能和控制寄存器
中断使能和控制寄存器的地址和位定义
中断使能和控制寄存器
#if defined
*/
(PeliCANMode)
#define
InterruptEnReg
XBYTE[4]
/* PeliCAN 模式
*/
#define
RIE_Bit
0x01
/*接收中断使能位
*/
#define
TIE_Bit
0x02
/*发送中断使能位
*/
#define
EIE_Bit
0x04
/*错误警告中断使能位
*/
#define
DOIE_Bit
0x08
/*数据超载中断使能位
*/
第 41 页 共 41 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
#define
WUIE_Bit
0x10
/*唤醒中断使能位
*/
#define
EPIE_Bit
0x20
/*错误隐性中断使能位
*/
#define
ALIE_Bit
0x40
/*仲裁丢失中断使能位
*/
#define
BEIE_Bit
0x80
/*总线错误中断使能位
#else
/*BasicCAN 模式
*/
#define
InterruptEnReg
XBYTE[0]
/* 控制寄存器
*/
#define
RIE_Bit
0x02
/*接收中断使能位
*/
#define
TIE_Bit
0x04
/*发送中断使能位
*/
#define
EIE_Bit
0x08
/*错误中断使能位
*/
#define
DOIE_Bit
0x10
/*超载中断使能位
*/
#endif
/*命令寄存器
命令寄存器的地址和位定义
命令寄存器
*/
#define
CommandReg
XBYTE[1]
#define
TR_Bit
0x01
/*发送请求位
*/
#define
AT_Bit
0x02
/*中止发送位
*/
#define
RRB_Bit
0x04
/*释放接收缓冲器位
*/
#define
CDO_Bit
0x08
/*清除数据超载位
*/
/*自身接收请求位
*/
/*进入睡眠模式位
*/
#if defined
(PeliCANMode)
#define
SRR_Bit
0x10
#else
/*BasicCAN 模式
*/
#define GTS_Bit
0x10
#endif
/*状态寄存器
状态寄存器的地址和位定义
状态寄存器
#define
StatusReg
XBYTE[2]
*/
#define
RBS_Bit
0x01
/*接收缓冲器状态位
*/
#define
DOS_Bit
0x02
/*数据超载状态位
*/
#define
TBS_Bit
0x04
/*发送缓冲器状态位
*/
#define
TCS_Bit
0x08
/*发送完成状态位
*/
#define
RS_Bit
0x10
/*接收状态位
*/
#define
TS_Bit
0x20
/*发送状态位
*/
#define
ES_Bit
0x40
/*错误状态位
*/
#define
BS_Bit
0x80
/*总线状态位
*/
/*中断寄存器
中断寄存器的地址和位定义
中断寄存器
*/
#define
InterruptReg
XBYTE[3]
#define
RI_Bit
0x01
/*接收中断位
第 42 页 共 42 页
*/
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
#define
TI_Bit
0x02
/*发送中断位
*/
#define
EI_Bit
0x04
/*错误警告中断位
*/
#define
DOI_Bit
0x08
/*数据超载中断位
*/
#define
WUI_Bit
0x10
/*唤醒中断位
*/
#if defined
(PeliCANMode)
#define
EPI_Bit
0x20
/*错误被动中断位
*/
#define
ALI_Bit
0x40
/*仲裁丢失中断位
*/
#define
BEI_Bit
0x80
/*总线错误中断位
*/
#endif
/*总线定时寄存器
总线定时寄存器的地址和位定义
总线定时寄存器
*/
#define
BusTiming0Reg
XBYTE[6]
#define
BusTiming1Reg
XBYTE[7]
#define
SAM_Bit
0x80
/*采样模式位
1
总线被采样三次
0
总线被采样一次
/*输出控制寄存器
输出控制寄存器的地址和位定义
输出控制寄存器
#define
OutControlReg
*/
*/
XBYTE[8]
/*OCMODE1
OCMODE0
*/
#define
BiPhaseMode
0x00
/*双相输出模式
*/
#define
NormalMode
0x02
/*正常输出模式
*/
#define
ClkOutMode
0x03
/*时钟输出模式
*/
/*TX1 的输出管脚配置
*/
#define
OCPOL1_Bit
0x20
/*输出极性控制位
*/
#define
Tx1Float
0x00
/*配置为悬空
*/
#define
Tx1PullDn
0x40
/*配置为下拉
*/
#define
Tx1PullUp
0x80
/*配置为上拉
*/
#define
Tx1PshPull
0Xc0
/*配置为推挽
*/
/*TX0 的输出管脚配置
*/
#define
OCPOL0_Bit
0x04
/*输出极性控制位
*/
#define
Tx0Float
0x00
/*配置为悬空
*/
#define
Tx0PullDn
0x08
/*配置为下拉
*/
#define
Tx0PullUp
0x10
/*配置为上拉
*/
#define
Tx0PshPull
0X18
/*配置为推挽
*/
/*验收代码和屏蔽寄存器
验收代码和屏蔽寄存器的地址定义
验收代码和屏蔽寄存器
#if defined
#define
*/
(PeliCANMode)
AcceptCode0Reg
XBYTE[16]
第 43 页 共 43 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
#define
AcceptCode1Reg
XBYTE[17]
#define
AcceptCode2Reg
XBYTE[18]
#define
AcceptCode3Reg
XBYTE[19]
#define
AccepMask0 Reg
XBYTE[20]
#define
AccepMask1 Reg
XBYTE[21]
#define
AccepMask2 Reg
XBYTE[22]
#define
AccepMask3Reg
XBYTE[23]
#else
/*BasicCAN 模式
#define AcceptCodeReg
XBYTE[4]
#define AcceptMaskReg
XBYTE[5]
#endif
/*Rx-缓冲器
缓冲器的地址定义
缓冲器
#if defined
*/
(PeliCANMode)
#define
RxFramInFo
XBYTE[16]
#define
RxBuffer1
XBYTE[17]
#define
RxBuffer2
XBYTE[18]
#define
RxBuffer3
XBYTE[19]
#define
RxBuffer4
XBYTE[20]
#define
RxBuffer5
XBYTE[21]
#define
RxBuffer6
XBYTE[22]
#define
RxBuffer7
XBYTE[23]
#define
RxBuffer8
XBYTE[24]
#define
RxBuffer9
XBYTE[25]
#define
RxBuffer10
XBYTE[26]
#define
RxBuffer11
XBYTE[27]
#define
RxBuffer12
XBYTE[28]
#else
/*BasicCAN 模式
#define
RxBuffer1
XBYTE[20]
#define
RxBuffer2
XBYTE[21]
#define
RxBuffer3
XBYTE[22]
#define
RxBuffer4
XBYTE[23]
#define
RxBuffer5
XBYTE[24]
#define
RxBuffer6
XBYTE[25]
#define
RxBuffer7
XBYTE[26]
#define
RxBuffer8
XBYTE[27]
#define
RxBuffer9
XBYTE[28]
#define
RxBuffer10
XBYTE[29]
#endif
/*Tx 缓冲器的地址定义
缓冲器
#if defined
*/
(PeliCANMode)
/*仅写地址
#define
TxFramInFo
*/
XBYTE[16]
第 44 页 共 44 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
#define
TxBuffer1
XBYTE[17]
#define
TxBuffer2
XBYTE[18]
#define
TxBuffer3
XBYTE[19]
#define
TxBuffer4
XBYTE[20]
#define
TxBuffer5
XBYTE[21]
#define
TxBuffer6
XBYTE[22]
#define
TxBuffer7
XBYTE[23]
#define
TxBuffer8
XBYTE[24]
#define
TxBuffer9
XBYTE[25]
#define
TxBuffer10
XBYTE[26]
#define
TxBuffer11
XBYTE[27]
#define
TxBuffer12
XBYTE[28]
/*仅读地址
#define
TxFramInFoRd
XBYTE[96]
#define
TxBufferRd1
XBYTE[97]
#define
TxBufferRd2
XBYTE[98]
#define
TxBufferRd3
XBYTE[99]
#define
TxBufferRd4
XBYTE[100]
#define
TxBufferRd5
XBYTE[101]
#define
TxBufferRd6
XBYTE[102]
#define
TxBufferRd7
XBYTE[103]
#define
TxBufferRd8
XBYTE[104]
#define
TxBufferRd9
XBYTE[105]
#define
TxBufferRd10
XBYTE[106]
#define
TxBufferRd11
XBYTE[107]
#define
TxBufferRd12
XBYTE[108]
#else
/*BasicCAN 模式
#define
TxBuffer1
XBYTE[10]
#define
TxBuffer2
XBYTE[11]
#define
TxBuffer3
XBYTE[12]
#define
TxBuffer4
XBYTE[13]
#define
TxBuffer5
XBYTE[14]
#define
TxBuffer6
XBYTE[15]
#define
TxBuffer7
XBYTE[16]
#define
TxBuffer8
XBYTE[17]
#define
TxBuffer9
XBYTE[18]
#define
TxBuffer10
XBYTE[19]
#endif
/*其他寄存器
其他寄存器的地址定义
其他寄存器
#if defined
(PeliCANMode)
#define
ArbLostCapReg
XBYTE[11]
#define
ErrCodeCapReg
XBYTE[12]
#define
ErrWarnLimitReg
XBYTE[13]
第 45 页 共 45 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
#define
RxErrCountReg
XBYTE[14]
#define
TxErrCountReg
XBYTE[15]
#define
RxMsgCountReg
XBYTE[29]
#define
RxBufstartAdr
XBYTE[30]
#endif
/*时钟分频寄存器
时钟分频寄存器的地址和位定义
时钟分频寄存器
*/
#define
ClockDivideReg
XBYTE[31]
#define
DivBy1
0x07
/*CLKOUT=振荡器频率
*/
#define
DivBy2
0x00
/*CLKOUT=1/2 振荡器频率
*/
#define
CLKOff_Bit
0x08
/*时钟关闭位
*/
#define
RXINTEN_Bit
0x20
/*用于接收中断的管脚 TX1
*/
#define
CBP_Bit
0x40
/*CAN 比较器旁路控制位
*/
#define
CANMode_Bit
0x80
/*CAN 模式控制位
*/
时钟输出管脚控制位
S87C654 的寄存器和位定义
/*端口 2 寄存器
sfr
P2
Sbit
P2
*/
=0xA0
=0xA7
/*端口 2 的 MSB 用于 SJA1000 的片选
*/
P2_7
/*端口 3
sfr
Sbit
P3
int0
P3 的复用功能
=0xB0
=0xB2
/*定时控制寄存器 TCON
sfr
*/
*/
=0x88
TCON
Sbit
IE0
=0x89
/*外部中断 0 边缘标志
Sbit
IT0
=0x88
/*中断 0 类型控制位
*/
边缘或低电平触发
/*中断使能寄存器 IE
sfr
IE
=0xA8
Sbit
EA
=0xAF
*/
*/
/*所有中断使能/禁能标志
第 46 页 共 46 页
*/
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
Sbit
EX0
=0xA8
/*中断优先级寄存器 IP
sfr
IP
0xB8
sbit
PX0
0xB8
/*外部中断 0 的使能或禁能位
*/
/*外部中断 0 优先级控制
*/
*/
例子里的变量和常量的定义
/*-硬件
硬件/软件连接
硬件 软件连接的定义---------------------------------------------------------------------------------------------软件连接
*/
/*控制器 S87C654
见 11 页上的图 3
*/
CAN 控制器
SJA1000
#define
CS
P2_7
/*SJA1000 的片选
*/
#define
SJAIntInp
Int0
/*SJA1000 的外部中断 0
*/
#define
SJAIntEn
EX0
/*外部中断 0 使能标志
*/
/* 使用的常量
常量定义------------------------------------------------------------------------------------------------常量
#define
YES
1
#define
NO
0
#define
ENABLE
1
#define
DISABLE
0
#define
ENABLE_N
0
#define
DISABLE_N
1
#define
INTLEVELACT
0
#define
INTEDGEACT
1
#define
PRIORITY_LOW
0
#define
PRIORITY_HIGH
1
/*寄存器内容默认 复位
#define
/*常量
ClrByte
*/
清除寄存器
0x00
*/
清除中断使能寄存器
#if defined
#define
值
*/
(PeliCANMode)
ClrIntEnSJA
ClrByte
ClrIntEnSJA
ClrByte
#else
#define
RM_RR_Bit
/*保留复位请求
*/
#endif
/*验收代码和屏蔽寄存器的定义
#define
DontCare
*/
0xFF
第 47 页 共 47 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
/*不同例子的总线定时值的定义-----------------------------------------------------------------------------------
*/
/*例子 AN97076 里总线定时值
位率
25kbit/s
振荡器频率
24MHz 1 0%
最大允许传播延迟
1630ns
最小要求传播延迟
120ns
#define
PrescExample
0x02
/*波特率预分频
3
*/
#define
SJWExample
0xc0
/*SJW
4
*/
#define
TSEG1Example
0x0A
/*TSEG1
11
*/
#define
TSEG2Example
0x30
/*TSEG2
4
*/
/*总线定时值
位率
1MBit/s
振荡器频率
24MHz 1 0%
最大允许传播延迟
747ns
最小要求传播延迟
45ns
#define
Prec_MB_24
0x00
/*波特率预分频器
1
*/
#define
SJW_MB_24
0x00
/*SJW
1
*/
#define
TSEG1_MB_24
0x08
/*TSEG1
9
*/
#define
TSEG2_MB_24
0x10
/*TSEG2
2
*/
/*总线定时值
位率
100kBit/s
振荡器频率
24MHz 1 0%
最大允许传播延迟
4250ns
最小要求传播延迟
100ns
#define
Prec_kB_24
0x07
/*波特率预分频器
8
*/
#define
SJW_kB_24
0xc0
/*SJW
4
*/
#define
TSEG1_kB_24
0x09
/*TSEG1
10
*/
#define
TSEG2_kB_24
0x30
/*TSEG2
4
*/
/*总线定时值
位率
1MBit/s
振荡器频率
16MHz 1 0%
最大允许传播延迟
623ns
最小要求传播延迟
23ns
#define
Prec_MB_16
0x00
/*波特率预分频器
1
*/
#define
SJW_MB_16
0x00
/*SJW
1
*/
#define
TSEG1_MB_16
0x08
/*TSEG1
5
*/
#define
TSEG2_MB_16
0x10
/*TSEG2
2
*/
/*总线定时值
第 48 页 共 48 页
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com
位率
100kBit/s
振荡器频率
16MHz 1 0%
最大允许传播延迟
4450ns
最小要求传播延迟
500ns
#define
Prec_kB_16
0x04
/*波特率预分频器
5
*/
#define
SJW_kB_16
0xC0
/*SJW
4
*/
#define
TSEG1_kB_16
0x0A
/*TSEG1
11
*/
#define
TSEG2_kB_16
0x30
/*TSEG2
4
*/
/*总线定时值的结束---------------------------------------------------------------------------------------------------
*/
/*使用过的变量的定义------------------------------------------------------------------------------------------------
*/
/*中断寄存器内容的中间存储内容---------------------------------------------------------------------------------
*/
BYTE bdata CANInterrupt
*/
/*位可寻址的字节
sbit
RI_BitVar
= CANInterrupt
^
0
sbit
TI_ BitVar
= CANInterrupt
^
1
sbit
EI_ BitVar
= CANInterrupt
^
2
sbit
DOI_ BitVar
= CANInterrupt
^
3
sbit
WUI_ BitVar
= CANInterrupt
^
4
sbit
EPI_ BitVar
= CANInterrupt
^
5
sbit
ALI_ BitVar
= CANInterrupt
^
6
sbit
BEI_ BitVar
= CANInterrupt
^
7
第 49 页 共 49 页