CAN总线的使用.docx
- 文档编号:1934068
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:13
- 大小:160.70KB
CAN总线的使用.docx
《CAN总线的使用.docx》由会员分享,可在线阅读,更多相关《CAN总线的使用.docx(13页珍藏版)》请在冰豆网上搜索。
CAN总线的使用
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控制器寄存器组成
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单元中,有效字节个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CAN 总线 使用