新闻  |   论坛  |   博客  |   在线研讨会
P89LPC922自编ISP代码的研究
tvb2058 | 2007-12-09 12:29:57    阅读:2355   发布文章

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

1  P89LPC922预设ISP代码功能分析

  P89LPC922是一款由Philips公司生产的单片封装的微控制器[1]。它采用高性能的处理器结构,集成了包括ISP功能在内的许多系统级功能,适合于许多要求高集成度、低成本的场合,可以满足多方面的性能要求。

  P89LPC922在出厂时,用户代码空间的高512字节包含了一个串行ISP子程序,允许器件在电路中通过串行口进行编程。应用ISP功能时,需要使用芯片的5个引脚(Vdd、Vss、TxD、RxD、RST),并且需要一个连接器与计算机串口相连。

  为了使器件进入ISP状态,必须在上电时给复位引脚3个准确定时的低电平脉冲。脉冲数目只能是3个,少于或多于3个脉冲都会导致器件无法进入ISP模式。另外一种进入ISP模式的方法是利用串口间隔检测功能使芯片复位,并使器件强制进入ISP模式[2]。但这种方法需要在用户程序中进行相应的功能设置,而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代码的地址空间为1C00H~1FFFH,共1 KB,即第7扇区的全部。其中ISP入口地址为1F00H。

2.2  芯片地址的规划及处理

  因P89LPC922的程序存储空间可做为数据存储器使用,那么即可将第6扇区的最后16字节做为ISP与用户程序共用的数据空间,地址为1BF0H~1BFFH。其中,地址1BFAH存放芯片地址,地址1BFBH存放芯片地址取反。例如,芯片地址为01H,则(1BFAH)=01H,(1BFBH)=0FEH。地址取反后再存放是为了用户程序读出时判断地址合法性使用,从而增加可靠性。

2.3  进入ISP方法

  因功能要求不能利用复位引脚方式进入ISP模式,所以只能将引导状态设为1,引导向量设为1FH。这样,每次上电复位或其他复位时,程序固定从1F00H地址开始执行,即复位后芯片首先进入ISP模式,执行ISP代码。在执行完ISP过程或在规定的时间(如2 s)内没有进行任何ISP操作,程序都将转到地址0去执行用户程序代码。在转到地址0即执行用户程序代码之前,将串口间隔检测功能设置完毕,这样,在执行用户程序代码时即可通过串口间隔检测功能,使芯片复位后进入ISP模式。下面为串口间隔检测功能设置的相关程序。

  ANLSSTAT,#0FAH;清除BR位,SSTAT.2
  MOVBRGCON,#00H;关波特率发生器
  ORLAUXR1,#40H;置位EBRR位,当检测到UART
  ;间隔信号时即进行复位
  MOVSCON,#50H;设置串口为工作方式1(也可为
  ;方式2或方式3),允许串口接收
  MOVBRGR1,#05H;设置串口波特率4800(也可为
  ;其他值)
  MOVBRGRO,#0f0H
  MOVBRGCON,#03H;打开并使用串口波特率发生器

  由上述程序可知,ISP代码并不影响用户程序对串口的使用,用户程序可以对串口工作方式及波特率进行重新设定,同时用户程序也不会影响利用串口间隔检测功能进入ISP模式。

  实际使用中,上位机发送0信号0.5 s,然后恢复为1信号,即可使串口检测到间隔信号,从而使芯片复位后进入ISP代码程序。

