基于CAN总线连接的MEGA8远距离在线升级方案
令,该标志会在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程序介绍及流程图
Mega8单片机上电后设置冷启动标志,而热启动入口则设置热启动标志。然后初始化堆栈、串口以及必要的I/O状态等。初始化完成后,如果BOOT程序检测到热启动标志则直接进入烧录状态;如果为冷启动标志则继续检测下载位是否允许(本设计通过PB0开关选择),如为高电平则进入烧录状态,如为低电平则进入用户程序。
BOOT引导程序在设计时提供了两个入口,一个是系统复位时的冷启动入口,另一个是用户程序在运行时进入升级程序的热启动入口。BOOT程序主要包括烧录子程序、串口发送、串口接收、引导主程序等。
串口发送采用了查询发送完成标志。这样当该标志被设置时,证明串口的停止位已经发送完成,这对于CAN总线通讯非常有用。烧录程序主要使用“SPM” 指令,该指令完成对MEGA8的烧录等功能。而读取MEGA8的指令则使用“LPM”。由于擦除,页填充,写入,读出等基本命令单片机都已解释完成,因此所有过程都可以由计算机端程序进行控制。
程序开始时,计算机端发送命令,先对单片机的页进行擦除,然后接收一帧数据,接收完毕后执行页写入命令,写入完成再进行读出进行校验,如果校验无误再继续写入下一页,直到所有页都写入完毕,即完成一次下载过程。如果传输或页校验出现错误,程序会连续进行5次测试,如再仍不成功,则认为本次下载失败。主程序流程图如图3。
MEGA8单片机的主程序通过CAN接口执行计算机发送的命令,并且定义了一个更新代码的特殊命令,当接收到该命令时,主程序首先关闭中断,关闭看门狗,然后跳转到BOOT的热启动入口,再执行BOOT下载烧录程序。下载完成后再直接跳转到$0000地址进入用户程序区,这样就完成了代码的在线升级。为了保证该命令的可靠性,本程序设计时规定单片机必须在100ms内同时接收到两次该命令才认为正确,超过100ms则不予认可。
4、结束语
由于采用了MEGA8单片机的BOOT功能,以及CAN总线高速远距离通信,同时抗干扰性强,使得远距离在线升级,譬如通过以太网、无线等方式,成为了可能。这对于系统调试及以后的升级维护都提供了极大的便利,这也是今后单片机和CAN总线发展的一个方向。由于该部分具有通用性,所以可很容易地移植到 AVR其它MEGA系列的设计方案中。
- 对TTCAN的分析(05-26)
- 嵌入式Win CE中CAN总线控制器的驱动设计与实现(05-01)
- μC/OS-II的多任务信息流与CAN总线驱动(07-11)
- 采用CAN总线实现DSP芯片程序的受控加载(11-08)
- 基于DSP的电动汽车CAN总线通讯技术设计(10-08)
- 基于DSP的CANopen通讯协议的实现(01-18)