Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2147151
  • 博文数量: 361
  • 博客积分: 10828
  • 博客等级: 上将
  • 技术积分: 4161
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-20 14:34
文章分类

全部博文(361)

文章存档

2011年(132)

2010年(229)

分类: C/C++

2011-04-04 10:45:58

两年前,曾经用过STC的单片机,当时对他的那个ISP下载功能很是感兴趣,且当时也想实现一个IAP升级办法,又不想占用他现有的flash空间,毕竟还是有点小。

就想办法着手研究了一下,就写了一段代码在8051内核的64K空间依次读取所有的数据,最后得到了一个2k多一点的ISP所用的bin文件,反汇编得到汇编文件,就在那花功夫细细地看了看实现方法,

分析得出了基本的下载协议,两年后,我觉得这些东西可以考虑公开了,让再选用STC的兄弟提前参考下,毕竟在某种情况下STC很易被解,(STC的ISP被写坏后还可再升回去,说明非ROM型,这个是不是突破点呢?有设备的兄弟可想想办法,找个工具把ISP部分写掉,然后把程序区的程序读出来,这个需要验证,偶不做这些事,只是在想:我们应该想办法避免掉这种问题。

注意:如果被宏晶科技的员工看到这份协议,请见谅。因为错误也有你们的一半,是你们激发我去开发这份协议得,详见文档后边的《后话》小节。同时这也说明一个问题,你自己的保密工作做得不够。因为我做矛的技术并不高明,只是你们的盾太弱了。

当年我想从你们那得到协议,未果,于是便有了下边的这些。

 强调:请各位阅读者不要胡乱传播,以免损害了宏晶科技的利益。建议各位购买宏晶专用的ISP烧写器。

rar
附协议简介:该版本协议现已通过在ISP版本为3.53.6上的测试,可以实现可靠下载。

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

Head

Sign

Reserved

Length

Frame

Data

Checkksum

Trail

   各个填充区详细说明:

名称

长度

功能

Head

2-Byte

包头 (0x46,0xB9)

Sign

1-Byte

标识 (0x6A0x68)

Reserved

1-Byte

预留区 (填充0x00)

Length

1-Byte

(Head + Length + Data)的总长

Frame

1-Byte

用以区分不同的帧

Data

0~0x8A Bytes

数据

Checksum

1 Byte

校验和

Trail

1 Byte

包尾 (0x16)

包头Head(0x46,0xB9)

标识 Sign0x6A表示下载的数据,0x68表示4052返回的数据

预留 Reserved填充0x00

包长Length是包头区,包长区,数据区的总长度

帧类型Frame区分不同的帧               

Value

帧类型描述

0x00

数据帧:包内存放要写入Flash的数据

0x80

确认帧,没有数据

0x81

错误帧,没有数据

0x82

结束帧

0x84

准备帧,准备开始传送数据

0x8E

波特率更改

0x8F

波特率检验

0x30,0x50,0x86,0x8D,0x52

暂时不需要(未详解)

 
数据区Data用以存放要传送的数据

校验和Checksum仅计算包头区,包长区,数据区

       计算方式为:以字节为单位进行加计算,计算出三个区的总和后,再加1,取低8位。

  激活帧就一个字节,是固定的,不使用协议格式,值为0x7F。通过这个来协商实现ISP下载所用波特率选择,内部有办法测晶振,所以用外部晶振也可以下载,新出厂的芯片用内部RC振荡下载。

波特率检验帧(0x8F)和波特率更改帧(0x8E)

   波特率检验帧(0x8F)

SetBaud

Reserved

ISPWrite

    各个填充区详细说明:

名称

长度

功能

SetBaud

2-Byte

用以设置MCU的波特率参数,填充为:(##xx xxxxB##H)

其中第1个字节中##是需要填充的,依次代表4052芯片中的SMOD位和T1x12位,第2个字节为填入TL1TH1中的数据,Timer1使用方式2—AutoReload

Reserved

2-Byte

预留区(填充0x00)

ISPWrite

1-Byte

设置ISP写,应为0x8#,其中#的范围为0~7,用以设置ISP擦写的等待时间,与晶振速率有关,具体请参照《STC12C2052AD.pdf》的p40

 波特率更新帧(0x8E)

SetBaud

Reserved

   填充方法与波特率检验(0x8F)帧中的一样,且要求数据一样。

返回值:返回接收到的数据和命令。并且在接收到波特率更新帧后采用新的波特率发送数据。

 3.3.准备帧(0x80)和引导帧(0x84)

     准备帧(0x80):可以不带数据。

引导帧(0x84) :可以不带数据,至少在3.53.6版中,可以不用去管。

返回值:准备帧(0x80)和引导帧(0x84)的返回值相同,均返回准备帧。

 
3.4.数据帧(0x00)

       用以下格式填充协议包中的数据区

Res 1

Address

Res 2

Len

FlashData


名称

长度

功能

Res 1

3-Byte

预留区1 (填充0x00)

Address

2-Byte

地址区

Res 2

1-Byte

预留区2 (填充0x00)

Len

1-Byte

Flash数据长度

FlashData

1-0x80 Bytes

存放Flash数据

   例如:将0x80个数据写入地址:0x8080,则填充如下:

00,00,00,08,80,00,80,########(表示0x80字节数据)

返回值:返回准备帧(0x80),带一字节数据,该数据为上一帧Flash数据的校验和。

其中校验和计算方式与整包的计算方式相同,但应强调的是,计算的结果再减1,详见(2.基本概念 中的 校验和模块)。例如:如果上一包数据为0x800,则按照计算函数则得到0x01,最后减1,即校验值为0x00


3.5.结束帧(0x82)

     该帧用于结束ISP下载,可以不带数据。接收到该帧后,ISP会先返回数据,然后清空RAM,继而Reset进入用户程序空间。


===================================================================================================================

http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=4004114

虽然STC的资料和网站土了一点,但是单片机用起来还可以的。 
由于下载软件STC-ISP界面十分丑陋,并且不稳定,经常下载失败,所以产生了分析下载协议,重新编写软件,以及制作脱机下载器的想法。 
第一步当然是截取PC机和MCU之间的通讯内容分析, 
经过几天几夜的奋斗,取得了一点成果,但仍有相当一部分内容无法研究明白,现在决定暂时停止了,将前期得出的一些结论_公布与此。 
以下所有信息均是在STC12C5604上得出,与早年某些型号比较变化较大。 
数据包格式: 
包头 + 标识 + 数据包长度 + 命令 + 数据 + 校验和 + 包尾 
包头为两个字节,0x46,0xb9 
标识分两种,PC机发送给MCU的为0x6A,MCU回应给PC的是0x68,标识后面还有一个字节固定为0x00。 
数据包长度为除包头外的数据包总长。 
命令为一个字节。 
数据可以有也可以无,最多时有100多个字节。 
校验和为两字节,为包头之后,校验和之前所有字节相加的值。 
包尾固定为0x16 
举个例子说明: 
PC机发送:46 B9 6A 00 0D 50 05 00 36 01 E6 04 01 ED 16 
MCU回应: 46 B9 68 00 07 8F 00 FE 16 

大体工作流程: 
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 型号等                       8F 应答 
8F 新波特率测试            8F 测试应答 
8E 正式修改波特率            84 修改波特率应答 
84 文件容量,擦除芯片              00 应答 
00 下载程序                      00/30 应答校验和,成功或失败 
30 重新下载程序           00/30 应答校验和 
69 型号等                      8D 应答 
8D 设置选项                       50 应答选项 
82 退出                      Reset

由于篇幅有限,上面只是简单的一个流程。 
目前所有的工作流程和命令都搞清楚了,不了解的是个别命令携带的数据所表示的意义。 
例如,MCU回应自身选项数据内容为 
16 BF 16 BF 16 BF 16 C0 16 C0 16 BF 16 BF 16 BF  
60 47 00 E6 04 8E FF FF F7 FF FF FF BF FF FF FF  
F7 FF 00 00 00 00 00 00 00 00 
前16个字节为进行8次脉宽测量的结果,60 47表示固件版本为6.0G,E6 04表示单片机型号为5604,后面还有一些字节表示时钟选择,复位电压,看门狗等等,不一一详述。 

再一个是设置波特率命令 
携带数据 C0 F3 3F 1A 28 83 
C0即二进制1100 0000其中两个1分别表示的是串口二倍速和定时器T1 12倍速,F3是波特率发生器T1的重装值,12M晶振,F3重装正好是57600波特率。中间的两个字节3F 1A至今未搞明白是什么含义,只知道1A这个值随波特率不同而变化,后面的28字节是个延时值,表示切换波特率后多长时间回应,83是IAP功能的定时参数,这个值与晶振有关,83这个值适合12M晶振时使用。 

下载数据的命令就很简单了 
00 00 00 00 00 00 80 (128HEX) 
前面两个固定00 00,后面的 00 00 是写入地址,再后面的00 80是数据量大小。 

阅读(2577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~