CAN总线地使用.docx

上传人:b****1 文档编号:2394110 上传时间:2023-05-03 格式:DOCX 页数:17 大小:79.76KB
下载 相关 举报
CAN总线地使用.docx_第1页
第1页 / 共17页
CAN总线地使用.docx_第2页
第2页 / 共17页
CAN总线地使用.docx_第3页
第3页 / 共17页
CAN总线地使用.docx_第4页
第4页 / 共17页
CAN总线地使用.docx_第5页
第5页 / 共17页
CAN总线地使用.docx_第6页
第6页 / 共17页
CAN总线地使用.docx_第7页
第7页 / 共17页
CAN总线地使用.docx_第8页
第8页 / 共17页
CAN总线地使用.docx_第9页
第9页 / 共17页
CAN总线地使用.docx_第10页
第10页 / 共17页
CAN总线地使用.docx_第11页
第11页 / 共17页
CAN总线地使用.docx_第12页
第12页 / 共17页
CAN总线地使用.docx_第13页
第13页 / 共17页
CAN总线地使用.docx_第14页
第14页 / 共17页
CAN总线地使用.docx_第15页
第15页 / 共17页
CAN总线地使用.docx_第16页
第16页 / 共17页
CAN总线地使用.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

CAN总线地使用.docx

《CAN总线地使用.docx》由会员分享,可在线阅读,更多相关《CAN总线地使用.docx(17页珍藏版)》请在冰点文库上搜索。

CAN总线地使用.docx

CAN总线地使用

CAN总线的使用

1、硬件连接方式

硬件电路如下图所示:

 

图中,D1(IL712)是磁隔离器件,其作用为了使各下井仪之间实现电气隔离。

各下井仪需要为D1提供两组+5V电源,图中标为VCC1和VCC2。

其中,VCC1为仪器部数字电源,提供给单片机C8051F041和其它数字电路;VCC2是隔离电源,用于给IL712和TJA1050供电,电源电流应大于75mA。

C1、C2为两组电源的滤波电容。

D1的2脚与C8051F041(图中未画)的7脚(CANTX)直接连接,D1的3脚与C8051F041的6脚(CANRX)直接连接。

D2(TJA1050)为CAN总线收发器,该器件应用VCC2供电。

C3为该器件的滤波电容。

D2的输出CANH(6脚)、CANL(7脚)直接连接到下井仪的总线上。

R1、R2、C4为CAN总线终端匹配电阻的接法,这三个器件只需要在处在下井仪串上下两端的仪器中需要。

即:

在某仪器中,如果CAN总线是贯通线,则不能连接这三个器件,反之,如果在该仪器中,如果CAN总线不是贯通线,则需要连接这三个器件。

输出的CANH和CANL应双绞。

 

2、软件使用方法

编程者应该熟悉以下两本资料:

《C8051F040/1/2/3/4/5/6/7混合信号ISPFLASH微控制器数据手册》

《Bosch’sC_CANUser’sManual》

在下井仪中建议采用C8051F041或C8051F040单片机,该单片机部集成了BoschCAN控制器。

以下简要介绍C8051F04x单片机和BoschCAN控制器及其软件编程方法。

2.1C8041F04x单片机SFR的分页机制

C8051F04x系列MCU对CIP-51核和外设有几项关键性的改进,提高了整体性能。

其中与编程密切相关的一点是使用了SFR(特殊功能寄存器)分页机制,允许器件将很多SFR映射到0X80~0XFF这个存储器空间。

C8051F04x器件使用了5个SFR页:

0、1、2、3和F。

使用特殊功能寄存器页选择寄存器SFRPAGE来选择SFR页。

因此,读、写一个SFR的步骤为:

1.用SFRPAGE寄存器选择相应的SFR页号。

2.用直接寻址方式读、写特殊功能寄存器。

(与以前的用法相同)。

