"); //-->
在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的系统调用接口函数。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。