当前位置:首页 > 发言稿 > 基于MC9S08DZ32的CAN智能节点设计:智能电表费电是真的吗
 

基于MC9S08DZ32的CAN智能节点设计:智能电表费电是真的吗

发布时间:2019-02-27 04:19:37 影响了:

  摘要 本文介绍了一种CAN节点的设计方法,基于单片机内部集成的CAN控制器总线接口设计CAN 总线硬件接口,通过对软件编程实现节点初始化。经验证该节点不仅可以作为数据采集,还可以实现远程监控等功能。
  关键词 MC9S08DZ32;CAN节点;智能节点
  中图分类号TP368 文献标识码A 文章编号 1674-6708(2011)35-0198-02
  0 引言
  MC9S08DZ32(以下简称DZ32)是Freescale公司推出的一款性价比较高的8位40-MHz HCS08单片机,片内集成24通道,12位分辨率,2.5uS转换时间ADC(模数转换);两路SCI(串行通讯接口),可支持LIN2.0协议和SAE J2602协议;MSCAN 协议,支持标准和扩展数据帧;支持远程帧;5个带有FIFO(先入先出)存储的接收缓冲器;32K Flash;2K RAM;1K EEPROM。
  CAN总线是Bosch公司为现代汽车应用而推出的一种总线,与普通串行总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性。CAN总线现已广泛应用于汽车电子、工业现场控制、小区安防、环境监测等众多领域中。CAN总线为多主控制方式工作,在总线空闲时,网络上任何节点都可向网络上其它节点发送信息。设计CAN通讯接口是很重要的一个环节,设备的正确运行与其密切相关。
  1 硬件设计
  图1所示为CAN智能节点硬件结构框图。CAN智能节点主要由带CAN控制器的DZ32和CAN收发器组成。DZ32作为CAN智能节点控制器提供对CAN2.0B协议的支持。通过对片内寄存器的读、写操作,智能节点能够设置CAN总线通信模式,实现数据的发送与接收。其传输速度可以达到1Mbps,满足高速大流量实时传输要求。图2所示为CAN智能节点硬件电路图。DZ32的供电电源为5V,图中U2为线性电源LM317,将工业现场常用的24V电源转成5V,J1为CAN智能节点的BDM下载接口,程序由BDM下载到DZ32中,U3为NXP公司的TJA1050T高速CAN收发器,TJA1050的设计使用了最新的EMC技术。它采用了先进的绝缘硅技术进行处理,这项技术使TJA1050抗电磁干扰性能更好。另外TJA1050在不上电状态下保持无源特性。DZ32外围接口非常丰富,应用中可以将多余的接口定义成GPIO(通用输入输出接口),如DI(数字量输入)、DO(数学量输出)、AI(模拟量输入)、AO(模拟量输出)等,以适应不同的应用需求。
  2 软件设计
  在实际应用中,CAN节点将按照工艺流程采集处理GPIO接口上的信号,同时将信息发送到主站进行存储与处理。
  2.1 CAN标识符分配
  CAN节点软件设计的主要任务是CAN协议的规范化处理,即CAN报文的分配、数据通讯的实现等。CAN报文包括扩展帧格式(CAN2.0B)、标准帧格式(CAN2.0A)和远程帧格式3种,本论文中参考iCAN协议规范,使用扩展帧格式进行报文分配,如表1所示。
  节点地址(MAC ID)为CAN设备在CAN网络上的唯一标识,节点地址值的范围为0x00~0x3F。所以在这种规范下的一个CAN网络上最多可容纳64个节点。
  响应标识位(ACK)用于区分帧类型为命令帧还是响应帧,并说明是否需要应答本帧,当ACK为“0”时,用于命令帧,本帧需要应答。当ACK为“1”,时用于响应帧,不需应答。
  功能码(FuncID)用于指示CAN报文需要实现的功能,接收报文的节点根据报文的功能码进行相应的处理。
  资源节点地址(SrcID)用于指示所要访问的从站内部资源的起始地址,分配8位,接收报文的从站根据报文中的资源节点地址对内部相应的资源进行操作。
  2.2 CAN节点程序编写
  CAN网络里的所有CAN节点分为主站节点与从站节点,主站节点通过广播的形式发送命令帧给从站,从站通过事件触发的方式发送数据帧。
  CAN节点的程序在Freescale的开发平台CodeWarrior v6.2上用C语言开发。包括DZ32启动程序、MSCAN启动程序、CAN收发程序等。MSCAN启动程序主要功能是设置CAN的工作模式与CAN总线的波特率。初始化程序如下:
  void MSCAN_Init(void)
  {
  CANCTL0_INITRQ = 1;
  while (!(CANCTL1_INITAK));
  CANCTL1_CANE = 1;
  CANCTL1_CLKSRC= 0;
  CANCTL1_LOOPB = 0;
  CANCTL1_LISTEN = 0;
  CANBTR1_TSEG_10 = 4;
  CANBTR1_TSEG_20 = 1;
  CANBTR0_BRP = 9;
  CANBTR0_SJW = 1;
  CANBTR1_SAMP = 0;
  CANIDAC_IDAM = 0x01;
  CANCTL0_INITRQ = 0;
  while (CANCTL1_INITAK);
  while (!(CANCTL0_SYNCH));
  CANRFLG_RXF = 1;
  CANRIER_RXFIE = 1;
  }
  程序中采用中断的方式接收CAN数据,在DZ32中CAN接收中断向量号为28,CAN中断接收程序如下:
  void interrupt 28 CANRx_ISR(void)
  {
   UINT8 Msg_Len;
   UINT8 tData[8];
   UINT8 Index;
   Msg_Length = (CANRDLR & 0x0F);
   for (Index=0;Index 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3