ISP(In-System Programming)在线系统可编程,指电路板上的空白器件可以编程写入终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写。对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存储器中。所以即使我们将芯片焊接在电路板上,只要留出和上位机接口的这个串口,就可以实现芯片内部存储器的改写,而无须再取下芯片。ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机芯片可以直接焊接到电路板上,调试结束即成成品,免去了调试时由于频繁地插入取出芯片对芯片和电路板带来的不便。本文将分析P89LPC922预设ISP代码的优缺点,进一步结合应用的实际情况,研究自编ISP代码的方案,并给出具体的实现方法,对于由Ps9LPC922构成的微控制器系统具有很强的实用价值。
1 P89LPC922预设ISP代码功能分析
P89LPC922是一款单片封装的微控制器,适用于要求高度集成、低成本的应用场合,可以满足多种多样的性能要求。P89LPC922基于高性能的处理架构,执行指令仅需2到4个时钟周期,速度是标准80C51器件的6倍。P89LPC922集成了多种系统级功能,以便极大减少元件数目和减小电路板面积,从而降低系统成本。
P89LPC922采用了高性能的处理器结构指令执行时间只需2 到4 个时钟周期6 倍于标准80C51 器件P89LPC922集成了许多系统级的功能这样可大大减少元件的数目和电路板面 当操作频率为12MHz 时除乘法和除法指令外高速80C51 CPU 的指令执行时间为167~333ns 同一时钟频率下其速度为标准80C51 器件的6 倍只需要较低的时钟频率即可达到同样的性能这样无疑降低了功耗和EMI 操作电压范围为2.4 3.6V I/O 口可承受5V 可上拉或驱动到5.5V 4KB/8KB Flash 程序存储器具有1KB 可擦除扇区和64 字节可擦除页规格可擦除单个字节 256 字节RAM 数据存储器 2 个16 位定时/计数器每一个定时器均可设置为溢出时触发相应端口输出或作为PWM 输出 实时时钟可作为系统定时器 2 个模拟比较器可选择输入和参考源 增强型UART 具有波特率发生器间隔检测帧错误检测自动地址识别和通用的中断功能 400kHz 字节宽度的I2C 通信端口。
为了使器件进入ISP状态,必须在上电时给复位引脚3个准确定时的低电平脉冲。脉冲数目只能是3个,少于或多于3个脉冲都会导致器件无法进入ISP模式。另外一种进入ISP模式的方法是利用串口间隔检测功能使芯片复位,并使器件强制进入ISP模式。但这种方法需要在用户程序中进行相应的功能设置,而P89LPC922预设的ISP代码并不支持这种方式。
进入ISP模式后,虽然可以对接收到的特定字符进行波特率的自动设定,但这个波特率的设定参数只有1个字节,波特率的范围受到一定的限制。另外,ISP串口工作在模式1状态,波特率设定后只接收Intel-Hex格式的记录。
由上述分析可知,P89LPC922预设ISP功能虽然比较完善,可以满足芯片开发阶段的应用,但如果产品定型后,特别是在将其做为联网系统中下位机的实际现场,要进行用户程序代码的更新将很不方便,有些功能甚至根本不能实现。这主要体现在以下几个方面:
◇必须在上电时才能进入ISP模式,不适合远程控制;
◇需要使用复位引脚,且相应控制时序严格;
◇波特率范围有一定限制;
◇无地址选项,不支持系统联网;
◇只支持Intel-Hex格式,通信效率较低。
2 自编ISP代码方案
P89LPC922具有非常完善的硬件系统,给使用者编写自己的ISP代码提供了相当大的自由度。下面以P89LPC922组成的485总线联网系统为例,给出自编ISP代码的功能要求:
◇硬件上不使用复位引脚,只用串口收发两线连接即可;
◇不必上下电,随时都可使器件进入ISP模式;
◇自动判断设定通信波特率,波特率应有十种;
◇器件有地址,并且这个地址可随时查询、修改;
◇可实现用户代码的擦除、写、校验、加密的功能。
其中,485总线联网系统的上位机为计算机,下位机为P89LPC922.
为了实现上述功能,必须解决以下几个问题:
◇代码存储区如何分配;
◇芯片地址的规划及处理;
◇进ISP方法;
◇自动判定波特率方法;
◇串口工作方式及通信协议的确定;
◇ISP代码加密及配置字确定。
2.1 代码存储区的分配
为了不影响用户的程序代码编写,自编ISP代码应用于程序存储区的高端。当然,不同的自编ISP代码需要不同大小的存储空间。这里规定自编ISP代码的地址空间为1COOH~lFFFH,共l KB,即第7扇区的全部。其中ISP入口地址为1FOOH.
2.2 芯片地址的规划及处理
因P89LPC922的程序存储空间可做为数据存储器使用,那么即可将第6扇区的16字节仿为ISP与用户程序共用的数据空间,地址为1BFOH~1BFFU.其中,地址lBFAH存放芯片地址,地址1BFBH存放芯片地址取反。例如,芯片地址为0lH,则(1BFAH)=01H,(1BFBH)=0FEH.地址取反后再存放是为了用户程序读出时判断地址合法性使用,从而增加可靠性。
2.3 进入ISP方法
因功能要求不能利用复位引脚方式进入ISP模式,所以只能将引导状态设为l,引导向量设为lFH.这样,每次上电复位或其他复位时,程序固定从lF00H地址开始执行,即复位后芯片首先进入ISP模式,执行ISP代码。在执行完ISP过程或在规定的时间(如2s)内没有进行任何ISP操作,程序都将转到地址O去执行用户程序代码。在转到地址O即执行用户程序代码之前,将串口间隔检测功能设置完毕,这样,在执行用户程序代码时即可通过串口间隔检测功能,使芯片复位后进入ISP模式。下面为串口间隔检测功能设置的相关程序。
ANL SSTAT,#OFAH ;清除BR位,SSTAT.2
MOV BRGCON,#00H ;关波特串发生器
ORL AUXRl,#40H ;置位EBRR位,当检测到UART ;间隔信号时即进行复位
MOV SCON,#50H ;设置串口为工作方式1(也可为;方式2或方式3),允许串口接收
MOV BRGRl,#05H ;设置串口波特率4800(也可为;其他值)
MOV BRGRO,#0fOH
MOV BRGCON,#03H ;打开并使用串口波特率发生器
由上述程序可知,ISP代码并不影响用户程序对串口的使用,用户程序可以对串口工作方式及波特率进行重新设定,同时用户程序也不会影响利用串口喑隔检测功能进入ISP模式。实际使用中,上位机发送0信号0.5s,然后恢复为1信号,即可使串口检测到间隔信号,从而使芯片复位后进入ISP代码程序。
2.4自动判定波特率
下位机(即P89LPC922)复位后,在规定的时间(如2s内,上位机按照用户设定的波特串向下位机发送l字节址帧,此地址帧为85(十六进制为55H)。下位机根据此地址帧判定设置自己的波特率。
首先,设置定时器Tl为模式l,设置16位计数器并将其清零。然后判断接收引脚RXD是否为低电平,如为低电平继续判断等待RXD为高电平。实际这一过程为判断上位机发送地址帧的起始位,同时也是一种防干扰的措施。接下来在RXD的下降沿启动定时器Tl,在RXD的下一个下降沿关闭定时器T1.这时定时器Tl的16位计数器的值即为以当前波特率发送2位数据的时间。固定时器的时钟源为独立的波特率发生器时钟源的二分频,因而此时定时器Tl的16位计数器的值即为波特率发生器速率寄存器BRGRl、BRGR0的值加上16.
当然,根据这种方法所得到的16位计数器的值与理论上的波特率所确定的值存在微小偏差。为了使所设定的波特率与理论值完全相同,可以根据功能要求的十种波恃串计算出理论值,再与16位计数器的值进行比较,然后将理论值写入寄存器BRGR1及BRGR0,从而使设定的波特率百分之百准确。
2.5 串口工作方式及通信协议的确定
对于联网系统,串口需要设为模式3状态。上位机与下位机的每通信都按照"命令一响应"方式进行,上位机发出"命令",下位机以"响应"方式进行应答。
单个数据帧由11位组成,格式如下:
1个起始位+8个数据位+1个标识位+1个停止位
其中,标识位=l表示此帧为地址帧,标识位=0表示此帧为数据帧。
通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。在计算机通信中,通信协议用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑之间的信息传递就无法识别。 通信协议是指通信各方事前约定的通信规则,可以简单地理解为各计算机之间进行相互会话所使用的共同语言。两台计算机在进行通信时,必须使用的通信协议 .
通信开始时,下位机处于地址帧接收模式,上位机发送l字节地址帧做为点名包命令,点名地址帧范围即下位机地址范围为1~255;下位机接收到点名包后与自己的地址进行比较,如相符,则把地址帧接收模式改为地址帧和数据帧都可以接收的模式,并将自己的地址做为1字节数据帧应答发送给上位机。上位机收到后判断与所发送的地址一致、上位机则开始以数据帧模式发送各种命令,与下位机进行通信。下位机进入ISP状态后,如收到与自己地址不相符的地址帧,而且此地址不等于0,则转到地址0去执行用户程序代码。如果地址等于0,下位机则把地址帧接收模式改为地址帧和数据帧都可以接收的模式,并将自己的当前地址做为l字节数据帧应答发送给上位机,从而完成下位机地址查询功能。
注意,上位机发送O地址时只能连接一台下位机。
根据功能要求,上位机发送给下位机的命令应有地址修改、扇区擦除、写用户程序代码、读用户程序代码、扇区加密和程序完毕六种。其中,上位机执行完毕命令,下位机返回完毕响应后,下位机转到地址0去执行用户程序代码。
至于命令包格式,可由用户自己编写。这里给出一种典型的命令包格式:包标识+包地址+包命令+包长度+包数据+包校验。另外,ISP代码文件推荐为二进制格式文件,这样可以减少相应程序的复杂程度。
2.6 ISP代码加密及配置字确定
ISP代码编写完毕后,需要由编程器写入P89LPC922.在编程前需要进行相关配置字的设定,包括用户配置字节,用户保密字节,引导向量及引导状态。
其中,引导向量为1FH,引导状态为01H.为了防止用户擦除或改写ISP代码,用户保密字节的7扇区应为07H,即禁止对ISP代码进行擦除和读写操作。其他扇区的用户保密字节可为OOH,即不设保密状态,而由用户通过通信协议的扇区加密命令自由设定。用户配置字节为0A3H,即看门狗复位功能使能,掉电检测使能,复位引脚做为输入引脚,使用内部RC振荡器。
综上所述,完全可以利用P89LPC922完善的硬件资源,编写出适合具体应用环境的ISP代码程序。这将给这款芯片的实际使用带来极大的方便,尤其在需要更新用户程序时更会显得得心应手。当然,具体应用时如果在上位机与下位机的通信过程中加入一些加密处理,那么将加强整个自编ISP代码程序的可靠性、安全性,同时也使具体的应用系统更加完善。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。