0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于PHILIPS P89C668单片机和SJA1000 CAN控制器实现节点接口电路的设计方案

基于PHILIPS P89C668单片机和SJA1000 CAN控制器实现节点接口电路的设计方案

来源: elecfans
2021-05-25
类别:工业控制
eye 14
文章创建人 拍明

原标题:基于P89C668单片机和SJA1000控制器实现节点接口电路的设计方案

  CAN(Controller Area Network)总线,又称控制器局域网,属于现场总线的范畴,是一种有效支持分布式控制或实时控制的串行通信网络。与其它几种现场总线相比,CAN 总线是最容易实现、价格也最为低廉。由于其性能好,可靠性高、设计灵活,现已广泛应用于工业现场控制、智能大厦、小区防范、交通工具、医疗仪器、环境监控等众多领域。

  CAN总线规范已被国际标准化组织(ISO)定为国际标准,CAN协议也是建立在国际标准化组织的开放系统互连参考模型(OSI)基础上的.CAN总线主要工作在数据链路层和物理层,用户可在其基础上开发适合系统实际需要的应用层通信协议,由于CAN总线的可靠性高,使应用层通信协议得以大大简化。目前市场上有多种不同型号的CAN控制器,它们实现CAN协议部分电路的结构和功能大多相同,只是与单片机接口部分的结构和方式有一些差异。

  为了提高硬件电路的效率,简化电路设计上的复杂性,保证电路的电气兼容性,本文采用PHILIPS公司生产的P89C668单片机和CAN控制器SJA1000设计了CAN接口节点电路,并介绍了相关的软件设计。

  1 CAN总线节点接口硬件电路设计

  CAN节点接口硬件电路原理如图1所示。采用PHILIPS公司生产的P89C668单片机、CAN控制器SJA1000和CAN总线收发器PCA82C250设计接口电路来实现CAN总线通信。

  

