標(biāo)題: [轉(zhuǎn)帖]我自己小站上的對(duì)STC12系列下載協(xié)議的分析 [打印本頁(yè)]

作者: rgwan    時(shí)間: 2012-8-2 21:35
標(biāo)題: [轉(zhuǎn)帖]我自己小站上的對(duì)STC12系列下載協(xié)議的分析
 

這篇文章主要介紹STC12C系列的下載協(xié)議。

這個(gè)版本的協(xié)議和以前已經(jīng)有了比較大的改變,包括包頭等等。但是STC有一個(gè)千年不變的開啟幀:0x7F,在STC15系列的MCU,仍然使用著這個(gè)ISP的開啟幀。原因我不說大家也明白

那么進(jìn)入主題:STC12系列下載的幀格式:

協(xié)議幀簡(jiǎn)介:主要構(gòu)成如下

Head

Sign

Reserved

Length

Frame

 Data

Checksum

Trail

   各個(gè)填充區(qū)詳細(xì)說明:

名稱

長(zhǎng)度

功能

Head

2-Byte

包頭 (0×46,0xB9)

Sign

1-Byte

標(biāo)識(shí) (0x6A或0×68)

Reserved

1-Byte

預(yù)留區(qū) (填充0×00)

Length

1-Byte

(Head + Length + Frame+Data)的總長(zhǎng)

Frame

1-Byte

用以區(qū)分不同的幀

Data

0~0x8A Bytes

數(shù)據(jù)

Checksum

2 Byte

校驗(yàn)和

Trail

1 Byte

包尾 (0×16)

至于Cmd的協(xié)議應(yīng)答之類的:

命令        說明            MCU回應(yīng)
7F    引導(dǎo)MCU進(jìn)入ISP并測(cè)量時(shí)鐘        50    MCU選項(xiàng)信息

50    設(shè)置MCU型號(hào)等            8F    應(yīng)答

8F    新波特率測(cè)試            8F    測(cè)試應(yīng)答

8E    正式修改波特率            84    修改波特率應(yīng)答

84    文件容量,擦除芯片        00    應(yīng)答

00    下載程序            00/30    應(yīng)答校驗(yàn)和,成功或失敗

30    重新下載程序            00/30    應(yīng)答校驗(yàn)和

69    型號(hào)等                8D    應(yīng)答

8D    設(shè)置選項(xiàng)            50    應(yīng)答選項(xiàng)

82    退出                重啟進(jìn)用戶程序

至于交互過程,也算是簡(jiǎn)單的,就是看你的設(shè)備反應(yīng)速度了。這就是為什么某些PL2303線下載老出錯(cuò)的原因無(wú)視,不過我這里至少用的挺好。

PC ->0x7f ->MCU

MCU ->信息 ->PC

PC -> 核對(duì)?MCU型號(hào) -> MCU

MCU ->波特率變更請(qǐng)求 ->PC

