微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC12C系列的协议分析

STC12C系列的协议分析

时间:11-29 来源:互联网 点击:
这个版本的协议和以前已经有了比较大的改变,包括包头等等。但是STC有一个千年不变的开启帧:0x7F,在STC15系列的MCU,仍然使用着这个ISP的开启帧。原因我不说大家也明白

那么进入主题:STC12系列下载的帧格式:

协议帧简介:主要构成如下

Head

Sign

Reserved

Length

Frame

Data

Checksum

Trail

各个填充区详细说明:

名称

长度

功能

Head

2-Byte

包头 (0×46,0xB9)

Sign

1-Byte

标识 (0x6A或0×68)

Reserved

1-Byte

预留区 (填充0×00)

Length

1-Byte

(Head + Length + Frame+Data)的总长

Frame

1-Byte

用以区分不同的帧

Data

0~0x8A Bytes

数据

Checksum

2 Byte

校验和

Trail

1 Byte

包尾 (0×16)

至于Cmd的协议应答之类的:

命令 说明 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 退出 重启进用户程序

至于交互过程,也算是简单的,就是看你的设备反应速度了。这就是为什么某些PL2303线下载老出错的原因,不过我这里至少用的挺好。

PC ->0x7f ->MCU

MCU ->信息 ->PC

PC -> 核对?MCU型号 -> MCU

MCU ->波特率变更请求 ->PC

PC ->波特率测试 ->MCU[此时,计算重载值切换波特率】

MCU ->成功/无回应 -> PC

PC ->波特率设置 ->MCU [切换到最低波特率上去

MCU ->成功/无回应 ->PC [切换到数据波特率上去

PC -> 擦除芯片 -> MCU

MCU ->成功/无回应 ->PC

PC -> 0x80个字节数据 ->MCU

MCU -> 校验码 ->PC

循环到文件结束

PC ->设置?型号 ->MCU

MCU ->成功/无回应 -> PC

PC ->设置选项 ->MCU

MCU ->成功/无回应 -> PC

PC ->编程结束 ->MCU

校验和算法是将标识到数据区的内容统统加起来,取低十六位,看程序:

01PUBLIC FUNCTION CheckSum(buff ASString, start ASInteger, endchr ASInteger) ASString返回两个字

02DIM i ASInteger

03DIM chkSum ASLong

04DIM lo ASByte

05DIM hi ASByte

06DIM tempStr ASString

07chksum = 0

08FOR i = start TO endchr

09chksum = chksum + Asc(Mid(buff, i, 1))

10NEXT

11hi = Shr(chksum AND &HFF00, 8)

12lo = chksum AND &H00FF

13tempStr = Chr(hi) & Chr(lo)

14RETURN tempStr

15END

关于STC12C5Ax系列的信息帧,这里有一张别人分析的图:

至于固件版本我这里测试的有:

16.6I : 66 49

26.2I : 62 49

关于晶振速度的计算:

如果是标准12M时钟,1200Kps波特率,则计数值为1/1200*7 = 5833uS,数值也为5833。将八次技术求平均(假设为18 94=6292),则此时单片机时钟频率=6292*12M/5833 = 12.994MHz。

我正在想,那么C级别的单片机是不是xx 43呢~

以下数据帧省略帧头帧尾帧长度校验码

——————–核对MCU型号帧————————-

发送数据 50 07 00 36 01 MCU型号

接收数据 8F

——————-波特率实验帧—————————–

发送数据 8F xx yy zz aa dd 83

xx=0xC0 (C0=1100 0000,意思就是T1x12,波特率加倍)

yy=定时器重载值,按照加倍/1T计算。

zz=设置校验值,计算方式是 ff=xx

aa=波特率校验值,计算方式是aa=2 * (0×100 -yy)

dd=延时值,延时多少时间片切换

83为ISP定时常数,这个值适用于12M晶振,在STC手册中有不明显的描述:

1//#define ENABLE_IAP 0x80//if SYSCLK<30MHz

2//#define ENABLE_IAP 0x81//if SYSCLK<24MHz

3//#define ENABLE_IAP 0x82//if SYSCLK<20MHz

4//#define ENABLE_IAP 0x83//if SYSCLK<12MHz

5//#define ENABLE_IAP 0x84//if SYSCLK<6MHz

6//#define ENABLE_IAP 0x85//if SYSCLK<3MHz

7//#define ENABLE_IAP 0x86//if SYSCLK<2MHz

8//#define ENABLE_IAP 0x87//if SYSCLK<1MHz

但是实际上测试似乎83这个值在40M都没有问题。

接受数据:

8F xx yy zz aa dd 83

—————————–波特率确认帧

发送数据 8E xx yy zz dd 83

接收数据 同上

——————————擦除帧:

这里我有充分的理由怀疑老妖是有毛病的。都到了下载程序的地步了还搞这么诡异的擦除命令:

184FF00F00000F00000000000000000000000

200807F 7E 7D 7C 7B 7A797877767574737271706F 6E 6D 6C 6B

36A696867666564636261605F 5E 5D 5C 5B 5A595857565554

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top