2.4  自动判定波特率

  下位机(即P89LPC922)复位后,在规定的时间(如2 s)内,上位机按照用户设定的波特率向下位机发送1字节地址帧,此地址帧为85(十六进制为55H)。下位机根据此地址帧判定设置自己的波特率。

  首先,设置定时器T1为模式1,设置16位计数器并将其清零。然后判断接收引脚RXD是否为低电平,如为低电平继续判断等待RXD为高电平。实际这一过程为判断上位机发送地址帧的起始位,同时也是一种防干扰的措施。接下来在RXD的下降沿启动定时器T1,在RXD的下一个下降沿关闭定时器T1。这时定时器T1的16位计数器的值即为以当前波特率发送2位数据的时间。因定时器的时钟源为独立的波特率发生器时钟源的二分频,因而此时定时器T1的16位计数器的值即为波特率发生器速率寄存器BRGR1、BRGR0的值加上16。

  当然,根据这种方法所得到的16位计数器的值与理论上的波特率所确定的值存在微小偏差。为了使所设定的波特率与理论值完全相同,可以根据功能要求的十种波特率计算出理论值,再与16位计数器的值进行比较,然后将理论值写入寄存器BRGR1及BRGR0,从而使设定的波特率百分之百准确。

2.5  串口工作方式及通信协议的确定

  对于联网系统,串口需要设为模式3状态。上位机与下位机的每一次通信都按照“命令响应”方式进行,上位机发出“命令”,下位机以“响应”方式进行应答。

  单个数据帧由11位组成,格式如下:

  1个起始位+8个数据位+1个标识位+1个停止位

  其中,标识位=1表示此帧为地址帧,标识位=0表示此帧为数据帧。

  通信开始时,下位机处于地址帧接收模式,上位机发送1字节地址帧做为点名包命令,点名地址帧范围即下位机地址范围为1~255;下位机接收到点名包后与自己的地址进行比较,如相符,则把地址帧接收模式改为地址帧和数据帧都可以接收的模式,并将自己的地址做为1字节数据帧应答发送给上位机。上位机收到后判断与所发送的地址一致,上位机则开始以数据帧模式发送各种命令,与下位机进行通信。下位机进入ISP状态后,如收到与自己地址不相符的地址帧,而且此地址不等于0,则转到地址0去执行用户程序代码。如果地址等于0,下位机则把地址帧接收模式改为地址帧和数据帧都可以接收的模式,并将自己的当前地址做为1字节数据帧应答发送给上位机,从而完成下位机地址查询功能。

  注意,上位机发送0地址时只能连接一台下位机。

  根据功能要求,上位机发送给下位机的命令应有地址修改、扇区擦除、写用户程序代码、读用户程序代码、扇区加密和程序下载完毕六种。其中,上位机执行下载完毕命令,下位机返回下载完毕响应后,下位机转到地址0去执行用户程序代码。

  至于命令包格式,可由用户自己编写。这里给出一种典型的命令包格式:

  包标识+包地址+包命令+包长度+包数据+包校验。

  另外,ISP代码文件推荐为二进制格式文件,这样可以减少相应程序的复杂程度。

2.6  ISP代码加密及配置字确定

  ISP代码编写完毕后,需要由编程器写入P89LPC922。在编程前需要进行相关配置字的设定,包括用户配置字节,用户保密字节,引导向量及引导状态。

  其中,引导向量为1FH,引导状态为01H。为了防止用户擦除或改写ISP代码,用户保密字节的7扇区应为07H,即禁止对ISP代码进行擦除和读写操作。其他扇区的用户保密字节可为00H,即不设保密状态,而由用户通过通信协议的扇区加密命令自由设定。用户配置字节为0A3H,即看门狗复位功能使能,掉电检测使能,复位引脚做为输入引脚,使用内部RC振荡器。

  综上所述,完全可以利用P89LPC922完善的硬件资源,编写出适合具体应用环境的ISP代码程序。这将给这款芯片的实际使用带来极大的方便,尤其在需要更新下载用户程序时更会显得得心应手。当然,具体应用时如果在上位机与下位机的通信过程中加入一些加密处理,那么将加强整个自编ISP代码程序的可靠性、安全性,同时也使具体的应用系统更加完善。

  注:ISP源代码和ISP用户程序下载的通信协议见本刊网站(www.dpj.com.cn)。

参考文献

1  Philips. P89LPC920/921/922 USER MANUAL,2003
2  广州周立功单片机发展有限公司. P89LPC932的ISP应用设计, 2004

郭立新:工程师,从事射频卡、门禁等有关微控制器产品的研发。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客