1、系统总体设计方案

1.1 系统的拓扑结构
CAN(Controller Area Network)即控制器局域网,是目前广泛应该的总路线之一。CAN 总线通信距离限制小,它的直接通信距离最大可达 10km,最高通信速率可以达 1Mb/s(此时距离最长为 40m),节点数可多达 110 个。因此它特别适合于工业远程过程监控设备的互联和电网络设备的调试和维护。基于 CAN 总线的分布式控制系统的一般组成模式如图 1 所示。上位机 PC 机通过 RS-232 连接到总线上某一智能节点。可以对安装在现场某些节点的程序进行远距离在线升级和改变某些功能,因此利用 CAN 总线进行单片机的在线编程就显得非常必要。

 

图 1 基于 CAN 总路线的分布式控制系统

 

根据图 1 所示的 CAN 总线分布式系统的结构,在线编程采用主从结构。智能节点 1 为主节点,其它节点为从节点。节点采用 ATMEL 公司推出的 AVR 系列单片机 MEGA8,内含 8K FLASH 程序存储器,1K 的内部 SRAM,512 字节的内部 EEPROM。为了便于升级,除了提供 ISP 即在线编程功能(In System Programming)以外,还提供了 BOOT 引导功能,为实现 IAP 即在应用中编程(In Application Programming)为系统升级提供了可能。

 

1、2 节点升级过程

主节点在编程监控模式下,接收 PC 机发送的“编程”命令,若编程节点为主节点,则程序可以通过 RS-232 下载到主节点,主节点接收编程数据,完成 FLASH 的在线编程,此时,从节点分别执行各自缺省的应用程序。若编程节点为从节点,则主节点就通过 CAN 总线进行广播,全部从节点监控包括被选择节点 ID 号在内的“编程初始信息”,并与各自的节点 ID 进行比较,被选择的从节点与主节点和 PC 机建立编程通信连接,其它从节点继续运行其缺省应用程序,从而实现了在线升级功能。可见,在从节点编程模式下,主节点在 PC 机的 RS-232 总线与从节点的 CAN 总线之起着路由器的作用。

 

1、3 CAN 总线系统智能监控节点

CAN 总线系统智能监控节点由 5 部分组成:微控制器 Mega8,并串转换电路,独立 CAN 控制器 SJA1000,CAN 总线驱动器 TJA1050 和高速光电耦合 6N137。如图 2 所示

 

图 2 CAN 智能监控节点硬件原理图

 

为了提高稳定性和安全性,在 SJA1000 的 TX0 和 RX0 与 TJA1050 的 TXD 和 RXD 相连时,采用了高速光电耦合 6N137,并且两个光电耦合器各自连接两个完全隔离的电源,这样就很好地实现了总线上各 CAN 节点间的电气隔离。在 SJA1000 与 Mega8 通信中,中间加入了一个并串转换电路。除了给 Mega8 留出更多的引脚用于外围电路外,更重要的是传输多位数据时,可以通过并串转换电路,连接到 Mega8 单片机的通用同 / 异步串行接口 USART 的 RXD 与 TXD 引脚。把接收过进来的数据送入 USART 数据寄存器 UDR 中,通过 ID 认证后,进入 FLASH 编程监控程序,进行自编程修改,达到升级的目的。

 

2、MEGA8 单片机升级功能

2.1 引导加载自编程功能

ATmega8 具备引导加载支持的用户程序自编程功能(In-System Programming by On- chip Boot Program),它提供了一个真正的由 MCU 本身自动下载和更新(采用读 / 写同时“Read-While-Write”进行的方式)程序代码的系统程序自编程更新的机制。使用该功能时,MCU 可以灵活地运行一个常驻 Flash 的引导加载程序(Boot Loader Program),实现对读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到 Flash 存储器中。引导加载程序有能力读写整个 Flash 存储器,包括引导加载程序所在的引导加载区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。基于这个因素,使得在线升级成为了可能。引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该程序区的不同级别的保护。

 

2、2 MEGA8 的 BOOT 介绍

