文档编号
将会得到越来越广泛的应用
2001年欧洲市场
已经销售了一亿个节点小型CAN 总线节点摆脱繁琐的CAN 总线系
统的底层开发
包括C51模块和A51模块
仿真实验仪中的CAN 功能的实现测试和应用CAN
总线通讯模块
本文仅介绍其中BasicCAN 软件模块的使用方
法
BasicCAN
SJA1000完全支持具有很多新特性的
CAN 2.0B
协议
文档编号
AD0 2
23 多路复用的地址/
数据总线
ALE/AS
3
ALE 输入信号
AS 输入信号
低电平允许访问
SJA1000
/RD Intel 模式
/WR 6 /WR 信号
/WR
CLKOUT
7
SJA1000产生的提供给微控制器的时钟输出信号
外部振荡信号由此输入
XTAL2
10
振荡放大电路输出
1
= Intel
模式
0 = Motorola 模式
V DD3 12 输出驱动的 +5V 电压源
TX0 13 从 CAN 输出驱动器0 输出到物理线路上 TX1 14 从 CAN 输出驱动器1 输出到物理线路上 V SS3 15 输出驱动器接地
/INT
16
中断输出
低电平有效
RX1
19
BasicCAN 模式
表2 内部寄存器
FFH
命令
2 状态
3 中断
4
FFH FFH FFH FFH
文档编号
3 )
2
RTR 和DLC
识别码
FFH
FFH
FFH
FFH
FFH
FFH
FFH
FFH
FFH
10
识别码10
识别码
2 RTR 和DLC
识别码
2 RTR 和DLC
识别码
FFH
对于内部地址为31的时钟分频寄存器来说
见表
15
/RST 管脚低电平有效复位
软件置位控制寄存器中的复位请求位
后BasicCAN
模式
保留 0 0 CR.6
保留
1 1 CR.4 OIE 溢出中断使能 × × CR.3 EIE 错误中断使能 × × CR.
2 TIE 发送中断使能 × × CR.1 RIE 接收中断使能 × × 控制
CR.0 RR
复位请求 1(复位模式)
1(复位模式)
CMR.7
保留
CMR.5
保留 1 1 IR.6
保留 1 1 IR.4 WUI 唤醒中断0(复位) 0(复位) 中断
IR.3 DOI 数据溢出中断0(复位) 0(复位)
IR.2 EI 错误中断0(复位) ×
IR.1 TI 发送中断0(复位) 0(复位)
IR.0 RI 接收中断0(复位) 0(复位) 验收代码AC.7
0 AM 验收屏蔽× ×
BTR0.7 SJW.1 ×同步跳转宽度1 × ×
BTR0.6 SJW.0 同步跳转宽度0 × ×
BTR0.5 BRP.5 波特率预设值5 × ×
BTR0.4 BRP.4 波特率预设值4 × ×
总线定时0
BTR0.3 BRP.3 波特率预设值3 × ×
BTR0.2 BRP.2 波特率预设值2 × ×
BTR0.1 BRP.1 波特率预设值1 × ×
BTR0.0 BRP.0 波特率预设值0 × ×
BTR1.7 SAM 采样× ×
BTR1.6 TSEG2.2 时间段2.2 × ×
BTR1.5 TSEG2.1 时间段2.1 × ×
BTR1.4 TSEG2.0 时间段2.0 × ×
总线定时1
BTR1.3 TSEG1.3 时间段1.3 × ×
BTR1.2 TSEG1.2 时间段1.2 × ×
BTR1.1 TSEG1.1 时间段1.1 × ×
BTR1.0 TSEG1.0 时间段1.0 × ×
输出控制
OC.7 OCTP1 输出控制晶体管P1 × ×
OC.6 OCTN1 输出控制晶体管N1 × ×
OC.5 OCPOL1 输出控制极性1 × ×
OC.4 OCTP0 输出控制晶体管P0 × ×
OC.3 OCTN0 输出控制晶体管N0 × ×
文档编号
文档编号
TXB 发送缓冲器 ×
×
接收缓冲器
CDR 时钟分频寄存器
0000 0000 (Intel)
在上表中
括号中的描述是功能说明命令
寄存器是只写的
当总线关闭时
并产生一个中
断信号(此中断被允许情况下)
??ì??ééüBasicCAN 模式下SJA1000内部各寄存器的功能
用于设置
SJA1000访问模式和各种中断
表 4
控制寄存器各位的说明
保留 保留
保留
如果置位数据溢出位
(见状态寄存器
发生超载时SJA1000将不产生中断信号如果出错或总线状态改变
(见状态寄存器
文档编号
CMR
·μ???μ×üê?‘1111 1111’
?éò??′DDì??¨?üá?
?ú2?ê±?óμ??μ?êê?ía
2???μ′?μ?êμ?1/2
CMR
保留
CMR.6
保留
1 睡眠
CMR.4
GTS
睡眠
唤醒
清除数据溢出状态位
接收缓冲器中存放信息的内存空间将被释放
等待处理的发送请
求将取消
CMR.1
AT
中止发送
无动作
1 当前信息被发送
CMR.0 TR
发送请求
--
注并要求SJA1000向CAN 总线发送该
帧时
将产生一个发送中断
中止传送位是在CPU 要求当前传送暂停时使用的
传送一条紧急信息
要查看原始信息是否被成功发送不过
释放
可以通过设置释放接收缓冲器位为1来释放RXFIFO 中当前信息的内存空间
将清除状态寄存器中的接收缓冲器状态位
如果数据溢出位被置位
在释放接收缓冲器命令的
同时是可以发出清除数据溢出命令的
SJA1000进入睡眠模式
只要破坏这三种条件的其中一种
在复位模式中
2.3.3.3状态寄存器
状态寄存器对微控制器来说是只读存储器
CAN 地址2
位
符号
名称
值 功能
1
总线关闭
SJA1000加入总线活动
至少出现一个错误计数器满或超过
CPU 报警限制
两个错误计数器都在报警限制以下SJA1000在传送信息
SJA1000正在接收信息
最近一次发送请求被成功处理
文档编号
CPU 可以向发送缓冲器写信息
CPU 不能访问发送缓冲器
1
溢出
SR.1
DOS
数据溢出状态
自从最后一次清除数据溢出命令执行
RXFIFO 中有可用信息
当传输错误计数器超过限制
总线状态位置1
当前
所有这些完成之后
128个总线空闲信号
错误计数器复位且产生一个错误中断
96
?á2úéú′í?ó
?D??
????±??ì2é·¢?í?o3??÷×′ì???
D′è?μ?êy?Y2??áóDD§
2.3.3.4中断寄存器(IR)
通过中断寄存器可以识别中断源
/INT(低电平有效)引脚被激活
所有会导致/INT 脚上电平变化的位将被复位
CAN 地址3
位 符号
名称
值
功能
IR.7 IR.6
IR.5
1 退出睡眠模式时
将清除此位
1 当数据溢出中断使能位被置为1时
此位被置位 IR.3
DOI
数据溢出中断
0 微控制器的任何读访问将清除此位 1
错误中断使能时
文档编号
表示
ID.3—ID.10
AMR
但当验收屏蔽寄存器
则验收代码寄存器中对应的位和接
收识别码高8
位中对应的位
用公式表示为
ID.10
AMR.7
11111111
例
1
?ò?éê?′ú????′??÷
AMR
例
2
?ò?éê?′ú????′??÷
AMR
注
2.3.3.5.1 验收代码寄存器
表8 ACR
的位分配
当前
的
那么描述符和数据将被分别顺次写入RXFIFO
?í?á
?ú
?óê??D??????
AMR CAN 地址 5
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1
BIT 0 AMR.7
AMR.6
AMR.5
AMR.4
AMR.3
AMR.2
AMR.1
AMR.0
如果复位请求位置高
读/写
则只有相应的验收代码位
ID.10
相等的报文被接收
总线定时寄存器0
BTR1
?aá?????′??÷???ü?ú?′???£
ê???·??ê
BTR0
和同步跳转宽度
表10 总线定时寄存器0CAN
地址6 BIT 7 BIT 6
BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 SJW.1
SJW.0
BRP.5
BRP.4
BRP.3
BRP.2
BRP.1
BRP.0
波特率预设值
波特率预设值
而且决定了相应的位时序
文档编号
t CLK = SJA1000应用晶体的频率周期 = 1/f XTAL
为了补偿在不同总线控制器的时钟振荡器之间的相位偏移
同步跳转宽度定义了每一位周期可以被重新同步缩短或延长的时钟周期的最大数目
采样点的位置和在每个采样点的采样数目
BTR1
总线采样三次
这对过滤总线上的
毛刺波是有益的
100K 以上的波特率不推荐使用
总线采样一次
TSEG1
TSEG2
8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+TSEG1.0+1
t
CLK
设定的位时间
SYNC
SEG
TSEG1TSEG2
TSEG1
SYNC SEG
采样点(s)
XTAL
CAN
波特率预设值
(BRP)
可能值是
3 SJA1000
系统中波特率的计算
1
个系统时钟
t BIT
波特率 = 1/ t BIT
设置好BTR0
和BTR1参数后
最大波特率 = 1/[t BIT
文档编号
例
1
则
t SYNCSEG = 1 t scl (恒定为
1)
t TSEG2 = 4 t scl
计算波特率
9+1
*1.25 礢 = 10 礢
波特率 = 1/t BIT = 100Kbit/s
实际传输的波特率的范围
BTR1
OCR
OCR
OCTP1OCTN1
OCPOL1
OCTN0OCPOL0OCMODE1OCMODE0
TXCLK
TXD
发送逻辑
V DD
V SS V DD
V SS
TP0
TN0
TP1
TN1TX0
TX1
发送器
图3 收发器的输入/输出控制逻辑
当SJA1000在睡眠模式中时在复位状
态
输出TX0和TX1悬空
表13列出了输出控制寄存器的设置
测试输出模式中
TN1
文档编号
TXD
OCTNx
í?íì
μ?ê?
TXCLK
μ?é?éy??±ê??×?ò???μ??aê?
?aà?μ???′ú±í×?ê±??μ?±??ˉoí′¥·¢
?ò??á÷2??êDío?óD?±á÷?a?t?úòtD????TD§?§??????á÷ê1
ó?TX0或TX1
电平发送第二位在TX1
上发送
依此类推
输出控制寄存器 = F8H
f OSC /2
表14 输出引脚配置 驱动 TXD OCTPX OCTNX OCPOLX
TPX(2) TNX(3) TXX(4) 悬空
× 0 0 × 关 关 悬空 0
0 1 0 关 开 低 1 0 1 0 关 关 悬空 0 0 1 1 关 关 悬空 上拉
1 0 1 1 关 开 低 0
1 0 0 关 关 悬空 1 1 0 0 开 关 高 0 1 0 1 开 关 高 下拉
1
1 0 1 关 关 悬空 上拉
1
1
关
开
低
文档编号
’X’表示
不影响
连接V
DD
连接V SS
μ±
TXD = 0和TXD 连续是1
时
位序列输出驱动引脚上的电平取决于被
OCTPx
悬空
下拉
编程的驱动器的特性和被OCPOLx 编程的输出端极性
CDR
?óê?±è??í¨μàoíBasicCAN 模式与PeliCAN
模式的选择0000 0101
oíIntel
模式
复位请求/
复位模式CDR.4
CDR
BIT.4
为保留位不能被写
2.3.3.8.1 CD.2
CD.2
?aD???ê?ó?à′?¨ò?ía2?CLKOUT 引
脚上的频率的
表
16 CLKOUT 频率选择 CD.2 CD.1
CD.0 时钟频率
0 0 0 f OSC /2 0 0 1 f OSC /4 0 1 0 f OSC /6 0 1 1 f OSC /8 1 0 0 f OSC /10 1 0 1 f OSC /12 1 1 0 f OSC /14 1 1
1 f OSC
注
XTAL
??óD?ú?′???£ê??D2??éò?D′·??ê
CLKOUT 引脚在睡眠模式中是低而其它情况下是高
当一条已接收的信息成功的通过验收滤波器帧的最后一位期间
见2.3.3.7节
但这只可在复位模式中
文档编号
这将会导致总线长度最大可能值的增加
只有RX0被
激活
例如
如果CDR.7是
·??ò
??óD?ú?′???£ê??Dê??éò?D′μ?
缓冲器是用来存储微控制器要SJA1000发送的信息的
发送缓冲器的读/
写只能由微控制器在工作模式下完成
表17 发送缓冲器列表 位
CAN 地址
区
名称 7 6 5 4 3 2 1 0 10 识别码字节1 ID.10 ID.9 ID.8 ID.7
ID.6
ID.5
ID.4
ID.3
11 描述符
识别码字节2 ID.2
ID.1
ID.0
RTR DLC.3 DLC.2 DLC.1 DLC.0
12 TX 数据1 发送数据字节1 13 TX 数据2 发送数据字节2 14 TX 数据3 发送数据字节3 15 TX 数据 4 发送数据字节4 16 TX 数据5 发送数据字节5 17 TX 数据6 发送数据字节6 18 TX 数据7 发送数据字节7 19
数据
TX 数据8
发送数据字节8
2.3.3.10 接收缓冲区
接收缓冲区的结构完全对应发送缓冲区具体
结构可参考2.3.3.9发送缓冲区
P0039P0138P0237P0336P0435P0534P0633
P0732ALE
30R
D 17WR
16
INT0
12
EA 31
U2
P89C52
1VDD 63
GND
4
5
U15P113
R34390
R35390TXD 1GND 2
VCC 3
RXD
4
Vref
5
CANL 6CANH 7S 8U11
TJA1050(SO-8)
CANBUS
R32390
R33390
R186K2
R194K7VCC Y212M
C7
30p
C830p
CAN_V
R305R315
AD023AD124AD225AD326AD427AD528AD61AD72R D 5WR 6ALE 3C S 4
RESET 17INT 16XTAL1
9
XTAL210VSS18VSS221VSS315VDD122VDD218VDD312MODE 11RX019RX120TX013TX114CLKOUT
7SJA1000
RESET_L
u1
基址为FA00的外部存储器片选信号
CAN_H
CAN_L
图6 节点接口电路简图
如图6所示为CAN 总线系统智能节点硬件电路原理图在CAN 总线通信接口中
TJA1050芯片
TJA1050
为高性能CAN 总线收发器
它最初是应用在波特率范围在60Kbps 特到
1Mbps 波特的高速自动化应用中为CAN 控制器提供不同的
接收性能
另外一个重要的特性是不上电时
TJA1050有两种工作模式S
文档编号
另一种为静音模式
将引脚
由于引脚
所以当它没有连接时在
高速模式中
并且以尽量快的速度切换
而且此时它的收发器循环延迟最小
发送器是禁能的
因此
它此时消耗的电源电流和在隐性状态时的一样
S
注
微控制器
P89C51
CAN 总线收
发器TJA1050和高速光电耦合器6N137í¨1y????SJA1000实
现数据的接收和发送等通信任务
AD7连接到P89C51的P0
口
CPU 可对SJA1000执行相应的读写操作
/WR
/INT 接P89C51的/INT0使P89C51可通过中断方式访问SJA1000
这一点必须注意
SJA1000的TX0和RX0并不是直接与TJA1050的TXD 和
RXD
相连这样就很好的实现了总线上各CAN 节点间的
电气隔离
应该特别说明的一点是光耦部分电路所采用的两个电源VCC 和CAN_V 必须完全隔离
电源的完全隔离可采用小功率电源隔离模块
这些部分虽然增加了节点的复杂
4设计要点
从以上的几个章节关于SJA1000
的介绍
1
ê×?èòa?ù?Y?¢′|àí????SJA1000的接口模式
还应注意SJA1000
的复位电路应为低电平有效
微处理器对SJ1000的控制访问是以外部存储器的方式
所以应该正确定义微处理器访问SJA1000
时
3
4
SJA1000
有两种不同的模式
对SJA1000的初始化只能在SJA1000的复位模式下进行
设置验收滤波器
输出控制
一定要校验
向SJA1000的发送缓冲区中写入数据时
如锁定
6
éè??×ü???¨ê±?÷°üà¨
???ü?úμ?3¤?è
?a′??ò??áD3?á?????ò?é?2?êyμ??ê??
1?ê?
í?ê±?ú±?í¨ó?3ìDò?D?ò??ìá1?á?3£ó?μ?2¨ì??êéè??2?êy?μ
硬件接口定义部分
SJA_BCNAFUNC.ASM
SJA_BCANCONF.ASM
?¢′|àí?÷μ?·??êμ??·
??SJA1000
内部寄存器的定义部分则不需修改
该定义文件的应用方法
或者直接将该文件的内容拷贝至自己的
应用程序的开始
文档编号
根据实际电路修改SJA1000
的片选基址定义
在自己应用程序文件的开始应用宏汇编指令应用宏汇编指令
时
5.1.2
通用子程序文件
只要硬件接口定义中SJA1000的片选基址与实际
电路相符合即可
对于输入
子程序清单
* CAN 控制器SJA1000基本CAN 汇编子程序说明(BasicCAN
工作方式
*目的
通过简单的参数设置和调用本文件提供子程序
*
便能使自己的CAN 系统进行基本的调试和运行
SJA_BCANFUNC.ASM
*
模块名
*
*
*
* 版本
****************************************************************************************** *******************************************************************************************
*
子程序名
*应用资源F0
*返回值*
0 *
1
*说明
******************************************************************************************* BCAN_CR
EATE_COMMUNATION
对测试寄存器进行读写测试
MOVX A,@DPTR MOV
A,#0AAH
读出值
CJNE
A,#0AAH,BCAN_CM_QUIT
再次测试
MOVX
@DPTR,A
文档编号
测试写入读出是否正确
CLR
A
接口正确
BCAN_CM_QUIT
************************************************************************
******************* *
应用资源F0
*返回值*
0
*
1
*说明
*******************************************************************************************
BCAN_ENTER_RETMODEL
控制寄存器访问
MOVX A,@DPTR ORL
A,#01H
验证复位请求是否写入
JB ACC.0,BCAN_ER_QUIT SETB
F0
******************************************************************************************* *
应用资源F0
*返回值
*
0 *
1
*说明
******************************************************************************************* BCAN_QUI
T_RETMODEL
控制寄存器访问
MOVX
A,@DPTR
清零复位请求
验证是否退出复位状态
SETB F0
BCAN_QR_QUIT
文档编号
******************************************************************************************* ;*子程序: BCAN_SET_BANDRATE ;*应用资源: DPTR,ACC,R5,R6,R7,F0 ;*参数说明: R7
波特率
需自己计算
******************************************************************************************* ;*子程序调用示例: * ;* USER_CODE: ;;用户代码 * ;* ----- ----- *
;* MOV R7, #06 ;;设置波特率100KBPS * ;* LCALL BCAN_SET_BANDRATE ;;调用子程序 * ;* JNB F0, USER_CODE1
;;
成功
跳到错误处理 *
;* USER_CODE1: * ;* ----- -----
;;用户代码
*
MOV
A,R7
输入的值大于
12
查表找出相应的预设第一个值
MOVC A,@A+DPTR MOV R5,A
找出第二个值
RL A INC
A
文档编号
暂存当前值
MOV DPTR,#REG_BTR0
位宽度
MOV A,R5 MOVX @DPTR,A SETB F0
MOVX A,@DPTR XRL A,R5
不正确
INC DPTR MOV A,R6 MOVX @DPTR,A MOVX A,@DPTR XRL
A,R6
RET
BCAN_SETBR: DB 053H, 02FH ;20KBPS 的预设值 DB 087H, 0FFH
;40KBPS 的预设值 DB 047H, 02FH ;50KBPS 的预设值 DB 083H, 0FFH ;80KBPS 的预设值 DB 043H, 02fH ;100KBPS 的预设值 DB 03H, 01cH ;125KBPS 的预设值 DB 081H, 0faH ;200KBPS 的预设值 DB 01H, 01cH ;250KBPS 的预设值 DB 080H, 0faH ;400KBPS 的预设值 DB 00H, 01cH ;500KBPS 的预设值 DB 080H, 0b6H ;666KBPS 的预设值 DB
00H, 016H ;800KBPS 的预设值 DB 00H,
014H
;1000KBPS 的预设值
*
子程序名
*应用资源
R6
存放验收代码寄存器
*
R6AMR
F0*
0 *
1
*
说明允许接收的报文ID 号的高8位(D10
D3)
*
报文满足以下条件的ID 号的报文才可以被接收
ID.10AM.7
11111111
*******************************************************************************************
BCAN_SET_OBJECT
文档编号
写ACR 寄存器
MOV A,R7 MOVX @DPTR,A MOVX A,@DPTR SETB F0 XRL
A,R7
写AMR 寄存器
MOV A,R6 MOVX @DPTR,A MOVX A,@DPTR SETB F0 XRL
A,R6
RET
*
子程序名
*应用资源
R6
*参数设置
OCR
存放时钟分频寄存器
*返回值
*
0 *
1
*说明
该子程序只能用于复位模式
MOV
DPTR,#REG_OCR
检验写入是否正确
JNZ BCAN_SETOC_QUIT CLR F0
MOV
DPTR,#REG_CDR
检验写入是否正确
JNZ BCAN_SETOC_QUIT CLR
F0
BCAN_SETOC_QUIT
文档编号
*******************************************************************************************
*应用资源
R0
*参数说明
*返回值
* 0 * 1 * *
*说明然后启动SJA1000
发送
*
定帧格式为以后为数据
*
志符
本函数的返回值仅指示将数据正确写入SJA1000发送缓存区中与否*
该数据正确发送到CAN 总线上完毕与否
请在本子程序后调用发送
***********************************************************************
******************** * USER_CODE *
装入微处理器要发送数据的首地址
调用子程序
继续用户代码
写入发送缓冲区错跳到错误处理
*******************************************************************************************
BCAN_DATA_WRITE
读取状态寄存器
MOVX
A,@DPTR
正在发送退出
CLR F0 MOVX
A,@DPTR
锁定则跳出
CLR F0
INC
R0
ID 号的低3位 \RTR 位 \数据长度DLC
DEC R0
发送缓冲区首地址
JB
ACC.4,BCAN_WYB
数据帧
ANL A,#0FH
计算报文的长度
MOV R7,A
AJMP
BCAN_WRTXBUF