在P89C51RD2的ISP状态下,单片机接收上位机发送的命令和数据,这些命令和数据是采用Intel HEX 文件的格式,网上有不少文章中研究甚至反编译了BOOT ROM中的代码,得到了ISP运行的过程,在我的系统中也用到了这个东西,因为要对FLASH中的数据进行升级,所以实现了一整套Intel HEX格式命令的解析,代码如下: ;============================== RUN_MODE: MOV A,DATA_MODE ;数据操作类型 RL A ;A=A*2 ADD A,DATA_MODE ;A=A*3 LJMP指令占用三个字节空间 MOV DPTR,#IAP_BASE_ADDR ;程序散转,不能超过有84个命,85*3=255 JMP @A+DPTR IAP_BASE_ADDR: LJMP IAP_PRO_DATA ;00=传送编程数据并完成编程 LJMP IAP_SEND_CHAR_OK ;01=传文件结束符 LJMP IAP_SETUP_FOSC ;02=指定振荡器频率 LJMP IAP_MPRO_DAT ;03=杂项编程功能 LJMP IAP_READ_CHECK ;04=显示指定地址段FLASH 数据或查空 LJMP IAP_READ_DATA ;05=各种读功能 LJMP IAP_SETUP_BPS ;06=直接装载波特率 ;以上兼容Philips的ISP命令,下面为自定义命令 LJMP IAP_SET_DEVICE_CLOCK ;07=设置实时时钟 LJMP IAP_RESTART ;08=重新启动系统 LJMP IAP_READ_DEVICE_CLOCK ;09=读取实时时钟 。。。。。。。。。。 LJMP IAP_MAIN_LOOP ;其他命令 REV_SEND1: JNB RI, $ CLR RI MOV A,SBUF ;接收数据 RET ;============================== ;接收两个ASCII字符并回传;将两个 ;ASCII码合成为1字节二进制数 ;============================== REV_DAT1_SUM: ACALL REV_SEND1 ACALL ASCII_HEX ;将ASCII字符转化为二进制 SWAP A MOV B,A ;首先接收高位字节数据 ACALL REV_SEND1 ACALL ASCII_HEX ;将ASCII字符转化为二进制 ORL A,B ;组合成一个字节数据 MOV DATA_BUFFER,A ADD A,DATA_SUM ;计算和校验 MOV DATA_SUM,A RET SERIAL_SEND_CHAR: JNB TI,$ CLR TI MOV SBUF,A RET 除了实现Philips定义的那些命令外还可以自定义命令,实现自己需要的功能。Philips命令集严格按照芯片文档来写程序,通过前几篇文章可以写出这个IAP的系统调用接口函数。
|