基于P89C668单片机和SJA1000控制器实现节点接口电路的设计


  图1 CAN总线接点接口硬件电路原理

  P89C668单片机内带64kB Flash存储器,该存储器既可并行编程,在系统编程ISP中也可串行编程,在实际的成型产品中可通过ISP升级用户程序。 在Boot ROM程序中,可通过一个默认的串行下载器(UART)对Flash存储器作ISP编程,而在Flash代码区中并不需要调用下载器的代码,用户程序可通过调用在Boot ROM中的标准子程序对Flash存储器擦除和再编程(即IAP)。

  SJA1000 是PHILIPS 公司生产的独立CAN 通信控制器,它既支持CAN2.0A,又支持CAN2.0B,与PCA82C200 CAN 控制器兼容(BasicCAN),并可替代PCA82C200;增加了一种新的工作模式PeliCAN,使其支持具有很多新特性的CAN2.0B 协议;集成了CAN 协议的物理层和数据链路层功能,可完成对通信数据的成帧处理;具有多主结构、总线访问优先权、硬件滤波等特点。

  PC82C250为CAN总线收发器,是CAN 控制器和物理总线的接口,提供对总线的驱动发送能力、对CAN控制器的差动发送能力和对CAN控制器的差动接收能力。它具有很强的抗瞬间干扰和保护总线的能力,以及三种不同的工作方式即高速、斜率控制和待机,如表1所示。总线上的某一个节点掉电不会影响总线,在40米内应用的速度可达1M baud,最多可挂110个节点。

  


  从图1 可看出,该硬件电路主要由单片机P89C668、CAN 独立控制器SJA1000 和CAN 收发器PCA82C250 组成。

  单片机P89C668 负责对SJA1000 进行初始化,通过控制SJA1000实现数据的发送与接收等通信任务。

  SJA1000 的AD0“AD7连接到P89C668 的P0口;

  CS连接到P89C668的P1.1,P1.1 为0 时选中SJA1000,可控制SJA1000;

  SJA1000 的RD/E、WR、ALE/AS 分别连接到P89C668 的RD(P3.7)、WR(P3.6)、P1.0;

  SJA1000的(INT)连接到P89C668 的P3.2(INT0),这样,P89C668 可以通过中断方式访问SJA1000;

  SJA1000的模式选择引脚MODE 接高电平时选择Intel 模式;

  为了保证时钟同步,SJA1000 的CLKOUT 引脚使能,向P89C668 提供时钟源。

  2 CAN 总线节点接口软件设计

  实现CAN 总线通信,要对CAN 总线节点接口设计相应的总线通信程序;在总线通信之前,必须进行SJA1000 控制器初始化。在上电或复位后,单片机通过运行其自身复位程序初始化SJA1000.CAN总线通信程序大致由SJA1000 初始化、发送和接收三部分组成。以下分别对他们进行简单的描述。

  2.1 SJA1000 初始化

  在上电后,CAN 控制器的RST 脚获得一个复位脉冲,使之进入复位模式。在开始对SJA1000 各个配置寄存器进行设定之前,主控制器通过读复位/请求标识来检测SJA1000是否进入复位模式。为了避免微控制器的上电复位时间和SJA1000 的复位时间的偏差,微控制器要等待SJA1000 完成上电复位后才能对SJA1000 配置寄存器进行配置,存有配置信息的寄存器只能在复位模式下才可进行写入.SJA1000 初始化程序在复位模式下,主控制器要配置下面的寄存器:

  (1)模式寄存器(仅在PeliCAN 模式下选择应用操作模式)

  接收过滤模式

  自检测模式

  侦听模式

  (2)时钟分频寄存器

  使用BasicCAN 或PeliCAN 模式

  CLKOUT 引脚是否可以使用

  CAN 输入比较器是否被跳过

  TX1 输出是否专门用于接收中断输出

  (3)总线定时寄存器

  定义总线的位速率

  定义位周期内的采样点位采样点

  定义一个位周期的采样数量

  (4)接收代码和接收掩码寄存器

  定义要接收消息的接收代码

  定义与接收代码相关位进行比较的接收掩码

  (5)输出控制寄存器

  定义CAN 总线输出引脚TX0 和TX1 的配置

  在将这些配置信息配置到SJA1000配置寄存器后,通过消除复位模式,请求使SJA1000进入操作模式。一定要确保复位标志真的被删除,并且在没有进行CAN 总线通信前进入操作模式,这可以通过读该标志来实现。 当硬件复位处于挂起状态,即CAN 控制器的RST 引脚为低电平时,复位模式/请求标志不能被清除。

  下面是SJA1000 的初始化程序。

  CAN_INI: MOV DPTR, #MOD; 模式寄存器

  MOV A, #01H

  MOVX @DPTR, A

  NOP

  MOVX A, @DPTR

  ANL A, #01H

  JZ CAN_INI; 等待SJA1000 进入复位模式

  MOV DPTR, #BTR0; 总线定时0

  MOV A, #BandRate0

  MOV DPTR, #BTR1; 总线定时1

  MOV A, # BandRate1

  MOV DPTR, #OCR; 输出控制寄存器

  MOV A, #1AH

  MOVX @DPTR, A

  MOV DPTR, #CDR; 时钟分频器

  MOV A, #0C0H

  MOV DPTR, #ACR0; 接收代码寄存器ACR0

  MOV A, #ModuleAddress; 设置为模块的地址

  MOVX @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOV @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOVX @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOVX @DPTR, A

  MOV DPTR, #AMF0; 接收掩码寄存器AMF0

  MOV A, #0FFH; 接收代码设置为

  0X0FFFFFFFF

  MOVX @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOVX @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOVX @DPTR, A

  INC DPTR

  MOV A, #0FFH

  MOVX @DPTR, A

  MOV DPTR, #IER ; 中断使能寄存器IER

  MOV A, #09H; 允许接收中断和数据溢出中断

  MOV DPTR, #CMR; 命令寄存器

  MOV A, #04H; 释放接收缓冲器

  MOVX @DPTR, A

  LOOP: MOV DPTR, #MOD

  MOV A, #08H; 设置SJA1000 工作模式为普通模式,单滤波接收

  MOVX @DPTR, A

  MOV DPTR, #MOD

  MOV A, @DPTR

  ANL A, #01H

  JNZ LOOP; 等待复位标识被清除

  RET

  2.2 CAN 总线发送程序

  对SJA1000控制器进行初始化建立CAN总线通信后,就可以通过CAN总线发送和接收报文。发送程序负责节点的报文发送。发送报文时,用户只需将需要发送的数据按一定的格式组合成一帧的报文,并送入SJA1000发送缓存区中,然后启动SJA1000发送即可。发送程序分发送数据帧和远程帧两种。通过设置RTR以决定是发送数据帧还是远程帧。

  SJA1000的报文主要有中断控制和查询两种发送方式。主动发送报文建议采用查询方式,一次发送不成功,可再次发送,这样发送程序的处理比较简单,可采用查询SJA1000控制部分状态标识符的方法。下面给出以查询方式发送报文的发送程序。

  CAN_SEND: MOV DPTR, #SR; 状态寄存器SR

  MOVX A, @DPTR;

  ANL A, #04H

  JZ CAN_SEND; 等待发送寄存器释放

  MOV R7, #0AH

  MOV R0, #TXB_Data; 待发送数据的首地址

  MOV DPTR, #TXB_Addr; 发送寄存器的基地址

  LOOP1: MOV A, @R0; 将数据写入发送寄存器

  MOVX @DPTR, A

  INC DPTR

  INC R0

  DJNZ R7, LOOP1

  MOV DPTR, #CMR; 命令寄存器

  MO A, #01H; 发送请求命令

  MOVX @DPTR, A

  RET

  2.3 CAN总线接收程序

  SJA1000 根据规则自动接收消息,接收到的消息放入接收缓冲器,同时接收缓冲器状态标志位RBS 置为1,接收程序根据RBS 值来决定接收报文与否.SJA1000 报文的接收也有两种方式:中断和查询。对通信的实时性要求不高时,可采用查询方式,否则采用中断方式。以下给出中断接收方式程序。

  CAN_INT: CLR EA; 关所有中断

  MOV DPTR, #IER; 中断寄存器IER 使能

  MOVX A, @DPTR

  MOV R6, A; 保存SJA1000 中断允

  MOV A, #00H ; 重设SJA1000 中断允许模式为不允许任何中断

  MOVX @DPTR, A

  LCALL RECEIVE; 接收信息

  JZ ReceivOk; 接收到的信息正确则跳转,否则进行错误处理。. 。.; 错误处理

  ReceivOk: MOV DPTR, #IER

  MOV A, R6; 恢复SJA1000 中断允许模式

  MOVX @DPTR, A

  SETB EA; 开放中断

  RETI

  RECEIVE: CLR A

  MOV DPTR, #SR; 状态寄存器SR

  JZ ERROR; 不是正常的消息接收中断则跳转

  LOOP2: MOV DPTR, #RXB_Addr; 接收寄存器的基地址

  MOV R1, #RXB_Data; 存放所接收数据的首地址

  MOV R7, #0AH

  LOOP3: MOVX A, @DPTR; 接收数据

  MOV @R1, A; 保存数据

  INC DPTR

  INC R1

  DJNZ R7, LOOP3

  MOV DPTR, #CMR; 命令寄存器

  MOV A, #0X04; 释放接收缓冲器

  MOVX @DPTR, A

  MOV DPTR, #SR

  MOVX A, @DPTR

  CJNE A, #01H, LOOP2; 等待接收队列为空

  MOVD PTR, #IR; 中断寄存器IR

  MOVX A, @DPTR; 清空SJA1000 的接收中断标识位

  CLR A; 返回值ACC=0,表示接收消息正确

  LJMP END_RECEIVE

  ERROR: 。. 。.; 接收消息错误处理

  MOVA, #01H; 返回值ACC=1,表示接收消息不正确

  NED_RECEIVE: RET

  3 结语

  以上介绍了P89C668单片机及其与CAN控制器SJA1000之间的接口方法,并给出了SJA1000在PeliCAN模式下的SJA1000初始化程序、发送程序和接收程序。可在此基础上实现更复杂的CAN总线通信处理,如报警处理、错误处理等。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案