CAN总线的使用.docx
- 文档编号:4060839
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:19
- 大小:61.66KB
CAN总线的使用.docx
《CAN总线的使用.docx》由会员分享,可在线阅读,更多相关《CAN总线的使用.docx(19页珍藏版)》请在冰点文库上搜索。
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'C_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,再操作can0dat。
CAN0CN、CAN0STA、CAN0TST也有索引地址,也可以通过地址索引方式访问。
2.2.3CAN控制器寄存器组成
CAN控制器寄存器可分为以下几类:
223.1CAN控制器协议相关寄存器
1CAN控制寄存器(索引地址二0x00)
res
res
res
res
res
res
res
res
Test
CCE
DAR
CANIF
EIE
SIE
IE
Init
rrrrrrrrrwrwrwrrwrwrwrw
Test=1测试模式Test=0正常工作模式一般将Test位置0
CCE=1时可以控制更改位定时寄存器一般将CCE位置0
DAR禁止自动重发功能使用中将该位置1
CANIFCAN中断标志
EIE错误中断使能
SIE状态中断使能
IECAN中断使能
Init初始化时将该位置1,正常工作时将该位置0
2CAN状态寄存器(索引地址二0x01)
res
res
res
res
res
res
res
Res
BOff
EWarn
EPass
RxOK
TxOK
LEC
rrrrrrrRrrrrwrwrw
该寄存器反映CAN控制器的状态。
BOff处于离线状态(二1)
EWarn警告状态(二1说明错误计数器中至少有一个达到错误警告的极限值)
EPass处于被动错误状态
RxOK自上次这位被清0后,又成功地收到一条消息
TxOK自上次这位被清0后,又成功地发送一条消息
LECCAN总线上最后一次错误的类型
3CAN错误计数器(索引地址二0x02)
RP
REC6—0
TEC7—0
rRr
RP接收被动错误达到CAN协议规定的被动错误水平(二1)
REC6-0接收错误计数器,记录接收错误的次数
TEC7-0发送错误计数器,记录发送错误的次数
4CAN位定时寄存器(索引地址二0x03)
res
Tseg2
Tseg1
SJW
BRP
r
rw
rw
rw
rw
该寄存器的设置与CAN总线通讯的波特率有关,各下井仪需统一设定,各位含义可参看CAN控制器用户手册。
5CAN测试寄存器(索引地址二0x04)
res
res
res
res
res
res
res
Res
Rx
Tx1
Tx0
Lback
Silent
Basic
res
res
rrrrrrrRrrwrwrwrwrwrr该寄存器只有在CAN控制寄存器中的Test位二1时才有效,用于测试CAN总线的通讯功能,在正常工作时不使用。
6CAN位定时扩展寄存器(索引地址二0x06)
res
res
res
res
res
res
res
res
res
res
res
res
BRPE
rrrrrrrrrrrrrw
该寄存器的设置与CAN总线通讯的波特率有关,各下井仪需统一设定,各位含义可参看CAN控制器用户手册。
223.2消息对象接口寄存器
CAN控制器中有一块消息RAM,可以存储32条消息对象,每条消息对象中包含8字节有用数据及其它协议相关控制信息。
CPU访问消息RAM中任何一条消息对象都必须通过消息对象接口寄存器完成。
CAN控制器中共有两套消息对象接口寄存器IF1和IF2。
IF1和IF2除了在测试模式下的用法有所不同外,在正常工作时用法相同。
可以将一套用于将数据写入消息RAM,另一套用于从消息RAM中读取数据。
在此,只介绍IF1寄存器组的用法。
1IF1命令请求寄存器(索引地址二0x08)
1F1CommandRequestRepi^ter15141312II109S16543210
■'.'xll&17x10)
Busy
1U5
1T5
ITS
res
1X5
rei
IC5
rc?
res
IF2ConinimdReqiwtiReeivie:
Nf
re?
res
『躬
res
ie<
1VS
re?
Xumb*i
0.\--1<<■Ox-0)
MessageNumber为消息对象的编号,有效值为0x01〜0x20,分别对应32个消息对象,用于设定要访问的消息对象的编号。
CPU向命令请求寄存器中写入消息编号后,消息就在IF1寄存器组与消息RAM之间开始传送。
随着写操作,Busy位自动置1,传送过程完成后,Busy自动清0。
因此,必须在完成IF1寄存器组中其它寄存器的设置后,再向IF1命令请求寄存器写入消息编号。
2IF1命令掩码寄存器(索引地址二0x09)
IF1命令掩码寄存器中的控制位指定传输方向,并选择消息对象的哪些位作为数据传输的目的或源。
rrnComrnd>■k
faddi申殆A.0x12)
res
Aib
Conrro]
Clrljn护nd
TxKqMNwD;i[
DamA
DataB
It-2(-onmiAnd
OxJj&Ox12»
re年
^■RRP
31祜k
Aib
cQinhul
ciFlmrPnd
I啟q师
VwDftt
Data4
DataR
irjrrrrrnvrwmrwn、rwiwrw
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号
[FlMask1Register
15
14
13
1211109B765432IQ
Mskl50
LF1XLisk2Rjd^uslei(addressesOxLOx
res
\hkZS-1fi
IF?
]Rp^i^ter
('address旳暫&5卜)
MSK154
疋』Mask2Register
MXrd
MDll
re?
MsklB16
0x>17&OxlC}
rw
r
iwiwmnviwtwnvi诵iwm
MDir
1消息方向位Dir用于接受过滤中
0消息方向位Dir在接受过滤中不使用
4IF1仲裁1(索引地址二OxOc)、IF1仲裁2(索引地址二OxOd)
IF1Arbitration1
faddre歸咋Cm旧矗侧1引
151413121110G16543210
ID5-0
111Arbitration2Regiiter(Mdit?
沙已、OkJB&OxIA)
Ms£Val
Xr Dir ID2S1« IF2Arbitranon1Register(addi^sse^0x49&0x4S) n>i54> Lt2Aibitraiion2Register(rtdilioso0x4B&0x4A) Ms寶al Xtd Di] 1D2S16 rwrarrwitvrwrwrwnvrwnvnvrwnvrwrwrW ID28—ID0消息对象的ID号标准帧只使用ID28—ID18 MsgVal 1该消息对象已经配置,消息处理器纳入处理 0消息处理器不考虑该消息对象 Xtd 1使用29位ID号(扩展帧) 0使用11位ID号(标准帧)下井仪器中一律采用标准帧 Dir 1消息对象方向为发送,消息对象作为数据帧传送 0消息对象方向为接收,收到匹配ID号的数据帧时,存储在该消息对象中 4IF1消息控制(索引地址二0x0e) 旺LMessageControlRegiUer(addiessesOxlD&0x10 1j L4 1J 12 LL10 98 7 6 5 4 J2]0 N^Dnr lEgr.-r IntPnd IM缶 TxIFR'tTF RwFn TTRq-T FflB W TIM T)Tc? a H2ControlRe^ster lutl'ud lAUik 1x11HxIL ItintLn JxRq^t LaB l*$ ie$ DLC3-0 讥山OxJD&Ox1C) ru rw rwtw rw r r r rw NewDat1消息处理器或CPU向消息对象中写入了新的数据 MsgLst1CPU丢失了消息 IntPnd1该消息对象是中断源 UMask1使用屏蔽(Msk28—Msk0,MXtd,Mdir)作为接受过滤 io9a : .心忖◎卞井 TxIE1成功地发送一条消息 TsRqst2^-17 TRXIE湎甲。 成功地接收一条消息1211RmtEn^竽i远程帧使能袴 Eob1单个的消息对象或一个FIFO缓存的最后一个消息对象 DLC3-0数据长度0—8 5IF1数据A1、A2、B1、B2 8字节有效数据 223.3消息处理器寄存器 这些只读寄存器用于向CPU提供有关消息对象的信息 消息RAM中可以存储32条消息对象,每个消息对象都包含了2.2.3.2中说 明的可与IF1交互的信息位。 消息处理器寄存器的所有信息都是32位,每位分别对应一条消息对象。 1发送请求1、发送请求2 TtBiiswi^siqnRequest1Rfguter&XLl&OxSO) 15141312It109S76543210 TxRqstl#9 riRqslfl1 TraiKiiiis-iiofiReqtie'bt2ster TxRqst2-kl7 1说明该消息对象被请求发送,还没有完成发送 2新数据1、新数据2 NewDhca1R^eeibin 1514B121110S 76543210 XenDatLC-? >euDatS-i Ne^1D^(a2Rtgisiei >oiD;i[? 225 D;i<24-17 0s02) r r 1说明该消息对象中写入了新数据 CPU可以通过读取该位,检查哪个消息对象的数据部分被更新了 3中断标志1、中断标志2 [titerruplPeuJiiLir1 (ccl±ossesDxAlJrUxAOt 1514B1211L09S765身3210 InrPl] rntPndSJ LntemiptPsuduig2Register(atklres^sOxAW&flxA2) IntPudJZ-Z? lntPnd24-17 rr 1指明该消息对象是一个中断源 4消息有效1消息有效2 \伽谄獣Vfilid1RegistPi-但山血注肌OxBlArOxBO) 15141312ll1098 6543210 Valid"Riislfr I r 1该消息已经配置好,消息处理器予以考虑 3、软件编程示例 软件编程需要实现三个功能: 1初始化(设定位定时寄存器及消息对象) 2发送消息 3读取接收的消息 3.1初始化位定时寄存器示例 mov sfrpage,#1; 将Sfrpage指向can0page页 mov can0cn,#41h; init位=1CCE=1允许写位定时寄存器 mov can0adr,#3; 地址寄存器指向位定时寄存器 mov can0dath,#18h ;先写咼字节 mov can0datl,#40h ;位定时寄存器设为0x1840 3.2初始化接收消息对象示例 初始化对象的作用是设置消息对象需要实现的功能,即设置CAN控制器内 部的消息RAM中某个消息对象的各个位域值。 1设定该对象用于发送还是接收; 2设定该对象接收或发送的ID号,如用于接收还需要设定是否使用接受过滤功能; 初始化对象通过IF1或IF2寄存器组完成设置,首先确定要设置的消息对象的性质。 在此,假设初始化消息RAM(共20个消息对象)中的第一个对象,作用是只接受ID二11的数据。 假设我们用IF1寄存器组设置消息对象。 首先确定消息对象的各个位域的值: ID=11转换为2进制数为1011b 以下根据要求确定IF1各个寄存器的值: 1IF1Mask1(掩码)的值为OOOOh(因为我们约定使用11位ID的标准 帧,所以有用的ID位仅为ID28〜ID18,Mask15-0为未用位,设为0) 2IF1Mask2的值为仆FCh(含义: MXt40表示在接受过滤中不使用扩展ID号,MDir=0表示在接受过滤中不考虑数据传输方向,后面为11位1表示只接受与ID=IF1Arb中设定ID号的数据帧,最后两位对应与ID17、ID16因未使用设为0) 3IF1Arb1(仲裁)的值为0000h(理由同①) 4IF1Arb2的值为802Ch(含义: MsgVal=1表示设置该消息RAMt效,如该位=0,相当与该消息RAM^在使用中;Dir=0表示设定为接受消息;后面为ID号X4的二进制数,因为最低两位为ID17、ID16) 5IF1消息控制值为1088h(含义: UMasA1表示设置消息过滤功能;Eob二1表示该消息对象不属于一个FIFO;DLC3-0=8表示发送8字节数据,不影响接收过程,接收完成后,自动填充接收到的有效字节数)。 6IF1命令掩码寄存器值为00F0h(含义: WA1表示从IF1向消息RAM写;Mask=1表示传输IDMask+Mdir+MXtd到消息对象中;Arb=1表示传输ID+Dir+Xtd+Msgval到消息对象中;Control=1表示传输控制位到消息对象中) 7IF1命令请求寄存器值为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,#8movcan0dath,#00h;这句可以省略 movcan0datl,#01h 3.3读取消息示例 在此,假设上述设置中,消息RAM中的第一个对象中收到了新的数据,可 通过以下程序读取。 在此,我们只通过IF2寄存器组读取数据,而不考虑其它位的读取。 将读取的8字节数据放在30h〜37h单元中,有效字节个数放在38h单元中。 mov sfrpage,#1 mov can0adr,#21h mov can0dath,#00h ;这句可省略 mov can0datl,#1fh mov can0adr,#20h mov can0dath,#00h ;这句可省略 mov can0datl,#01h here: mova,canOdath jbacc.7,here;等待传送完成 movcanOadr,#26h mova,canOdatl anla,#Ofh mov30h,canOdath mov31h,canOdatl mov32h,canOdath mov33h,canOdatl mov34h,canOdath mov35h,canOdatl mov36h,canOdath mov37h,canOdatl 3.4初始化发送消息对象示例 在此,假设初始化消息RAM(共20个消息对象)中的第一个对象,作用是发送ID二11的数据。 假设我们需要发送8字节数据,用IF1寄存器组设置消息对象。 首先确定消息对象的各个位域的值: ID=11转换为2进制数为1011b 以下根据要求确定IF1各个寄存器的值: 1IF1Mask1(掩码)的值对于发送无作用,可以不设置 2IF1Mask2的值对于发送无作用,可以不设置 3IF1Arb1(仲裁)的值为OOOOh(理由同①) 4IF1Arb2的值为A02Ch(含义: MsgVal=1表示设置该消息RAMt效,如该位=0,相当与该消息RAM^在使用中;Dir=1表示设定为发送消息;后面为ID号X4的二进制数,因为最低两位为ID17、ID16) 5IF1消息控制值为0088h(含义: Eob=1表示该消息对象不属于一个FIFO;DLC3-0=8表示发送8字节数据,如果发送小于8字节数据,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAN 总线 使用