微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > P89C51RD2的Boot ROM与ISP功能的实现

P89C51RD2的Boot ROM与ISP功能的实现

时间:04-09 来源:互联网 点击:

并且这两个字符之间必须隔一段时间,以便于波特率计算完毕并有效。所以,有关手册中关于ISP第一步要发送一个U来确定波特率的说法本身没有错,但如果在编制上位机程序时,仅仅发送一个U是不能够通信成功的,特提醒读者注意。

3.2 命令字的接收

在通信成功后,就可以接收ISP的命令字了。

3.2.1 ISP命令格式说明

ISP编程由Boot ROM中的一系列引导子程序完成。这些子程序采用Intel-Hex记录格式接收PC主机的命令和数据。Intel-Hex记录格式上面已经有所介绍,其命令格式为
:NNAAAARRDD…DDCCcrlf>

其中,:NNAAAA以及DDCC的含义皆与上面论述的相同,只需对RR作以下说明:
RR表示记录类型,其中
00--数据记录,即传编程数据并完成编程;
01--文件结束标志;
02--指定振荡器频率;
03--杂项编程功能,和后面的数据相配合完成擦除、加密等功能;
04--显示指定地址端FLASH的数据或做空白检查;
05--各种读功能。

3.2.2 命令字的处理

为了更容易看懂,将使用的通用寄存器和部分地址进行代换如下:
DATA_ADDRL EQU 30H
DATA_ADDRH EQU 31H
DATA_SUM EQU 32H
DATA_LEN EQU 33H
DATA_FOSC EQU 34H
DATA_MODE EQU 35H
DATA_BUFFER EQU 36H
REV_DAT_ADDR EQU 80H

下面来看一下Boot ROM中的源代码与反汇编程序。

源程序 反汇编程序

FC41 75 32 00 MAIN: MOV DATA_SUM,#00H;校验和
FC44 91 A0 ACALL REV_SEND0
FC46 B4 3A F8 CJNE A,#3AH,MAIN;判断A=:?
FC49 91 79 ACALL REV_DAT1_SUM
FC4B 85 36 33 MOV DATA_LEN,DATA_BUFFER ;33H字节数
FC4E 91 79 ACALL REV_DAT1_SUM
FC50 85 36 31 MOV DATA_ADDRH,DATA_ BUFFER ;31H数据首地址高8位
FC53 91 79 ACALL REV_DAT1_SUM
FC55 85 36 30 MOV DATA_ADDRL,DATA_ BUFFER ;30H数据首地址低8位
FC58 91 79 ACALL REV_DAT1_SUM
FC5A 85 36 35 MOV DATA_MODE,DATA_ BUFFER ;35H数据操作类型
FC5D E5 33 MOV A,DATA_LEN
FC5F FA MOV R2,A ;循环接收数据指针
FC60 60 09 JZ RREV3 ;字节数=0 转RREV3
FC62 79 80 MOV R1,#REV_DAT_ADDR
FC64 91 79 RREV2: ACALL REV_DAT1_SUM
FC66 A7 36 MOV @R1,DATA_MODE
FC68 09 INC R1
FC69 DA F9 DJNZ R2,RREV2
FC6B AC 32 RREV3: MOV R4,DATA_SUM ;校验和
FC6D 91 79 ACALL REV_DAT1_SUM
FC6F EC MOV A,R4
FC70 B5 36 02 CJNE A,DATA_BUFFER,RREV4
;校验和不等转
FC73 81 BF AJMP RUN_MODE
FC75 74 58 RREV4:MOV A,#58H ; A=X
FC77 81 FA AJMP SEND_DT

首先,对程序中用到的子程序作如下的说明。
REV_SEND0子程序:接收1个数据并回传给上位机;
REV_DAT1_SUM子程序:接收2个ASCII字符并回传,将2个ASCII码合成1字节二进制数并计算校验和;
SEND_DT:该地址执行送字符X给上位机;
RUN_MODE:该地址解释并执行命令字。

对上段程序分析如下:首先,将校验和单元清零,开始接收第1个ASCII码,并判断是否为:。如果是,则说明是一个命令字的开始,下面便依次接收字节数DATA_LEN、数据首地址高8位DATA_ ADDRH、数据首地址低8位DATA_ADDRL和数据操作类型DATA_MODE。这跟其命令字格式是完全对应的。然后,程序根据接收数据字节数 DATA_ LEN来决定下面的数据接收,并将接收的数据存储在从80H开始的内部数据存储器中,以备下一步的处理。最后,进入校验和的接收,将程序计算所得的校验和与上位机传输的校验和作比较,如果不等,回传X字符,通知上位机进行异常处理;如果相等,则转入相应的命令执行。

3.3 命令的执行

命令解释和执行的源代码和反汇编程序如下:

源程序 反汇编程序

FCBF E5 35 RUN_MODE: MOV A,DATA_MODE
;35H数据操作类型
FCC1 23 RL A ;A=A*2
FCC2 90 FC C6 MOV DPTR,#BASE_ADDR ;程序散转
FCC5 73 JMP @A+DPTR
FCC6 81 D4 BASE_ADDR: AJMP PRO_DATA
;00=传送编程数据并完成编程
FCC8 81 F8 AJMP SEND_CHAR_OK
;01=传文件结束符
FCCA 81 FE AJMP SETUP_FOSC
;02=指定振荡器频率
FCCC A1 70 AJMP MPRO_DAT
;03=杂项编程功能
FCCE A1 04 AJMP READ_CHECK
;04=显示指定地址段FLASH数据或查空
FCD0 A1 9F AJMP READ_DATA
;05=各种读功能
FCD2 A1 B3 AJMP SETUP_BPS
;06=直接装载波特率

在正确地接收命令后,通过DATA_MODE项(即命令格式中的RR)来判断功能并转入相应的程序。程序中对每一个跳转地址都作出了相应的注释。

4 几点说明

① 上述带源代码的程序均是Boot ROM中反汇编得来的,并且大部分是连续的。这一点可以从地址分布上看出来,读者可以将其合并在一起看,相信可以加强理解。有兴趣的读者也可以参照以上给出的方法将全部代码读出,电路图和源程序几乎都不必重编了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top