12C5201AD ISP协议分析
本帖最后由 jackielau 于 2012-7-6 15:17 编辑声明:下面的数据是我在12C5202AD编程中截取的,部分是我自己分析,又很多前人的经验。
STC种类很多,通信协议又有一定的不同,下面只是针对12C5202AD
说明:这是一个对12C5202AD写入10个数据的过程,为01 02 03 04 05 06 07 08 09 0A
有很多具体参数没有分析出来,希望继续补充!
STCISP(12C5202AD)通信协议6.0H
一、协议帧简介
主要构成如下
Head
Sign
Reserved
Length
Cmd
Data
Checkksum
Trail
各个填充区详细说明:
名称
长度
功能
Head
2-Byte
包头 (0x46,0xB9)
Sign
1-Byte
标识 (0x6A或0x68)
Reserved
1-Byte
预留区 (填充0x00)
Length
1-Byte
除去Head的总长,即(Sign+Reserved + Length + Cmd + Data+ Checksum + Trail)的总长
Cmd
1-Byte
命令
Data
0~0x8A Bytes
数据
Checksum
2 Byte
校验和
Trail
1 Byte
包尾 (0x16)
包头Head:(0x46,0xB9)
标识 Sign:0x6A表示下载的数据,0x68表示4052返回的数据
预留 Reserved:填充0x00
包长Length:是除去Head的总长,即(Sign + Reserved + Length + Cmd + Data+ Checksum + Trail)的总长
命令Cmd:区分不同的帧
数据区Data:用以存放要传送的数据
校验和Checksum:仅计算包头和校验和之间的数据。前面是校验和高字节,后面是低字节。
计算方式为:以2字节为单位进行加计算,计算出总。
二、工作流程
PC机以最低波特率(默认1200bps)连续不断发送字节流0x7F 0x7F 0x7F......
MCU上电后检测到RXD引脚上的脉冲变化后,用定时器测量0脉冲的宽度,并且根据测量值将自身波特率设置为与PC机相同(1200bps),然后发送一包数据,包含脉冲宽度的测量值,MCU固件版本,型号,配置选项等。
PC机收到后,判断型号是否匹配,根据MCU回应的脉宽值计算出MCU的时钟频率,然后计算出MCU可用的最大波特率,然后向MCU发送设置新波特率的命令。
经过几次来回交互后
PC机发送芯片容量和要下载程序文件的大小,MCU收到后据此擦除片内Flash。
然后PC机以128个字节为单位,带有写入地址等信息发送至MCU,MCU收到后回应128个字节校验和,校验成功或失败。
最后有需要的话,PC机还要发送配置选项信息。
最后发送完成命令,MCU收到后立即复位运行用户程序,不再回应数据。
三、命令解释
命令列表:
命令 说明 MCU回应
7F 引导MCU进入ISP并测量时钟 50 MCU选项信息
50 设置MCU型号等 8F 应答
8F 新波特率测试 8F 测试应答
8E 正式修改波特率 84 修改波特率应答
84 文件容量,擦除芯片 00 应答
00 下载程序 00/30 应答校验和,成功或失败
30 重新下载程序 00/30 应答校验和
69 型号等 8D 应答
8D 设置选项 50 应答选项
82 退出 Reset
(一)引导MCU进入ISP并测量时钟
PC不断发送0x7F,MCU收到后测量0x7F的计数值,并发送相关信息。回复选项0x50,回复内容解析:
46 B9头
68 MCU to PC
00
31 数据长度
50命令
18 93 18 94 18 93 18 95 18 9A 18 99 18 97 18 9B 八次0x7F的计数值
60 48固件版本6.0H
00
E1 62单片机型号
8C
FD FF F7 FF FF参数选项
FF FF FF FD FF F7 FF 00 00 00 00 00 00 00 00
14 B4校验和,从头之后到此之前,高字节在前
16尾
(1)0x7F的计数值。如果是标准12M时钟,1200Kps波特率,则计数值为1/1200*7 = 5833uS,数值也为5833。将八次技术求平均(假设为18 94=6292),则此时单片机时钟频率=6292*12M/5833 = 12.994MHz。
(2)单片机型号:两个字节,一个表示系列,一个表示容量。
系列:
F4: stc89F54
F3: stc12C54
F2: STC12C4052
F1: STC89C54RD+
F0: STC89C53RC
E6: STC12C5604
E2: STC11F04
E1: STC12C5204
E0: STC12C5404
D4: STC15f04
D3: STC11F08
D2: STC10F04
D1: STC12C5A08X
58: STC89LE58AD
56: STC89LE516AD
54: STC89LE54AD
52: STC89LE52AD
(二)设置MCU型号0x50---0x8F
发送:46 B9 6A 00 0D 50 06 00 36 01 E1 62 02 47 16
应答:46 B9 68 00 07 8F 00 FE 16
(三)新波特率测试0x8F---0x8F
发送:15(Bytes) 46 B9 6A 00 0D 8F C0 F9 3F 0E 28 82 03 B6 16
关闭COM
打开COM
应答:16(Bytes) 46 B9 68 00 0E 8F C0 F9 3F 0E 28 82 03 03 B8 16
关闭COM
C0即二进制1100 0000,其中两个1分别表示的是串口二倍速和定时器T1 12倍速,F9是波特率发生器T1的重装值,12.951324M晶振,F9重装正好是4800波特率。中间的两个字节3F 0E未明白是什么含义,只知道0E这个值随波特率不同而变化,后面的28字节是个延时值,表示切换波特率后多长时间回应,82是IAP功能的定时参数,这个值与晶振有关,用以设置ISP擦写的等待时间,0x80到0x87,具体请参照《STC12C5201AD.pdf》的IAP_CONTR寄存器设置。82这个值适合小于20M晶振时使用。
应答时添加一个字节03。
(四)正是设置波特率0x8E---0x84
打开COM:
发送:14(Bytes)46 B9 6A 00 0C 8E C0 F9 3F 0E 28 03 32 16
关闭COM:
打开COM:
应答:15(Bytes) 46 B9 68 00 0D 84 C0 F9 3F 0E 28 03 03 2A 16
用法和新波特率测试一样,只是没有IAP功能的定时参数。
应答时添加一个字节03。
(五)擦出新片,准备下载程序0x84---0x00
发送:142(Bytes)46 B9 6A 00 8C 84 FF 00 02 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 80 7F 7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E 22 68 16
应答:9(Bytes) 46 B9 68 00 07 00 00 6F 16
(六)下载程序0x00---0x00
发送:143(Bytes) 46 B9 6A 00 8D 00 00 00 00 00 00 80 01 02 03 04 05 06 07 08 09 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 AE 16
00 00:写入地址,高字节在前
00 80:估计是写入的数据个数,高字节在前
数据个数后面跟128个(0x80个)
应答:10(Bytes) 46 B9 68 00 08 00 37 00 A7 16
37:写入的数据的校验和,一个字节
(七)设置型号0x69---0x8D
发送:15(Bytes)46 B9 6A 00 0D 69 06 00 36 01 E1 62 02 60 16
应答:9(Bytes) 46 B9 68 00 07 8D 00 FC 16
E1 62:MCU型号
(八)设置选项0x8D---0x50
关闭COM
打开COM
发送:41(Bytes)46 B9 6A 00 27 8D 7D F7 F7 FF FF 00 C5 9F 1C FF FF 7D F7 FF FF FF FF F7 FF FF FF FF FF FF FF 00 C5 9F 1C FF FF FF 1A E2 16
7D F7 F7 FF FF:参数选项
00 C5 9F 1C:时钟,00 C5 9F 1C=12.951324MHz
00 C5 9F 1C:时钟
应答:30(Bytes) 46 B9 68 00 1C 50 7D F7 F7 FF FF 03 FF 60 48 7D F7 F7 FF FF FF FF FF 7D F7 F7 FF 11 B7 16
60 48:固件版本6.0H
(九)退出0x82
发送:13(Bytes)FE FE FE FE 46 B9 6A 00 07 82 00 F3 16
关闭COM
FE FE FE FE:不知为什么!
在单片机程序里只有这一句if(P30 == 0) IAP_CONTR = 0x60; ,然后再每次修改一个参数,进行测试,30分钟搞定所有参数。 我只想知道怎样擦除程序; 本帖最后由 b159 于 2012-12-12 15:17 编辑
第一步没有问题,发送7F,收到MCU的信息了
可第二步设置MCU型号,命令数据已发送出去,没有收到MCU的应答数据,什么原因啊,求助!!!
这些数据的发送应该如何发送啊?
页:
[1]