jackielau 发表于 2012-7-6 15:15:44

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:不知为什么!
      
   


tlptotop 发表于 2012-7-11 11:51:49

在单片机程序里只有这一句if(P30 == 0) IAP_CONTR = 0x60; ,然后再每次修改一个参数,进行测试,30分钟搞定所有参数。

壹佰法拉 发表于 2012-7-11 16:15:58

我只想知道怎样擦除程序;

b159 发表于 2012-12-12 15:15:55

本帖最后由 b159 于 2012-12-12 15:17 编辑

第一步没有问题,发送7F,收到MCU的信息了
可第二步设置MCU型号,命令数据已发送出去,没有收到MCU的应答数据,什么原因啊,求助!!!


这些数据的发送应该如何发送啊?
页: [1]
查看完整版本: 12C5201AD ISP协议分析