P89C51RD2的Boot ROM与ISP功能的实现
主程序中用到了两个子程序:READ_ROM和SEND_END。
READ_ROM子程序功能:从FC00H开始将代码读出,将其转变成ASCII码并拼凑成HEX文件记录的形式传给上位机。
读Boot ROM代码所调用的子程序见本刊网站发表的全文。
3 Boot ROM固件的功能分析
通过对Boot ROM中的程序进行分析,可以对ISP的有关指令进行更深入的理解,在一些编程方法上也可以向国外学习。下面对ISP的有关知识点进行阐述。
3.1 关于自动确定波特率
PHILIPS给出的ISP功能的第一个步骤为:上位机向下位机发送一个大写的英文字符U,供下位机确定波特率。
3.1.1 工作原理
大写的英文字符U有它的特殊性,它的ASCII码为55H,转换成二进制为01010101B,也就是说它是一个0、1相间的数据,如图2所示。如果能够算出其一个位的传输时间tp,则对应的波特率就可以计算出来。
3.1.2 tp对应的计数值
首先看一下在Boot ROM中是如何计算一个位所对应的计数值的。以下为Boot ROM从地址FC00H ~FC17H之间的源代码及反汇编程序:
源代码 反汇编程序
FC00 75 89 02 MOV TMOD,#02H ;T1工作模式2,定时器
FC03 75 C8 30 MOV T2CON,#30H ;T2工作为串行口波特
;率发生器
FC06 E4 CLR A
FC07 F5 CD MOV TH2,A
FC09 F5 CC MOV TL2,A ;T2=0000H
FC0B 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到其变为1
FC0E 20 B0 FD JB P3.0,$ ;若P3.0=1,则等待,
;直到下降沿到来
FC11 D2 CA SETB TR2 ;启动T2定时器
FC13 30 B0 FD JNB P3.0,$ ;若P3.0=0,则等待,
;直到上升沿到来
FC16 C2 CA CLR TR2 ;关闭T2定时器,此时
;T2中的数值为tp
首先将T2清0,然后测下降沿,测到下降沿后,开始置TR2=1,T2开始计数,等测到上升沿后,置TR2=0,停止计数,则此时T2中为传送 1bit(低电平)的计数值。以波特率2400 bps为例,则传送1bit所用的时间为1/2400 s,即416.67μs。P89C51RD2主频为11.0592 MHz,再由PHILIPS公司的数据手册可知,当T2工作于波特率发生器模式时,OSC未经分频直接进入T2计数器,由此可得在tp时间内T2的理论计数值为:(T2)=0.000 416 67×110 592 00= 4608(十进制)=1200H。在这里,特别要强调的是:该数只是一个理论值。对波特率为2400 bps时的实际值进行测试,发现实测值为11FAH左右。不管怎样测,实测值总是小于理论值6个数左右。这个数据为下面的波特率计算提供了重要依据。
3.1.3 波特率的计算
程序中对波特率的计算颇有特色,下面是地址FC18H~FC36H之间的源代码和反汇编程序:
源代码 反汇编程序
FC18 E5 CC MOV A,TL2
FC1A C4 SWAP A
FC1B 54 0F ANL A,#0FH ;取TL2高4位
FC1D F8 MOV R0,A
FC1E E5 CD MOV A,TH2
FC20 C4 SWAP A
FC21 54 F0 ANL A,#0F0H;取TH2低4位
FC23 48 ORL A,R0
FC24 F8 MOV R0,A ;组合后送入R0
FC25 E5 CD MOV A,TH2
FC27 C4 SWAP A
FC28 54 0F ANL A,#0FH ;取TH2高4位
FC2A F9 MOV R1,A
FC2B E8 MOV A,R0 ;以上程序实现T2中数据除以
;16,送R1和R0保存
FC2C F4 CPL A ;低位取反
FC2D F5 CC MOV TL2,A
FC2F F5 CA MOV RCAP2L,A
FC31 E9 MOV A,R1
FC32 F4 CPL A ;高位取反
FC33 F5 CD MOV TH2,A
FC35 F5 CB MOV RCAP2H,A
上述程序就是将tp对应值转换成波特率的程序,先来看一下波特率是怎样定义的。定时器2工作在波特率发生器模式,外部时钟信号由T2脚进入,波特率为
所以程序中首先将T2中的计数值进行处理,相当于右移4位,将低4位去掉,11FAH变为011FH,对应式(1)中除以16,送R1和R0保存,然后将R1和R0中的值取反,其值为FEE0H。该值恰恰与根据式(1)计算出的数值相同。将该数值送T2和RCAP2,即得2400bps对应的赋值。
3.1.4 波特率的校验
在波特率确定以后,首先设定TR2=1以启动波特率,并对串口控制字进行设定。然后,程序对其进行校验。方法是接收上位机的数据并以设定波特率回送该值,一方面通知上位机送出和接收的数据是否相同,如果相同,则上位机认为下位机的波特率设置正确,通信成功;另一方面程序也将接收的数据?quot;U 的ASCII码相对照,如果相等,则往下执行,如果不等,则继续重复上述过程,直到成功为止,否则进入死循环,只有程序复位才能退出。下面是其源程序与反汇编程序(FC37H至FC40H):
源代码 反汇编程序
FC37 D2 CA SETB TR2
FC39 75 98 52 MOV SCON,#52H ;方式1,TI=1
FC3C 91 A0 RREV0: ACALL REV_SEND0
FC3E B4 55 FB CJNE A,#55H,RREV0 ;判断A=U?
其中,REV_SEND0子程序的功能是接收一个数据并回传给上位机。由上述程序可以看出,实际上要通信成功,上位机至少要向下位机发送两个U:第一个用于确定波特率,另一个用于校验波特率,
功能 实现 ISP ROM Boot P89C51RD2 相关文章:
- 基于DSP数字多功能板的实现(09-08)
- 基于DSP2407的多功能电源控制系统设计(09-08)
- DVR操作系统分析(07-23)
- 基于PROTEUS技术的ARM7显示系统设计与仿真实现(11-22)
- 一种大型软件测试方法(08-01)
- 嵌入式软件三大潜在问题及其测试技术(01-13)