PC ->波特率測(cè)試 ->MCU[此時(shí),計(jì)算重載值切換波特率】

MCU ->成功/無(wú)回應(yīng) -> PC

PC ->波特率設(shè)置 ->MCU [切換到最低波特率上去

MCU ->成功/無(wú)回應(yīng) ->PC [切換到數(shù)據(jù)波特率上去

PC -> 擦除芯片 -> MCU

MCU ->成功/無(wú)回應(yīng) ->PC

PC -> 0x80個(gè)字節(jié)數(shù)據(jù) ->MCU

MCU -> 校驗(yàn)碼 ->PC

循環(huán)到文件結(jié)束

PC ->設(shè)置?型號(hào) ->MCU

MCU ->成功/無(wú)回應(yīng)  -> PC

PC ->設(shè)置選項(xiàng) ->MCU

MCU ->成功/無(wú)回應(yīng) -> PC

PC ->編程結(jié)束 ->MCU

校驗(yàn)和算法是將標(biāo)識(shí)到數(shù)據(jù)區(qū)的內(nèi)容統(tǒng)統(tǒng)加起來,取低十六位,看程序:

01PUBLIC FUNCTION CheckSum(buff AS String, start AS Integer, endchr AS Integer) AS String '返回兩個(gè)字
02  DIM i AS Integer
03  DIM chkSum AS Long
04  DIM lo AS Byte
05  DIM hi AS Byte
06  DIM tempStr AS String
07  chksum = 0
08  FOR i = start TO endchr
09  chksum = chksum + Asc(Mid(buff, i, 1))
10  NEXT
11  hi = Shr(chksum AND &HFF00, 8)
12  lo = chksum AND &H00FF
13  tempStr = Chr(hi) & Chr(lo)
14  RETURN tempStr
15END

關(guān)于STC12C5Ax系列的信息幀,這里有一張別人分析的圖:

至于固件版本我這里測(cè)試的有:

16.6I : 66 49
26.2I : 62 49

關(guān)于晶振速度的計(jì)算:

如果是標(biāo)準(zhǔn)12M時(shí)鐘,1200Kps波特率,則計(jì)數(shù)值為1/1200*7 = 5833uS,數(shù)值也為5833。將八次技術(shù)求平均(假設(shè)為18 94=6292),則此時(shí)單片機(jī)時(shí)鐘頻率=6292*12M/5833 = 12.994MHz。

我正在想,那么C級(jí)別的單片機(jī)是不是xx 43呢~無(wú)視

以下數(shù)據(jù)幀省略幀頭幀尾幀長(zhǎng)度校驗(yàn)碼

——————–核對(duì)MCU型號(hào)幀————————-

發(fā)送數(shù)據(jù) 50 07 00 36 01 MCU型號(hào)

接收數(shù)據(jù) 8F

——————-波特率實(shí)驗(yàn)幀—————————–

發(fā)送數(shù)據(jù) 8F xx yy zz aa dd 83

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

yy=定時(shí)器重載值,按照加倍/1T計(jì)算。

zz=設(shè)置校驗(yàn)值,計(jì)算方式是 ff=xx

aa=波特率校驗(yàn)值,計(jì)算方式是aa=2 * (0×100 -yy)

dd=延時(shí)值,延時(shí)多少時(shí)間片切換

83為ISP定時(shí)常數(shù),這個(gè)值適用于12M晶振,在STC手冊(cè)中有不明顯的描述:

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

但是實(shí)際上測(cè)試似乎83這個(gè)值在40M都沒有問題。

接受數(shù)據(jù):

8F xx yy zz aa dd 83

—————————–波特率確認(rèn)幀

發(fā)送數(shù)據(jù) 8E xx yy zz dd 83

接收數(shù)據(jù) 同上

——————————擦除幀:

這里我有充分的理由懷疑老妖是有毛病的。都到了下載程序的地步了還搞這么詭異的擦除命令:

184 FF 00 F0 00 00 F0 00 00 00 00 00 00 00 00 00 00 00
200 80 7F 7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B
36A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54
453 52 51 50 4F 4E 4D 4C
54B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35
634 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 1F 1E
71D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E

回應(yīng):

00 00

———————數(shù)據(jù)幀

發(fā)送 00 00 00 ADDR 00 LEN EF 0×80 bytes數(shù)據(jù)

ADDR = 2BYTE 的地址,高位在前低位在后

LEN  似乎是數(shù)據(jù)長(zhǎng)度

數(shù)據(jù)字段如果不足80 bytes填ff補(bǔ)足

回應(yīng) 07 ChkSum

ChkSum的算法和前面介紹的一樣,只不過只是針對(duì)數(shù)據(jù)部分的校驗(yàn)

——————設(shè)置型號(hào)幀:

69 07 00 36 01 MCU_MODEL

MCU_MODEL是MCU型號(hào)

回應(yīng)就一個(gè)字 8D

——————-設(shè)置選項(xiàng)幀

發(fā)送:8D FF x1 x2 FF FF FF FF FF x3 FF FF FF FF FF FF 00 A9 0A A6

x1,x2,x3參見前面的選項(xiàng)信息

接受:50 FF x1 x2 FF x3 03 FF 固件版本 FF x1 x2 FF x3 FF 00 A9 00 03 00 9A 04 79 1A 00 AD FF 00 62

——————RESET幀

發(fā)送:82 00 00

沒有回應(yīng)。

具體實(shí)現(xiàn)可以看kSTC12-ISP的實(shí)現(xiàn)方式

萬(wàn)致遠(yuǎn)原創(chuàng),轉(zhuǎn)載注明出處:http://www.rwzy.co.cc

[此貼子已經(jīng)被作者于2012-8-2 21:36:48編輯過]

作者: rgwan    時(shí)間: 2012-8-2 21:36
 貌似這個(gè)論壇沒有代碼高亮功能。
粘貼過來格式變得亂七八糟了

作者: admin    時(shí)間: 2012-8-3 01:47

用ie發(fā)帖應(yīng)該沒有問題的


作者: rgwan    時(shí)間: 2012-8-3 13:33
 在Linux下面ies4linux可不好用……
作者: IdeaMing    時(shí)間: 2018-3-2 10:21
也想做個(gè)離線下載器玩,樓主寫的有參考價(jià)值。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1