由于 MEGA8 具有 IAP 可在应用中升级的功能,本系统在软件设计上采用了 BOOT 引导功能。主程序采用 C 语言编写,BOOT 程序则采用了汇编编写。目的是为了提高下载速度,设计中放弃了 ATMEL 提供的 AVRPROG 烧录软件,另外采用了一个下载烧录速度较高的 ID 通讯协议,在程序代码量比较大的时候,具有更明显的速度优势,并且也便于用户二次开发。

 

MEGA8 的引导功能可通过相应的熔丝位来确定,BOOT 引导程序的入口、BOOT 区的大小可以通过烧录单片机的 BOOTSZ1、BOOTSZ0 两个熔丝位来确定。单片机复位后向量入口也是通过烧录单片机的 BOOTRST 熔丝位来确定。另外,单片机在执行 IAP 编程时需要用到 Store Program Memory Control Register(SPMCR)寄存器。

 

SPMCR 寄存器包含了页擦除,页写入,BOOT 区加密设置,页填充及页的 RWW(Read While Write)等功能的设置。需要注意的是在执行每个功能时,都需要设置 SPMEN 标志,在随后的 4 个时钟周期内运行 SPM 指令,该标志会在 SPM 执行完成后自动清零。函数如下:

 

Do_SPM:

 

Wait_SPM: ; 等待页操作完成

 

in templ,SPMCR

 

sbrc templ,SPMEN

 

rjmp Wait_SPM

 

out SPMCR,temp

 

spm ; 执行 SPM 指令

 

.dw 0xffff

 

nop

 

ret

 

有了以上的函数,就可以很容易的进行页擦除、页写入、页填充等程序的设计了。比如需要执行页擦除指令,则首先要将需要擦除的页地址写入 Z 寄存器,然后置位 SPM 的 PGERS(页擦除位)和 SPMEN(SPM 允许位),然后再调用 Do_SPM 函数即可。程序如下:

……

 

ld temp,y+

 

mov zl,temp ; Z 指针地址赋值

 

ld temp,y+

 

mov zh,temp

 

ldi temp,(1《

 

rcall Do_SPM ; 执行页写入

 

……

 

3、BOOT 程序介绍及流程图

BOOT 引导程序在设计时提供了两个入口,一个是系统复位时的冷启动入口,另一个是用户程序在运行时进入升级程序的热启动入口。BOOT 程序主要包括烧录子程序、串口发送、串口接收、引导主程序等。

 

串口发送采用了查询发送完成标志。这样当该标志被设置时,证明串口的停止位已经发送完成,这对于 CAN 总线通讯非常有用。烧录程序主要使用“SPM” 指令,该指令完成对 MEGA8 的烧录等功能。而读取 MEGA8 的指令则使用“LPM”。由于擦除,页填充,写入,读出等基本命令单片机都已解释完成,因此所有过程都可以由计算机端程序进行控制。

 

程序开始时,计算机端发送命令,先对单片机的页进行擦除,然后接收一帧数据,接收完毕后执行页写入命令,写入完成再进行读出进行校验,如果校验无误再继续写入下一页,直到所有页都写入完毕,即完成一次下载过程。如果传输或页校验出现错误,程序会连续进行 5 次测试,如再仍不成功,则认为本次下载失败。主程序流程图如图 3。

 

MEGA8 单片机的主程序通过 CAN 接口执行计算机发送的命令,并且定义了一个更新代码的特殊命令,当接收到该命令时,主程序首先关闭中断,关闭看门狗,然后跳转到 BOOT 的热启动入口,再执行 BOOT 下载烧录程序。下载完成后再直接跳转到$0000 地址进入用户程序区,这样就完成了代码的在线升级。为了保证该命令的可靠性,本程序设计时规定单片机必须在 100ms 内同时接收到两次该命令才认为正确,超过 100ms 则不予认可。

 

图 3

 

4、结束语

由于采用了 MEGA8 单片机的 BOOT 功能,以及 CAN 总线高速远距离通信,同时抗干扰性强,使得远距离在线升级,譬如通过以太网、无线等方式,成为了可能。这对于系统调试及以后的升级维护都提供了极大的便利,这也是今后单片机和 CAN 总线发展的一个方向。由于该部分具有通用性,所以可很容易地移植到 AVR 其它 MEGA 系列的设计方案中。