[讨论] P89LPC922自编ISP代码的研究

rain   2006-7-27 18:09 楼主
随着微控制器应用领域的不断扩展和深入,对其各方面性能的要求也逐渐提高。目前,越来越多种类的微控制器具有ISP(In System Programrning)即在系统编程功能。ISP编程时不需要将微控制器从目标系统中移出,并且只需要有限的几个引脚与外界相连,最大限度减少了额外的元件开销和电路板面积,使微控制器产品的开发和具体应用相当方便。本文将分析P89LPC922预设ISP代码的优缺点,进一步结合应用的实际情况,研究自编ISP代码的方案,并给出具体的实现方法,对于由Ps9LPC922构成的微控制器系统具有很强的实用价值。


1 P89LPC922预设ISP代码功能分析
    P89LPC922是一款由Philips公司生产的单片封装的微控制器。它采用高性能的处理器结构,集成了包括ISP功能在内的许多系统级功能,适合于许多要求高集成度、低成本的场合,可以满足多方面的性能要求。
   
    P69LPC922在出厂时,用户代码空间的高512字节包含了一个串行ISP子程序,允许器件在电路中通过串行口进行编程。应用ISP功能时,需要使用芯片的5个引脚(Vdd、Vss、TxD、RxD、RST),并且需要一个连接器与计算机串口相连。
   
    为了使器件进入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表示此帧为数据帧。
   
    通信开始时,下位机处于地址帧接收模式,上位机发送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代码程序的可靠性、安全性,同时也使具体的应用系统更加完善。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复