文档库 最新最全的文档下载
当前位置:文档库 › 周立功CAN控制器SJA1000的控制模块BCAN

周立功CAN控制器SJA1000的控制模块BCAN

周立功CAN控制器SJA1000的控制模块BCAN
周立功CAN控制器SJA1000的控制模块BCAN

文档编号

将会得到越来越广泛的应用

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

相关文档