使用CAN控制器时,需要将SFRPAGE设置为1(用指令movsfrpage,#1)。

编程中用到的其它特殊功能寄存器可参看数据手册说明。

2.2C8041F04x单片机中CAN相关特殊功能寄存器

参看数据手册第201~203页。

2.2.1CAN控制器寄存器的访问方式

可以直接通过访问一般SFR方式访问的寄存器共有6个:

CAN0CNCAN控制寄存器

CAN0STACAN状态寄存器

CAN0TSTCAN测试寄存器

CAN0ADR寄存器索引地址

CAN0DATH数据字高字节

CAN0DATL数据字低字节

其它CAN控制器寄存器只能通过CAN0ADR、CAN0DATH、CAN0DATL访问。

访问方式:

先向CAN0ADR中写入待访问CAN控制器寄存器的索引号,然后通过CAN0DATH写入或读出高字节,通过CAN0DATL写入或读出低字节。

例如:

0X5号寄存器其中写入0X1234h,可采用以下三条指令:

movcan0adr,#0x5movcan0dath,#12hmovcan0datl,#34h

对于某些索引地址,在向can0datl进行写入或读出操作后,can0adr有自动加1功能,因此必须向操作can0dath,再操作can0datl。

CAN0CN、CAN0STA、CAN0TST也有索引地址,也可以通过地址索引方式访问。

2.2.3CAN控制器寄存器组成

CAN控制器寄存器可分为以下几类:

2.2.3.1CAN控制器协议相关寄存器

1CAN控制寄存器(索引地址=0x00)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

res

res

res

res

res

res

res

res

Test

CCE

DAR

CANIF

EIE

SIE

IE

Init

r

r

r

r

r

r

r

r

rw

rw

rw

r

rw

rw

rw

rw

Test=1测试模式Test=0正常工作模式一般将Test位置0

CCE=1时可以控制更改位定时寄存器一般将CCE位置0

DAR禁止自动重发功能使用中将该位置1

CANIFCAN中断标志

EIE错误中断使能

SIE状态中断使能

IECAN中断使能

Init初始化时将该位置1,正常工作时将该位置0

2CAN状态寄存器(索引地址=0x01)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

res

res

res

res

res

res

res

Res

BOff

EWarn

EPass

RxOK

TxOK

LEC

r

r

r

r

r

r

r

R

r

r

r

rw

rw

rw

该寄存器反映CAN控制器的状态。

BOff处于离线状态(=1)

EWarn警告状态(=1说明错误计数器中至少有一个达到错误警告的极限值)

EPass处于被动错误状态

RxOK自上次这位被清0后,又成功地收到一条消息

TxOK自上次这位被清0后,又成功地发送一条消息

LECCAN总线上最后一次错误的类型

3CAN错误计数器(索引地址=0x02)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

RP

REC6-0

TEC7-0

r

R

r

RP接收被动错误达到CAN协议规定的被动错误水平(=1)

REC6-0接收错误计数器,记录接收错误的次数

TEC7-0发送错误计数器,记录发送错误的次数

4CAN位定时寄存器(索引地址=0x03)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

res

Tseg2

Tseg1

SJW

BRP

r

rw

rw

rw

rw

该寄存器的设置与CAN总线通讯的波特率有关,各下井仪需统一设定,各位含义可参看CAN控制器用户手册。

5CAN测试寄存器(索引地址=0x04)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

res

res

res

res

res

res

res

Res

Rx

Tx1

Tx0

Lback

Silent

Basic

res

res

r

r

r

r

r

r

r

R

r

rw

rw

rw

rw

rw

r

r

该寄存器只有在CAN控制寄存器中的Test位=1时才有效,用于测试CAN总线的通讯功能,在正常工作时不使用。

6CAN位定时扩展寄存器(索引地址=0x06)

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

res

res

res

res

res

res

res

res

res

res

res

res

BRPE

r

r

r

r

r

r

r

r

r

r

r

r

rw

该寄存器的设置与CAN总线通讯的波特率有关,各下井仪需统一设定,各位含义可参看CAN控制器用户手册。

2.2.3.2消息对象接口寄存器

CAN控制器中有一块消息RAM,可以存储32条消息对象,每条消息对象中包含8字节有用数据及其它协议相关控制信息。

CPU访问消息RAM中任何一条消息对象都必须通过消息对象接口寄存器完成。

CAN控制器中共有两套消息对象接口寄存器IF1和IF2。

IF1和IF2除了在测试模式下的用法有所不同外,在正常工作时用法相同。

可以将一套用于将数据写入消息RAM,另一套用于从消息RAM中读取数据。

在此,只介绍IF1寄存器组的用法。

1IF1命令请求寄存器(索引地址=0x08)

 

MessageNumber为消息对象的编号,有效值为0x01~0x20,分别对应32个消息对象,用于设定要访问的消息对象的编号。

CPU向命令请求寄存器中写入消息编号后,消息就在IF1寄存器组与消息RAM之间开始传送。

随着写操作,Busy位自动置1,传送过程完成后,Busy自动清0。

因此,必须在完成IF1寄存器组中其它寄存器的设置后,再向IF1命令请求寄存器写入消息编号。

2IF1命令掩码寄存器(索引地址=0x09)

IF1命令掩码寄存器中的控制位指定传输方向,并选择消息对象的哪些位作为数据传输的目的或源。

 

WR/RD读/写

1写:

数据从IF1送到消息RAM中

0读:

数据从消息送到IF1

Mask存取Mask位

1传输IdentifierMask+Mdir+MXtd位

0屏蔽位不变化

Arb存取仲裁位

1传输IdentifierMask+Dir+Xtd+Msgval位

0仲裁位不变化

Control存取控制位

1传输控制位到消息RAM中

0控制位不变化

ClrIntPnd清除中断请求位

读操作时1清除消息RAM中的IntPnd位

0不改变IntPnd位

在写操作时,此位被忽略

TxRqst/NewDat存取传输请求位

读操作时1清除消息对象中的NewDat位

0不改变NewDat位

写操作时1将传输请求位置1

0不改变传输请求位

DataA存取数据字节0-3

1传输数据字节0-3

0不改变数据字节0-3

DataB存取数据字节4-7

1传输数据字节4-7

0不改变数据字节4-7

3IF1掩码1(索引地址=0x0a)、IF1掩码2(索引地址=0x0b)

Msk28-Msk0

1相应的位使用接受过滤

0消息对象的ID号中对应位不用于接受过滤

MXtd

1在接受过滤中使用扩展ID号0不使用扩展ID号

 

MDir

1消息方向位Dir用于接受过滤中

0消息方向位Dir在接受过滤中不使用

4IF1仲裁1(索引地址=0x0c)、IF1仲裁2(索引地址=0x0d)

 

ID28-ID0消息对象的ID号

标准帧只使用ID28-ID18

MsgVal

1该消息对象已经配置,消息处理器纳入处理

0消息处理器不考虑该消息对象

Xtd

1使用29位ID号(扩展帧)

0使用11位ID号(标准帧)下井仪器中一律采用标准帧

Dir

1消息对象方向为发送,消息对象作为数据帧传送

0消息对象方向为接收,收到匹配ID号的数据帧时,存储在该消息对象中

4IF1消息控制(索引地址=0x0e)

 

NewDat1消息处理器或CPU向消息对象中写入了新的数据

MsgLst1CPU丢失了消息

IntPnd1该消息对象是中断源

UMask1使用屏蔽(Msk28-Msk0,MXtd,Mdir)作为接受过滤

TxIE1成功地发送一条消息

RxIE1成功地接收一条消息

RmtEn1远程帧使能下井仪中不使用远程帧

TxRqst1该消息对象请求发送,尚未完成

Eob1单个的消息对象或一个FIFO缓存的最后一个消息对象

DLC3-0数据长度0-8

5IF1数据A1、A2、B1、B2

8字节有效数据

2.2.3.3消息处理器寄存器

这些只读寄存器用于向CPU提供有关消息对象的信息

消息RAM中可以存储32条消息对象,每个消息对象都包含了2.2.3.2中说明的可与IF1交互的信息位。

消息处理器寄存器的所有信息都是32位,每位分别对应一条消息对象。

1发送请求1、发送请求2

 

1说明该消息对象被请求发送,还没有完成发送

2新数据1、新数据2

 

1说明该消息对象中写入了新数据

CPU可以通过读取该位,检查哪个消息对象的数据部分被更新了。

3中断标志1、中断标志2

 

1指明该消息对象是一个中断源

 

4消息有效1、消息有效2

 

1该消息已经配置好,消息处理器予以考虑

3、软件编程示例

软件编程需要实现三个功能:

1初始化(设定位定时寄存器及消息对象)

2发送消息

3读取接收的消息

3.1初始化位定时寄存器示例

movsfrpage,#1;将Sfrpage指向can0page页

movcan0cn,#41h;init位=1CCE=1允许写位定时寄存器

movcan0adr,#3;地址寄存器指向位定时寄存器

movcan0dath,#18h;先写高字节

movcan0datl,#40h;位定时寄存器设为0x1840

3.2初始化接收消息对象示例

初始化对象的作用是设置消息对象需要实现的功能,即设置CAN控制器部的消息RAM中某个消息对象的各个位域值。

①设定该对象用于发送还是接收;

②设定该对象接收或发送的ID号,如用于接收还需要设定是否使用接受过滤功能;

初始化对象通过IF1或IF2寄存器组完成设置,首先确定要设置的消息对象的性质。

在此,假设初始化消息RAM(共20个消息对象)中的第一个对象,作用是只接受ID=11的数据。

假设我们用IF1寄存器组设置消息对象。

首先确定消息对象的各个位域的值:

ID=11转换为2进制数为1011b

以下根据要求确定IF1各个寄存器的值:

①IF1Mask1(掩码)的值为0000h(因为我们约定使用11位ID的标准帧,所以有用的ID位仅为ID28~ID18,Mask15-0为未用位,设为0)

②IF1Mask2的值为1FFCh(含义:

MXtd=0表示在接受过滤中不使用扩展ID号,MDir=0表示在接受过滤中不考虑数据传输方向,后面为11位1表示只接受与ID=IF1Arb中设定ID号的数据帧,最后两位对应与ID17、ID16因未使用设为0)

③IF1Arb1(仲裁)的值为0000h(理由同①)

④IF1Arb2的值为802Ch(含义:

MsgVal=1表示设置该消息RAM有效,如该位=0,相当与该消息RAM不在使用中;Dir=0表示设定为接受消息;后面为ID号×4的二进制数,因为最低两位为ID17、ID16)

⑤IF1消息控制值为1088h(含义:

UMask=1表示设置消息过滤功能;Eob=1表示该消息对象不属于一个FIFO;DLC3-0=8表示发送8字节数据,不影响接收过程,接收完成后,自动填充接收到的有效字节数)。

⑥IF1命令掩码寄存器值为00F0h(含义:

WR=1表示从IF1向消息RAM写;Mask=1表示传输IDMask+Mdir+MXtd到消息对象中;Arb=1表示传输ID+Dir+Xtd+Msgval到消息对象中;Control=1表示传输控制位到消息对象中)

⑦IF1命令请求寄存器值为0001h(含义传送IF1寄存器组容到第一个报文对象中;这个寄存器必须在设置完IF1的其它寄存器后再写,因为一旦向这个寄存器中写入值后,IF1寄存器组与消息RAM就开始交换数据了。

以下是程序代码:

movsfrpage,#1

movcan0adr,#9

movcan0dath,#00h;这句可以省略

movcan0datl,0f0h;执行完后can0adr自动加1

movcan0dath,#0

movcan0datl,#0

movcan0dath,ifxmask2h

movcan0datl,ifxmask2l

movcan0dath,#0

movcan0datl,#0

movcan0dath,1fh

movcan0datl,fch

movcan0dath,00h

movcan0datl,00h

movcan0dath,#80h

movcan0datl,#2ch

movcan0dath,#10h

movcan0datl,#08h

movcan0adr,#8

movcan0dath,#00h;这句可以省略

movcan0datl,#01h

3.3读取消息示例

在此,假设上述设置中,消息RAM中的第一个对象中收到了新的数据,可通过以下程序读取。

在此,我们只通过IF2寄存器组读取数据,而不考虑其它位的读取。

将读取的8字节数据放在30h~37h单元中,有效字节个数放在38h单元中。

movsfrpage,#1

movcan0adr,#21h

movcan0dath,#00h;这句可省略

movcan0datl,#1fh

movcan0adr,#20h

movcan0dath,#00h;这句可省略

movcan0datl,#01h

here:

mova,can0dath

jbacc.7,here;等待传送完成

movcan0adr,#26h

mova,can0datl

anla,#0fh

mov30h,can0dath

mov31h,can0datl

mov32h,can0dath

mov33h,can0datl

mov34h,can0dath

mov35h,can0datl

mov36h,can0dath

mov37h,can0datl

3.4初始化发送消息对象示例

在此,假设初始化消息RAM(共20个消息对象)中的第一个对象,作用是发送ID=11的数据。

假设我们需要发送8字节数据,用IF1寄存器组设置消息对象。

首先确定消息对象的各个位域的值:

ID=11转换为2进制数为1011b

以下根据要求确定IF1各个寄存器的值:

①IF1Mask1(掩码)的值对于发送无作用,可以不设置

②IF1Mask2的值对于发送无作用,可以不设置

③IF1Arb1(仲裁)的值为0000h(理由同①)

④IF1Arb2的值为A02Ch(含义:

MsgVal=1表示设置该消息RAM有效,如该位=0,相当与该消息RAM不在使用中;Dir=1表示设定为发送消息;后面为ID号×4的二进制数,因为最低两位为ID17、ID16)

⑤IF1消息控制值为0088h(含义:

Eob=1表示该消息对象不属于一个FIFO;DLC3-0=8表示发送8字节数据,如果发送小于8字节数据,则该为相应值)。

⑥IF1命令掩码寄存器值为00b0h(含义:

WR=1表示从IF1向消息RAM写;Arb=1表示传输ID+Dir+Xtd+Msgval到消息对象中;Control=1表示传输控制位到消息对象中)

⑦IF1命令请求寄存器值为0001h(含义传送IF1寄存器组容到第一个报文对象中;这个寄存器必须在设置完IF1的其它寄存器后再写,因为一旦向这个寄存器中写入值后,IF1寄存器组与消息RAM就开始交换数据了。

以下是程序代码:

movsfrpage,#1

movcan0adr,#9

movcan0dath,#00h;这句可以省略

movcan0datl,0b0h;执行完后can0adr自动加1

movcan0adr,#0ch

movcan0dath,#0

movcan0datl,#0

movcan0dath,0a0h

movcan0datl,2ch

movcan0dath,00h

movcan0datl,88h

movcan0adr,#8

movcan0dath,#00h;这句可以省略

movcan0datl,#01h

3.5发送消息示例

在此,假设上述设置中,用消息RAM中的第一个对象发送数据。

在此,我们通过IF1寄存器组发送数据。

将读取的8字节数据放在30h~37h单元中,有效字节个数放在38h单元中。

movsfrpage,#1

movcan0adr,#09h

movcan0datl,#97h

movcan0adr,#0eh

movcan0dath,#01h

mova,38h

orla,#80h

movcan0datl,a

movcan0dath,30h

movcan0datl,31h

movcan0dath,32h

movcan0datl,33h

movcan0dath,34h

movcan0datl,35h

movcan0dath,36h

movcan0datl,37h

movcan0adr,#08h

movcan0dath,#00h;这句可省略

movcan0datl,#01h

执行完后,CAN控制器便开始自动发送数据。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2