這篇文章主要介紹STC12C系列的下載協(xié)議。
這個版本的協(xié)議和以前已經(jīng)有了比較大的改變,包括包頭等等。但是STC有一個千年不變的開啟幀:0x7F,在STC15系列的MCU,仍然使用著這個ISP的開啟幀。原因我不說大家也明白。
那么進入主題:STC12系列下載的幀格式:
協(xié)議幀簡介:主要構成如下
Head |
Sign |
Reserved |
Length |
Frame |
Data |
Checksum |
Trail |
各個填充區(qū)詳細說明:
名稱 |
長度 |
功能 |
Head |
2-Byte |
包頭 (0×46,0xB9) |
Sign |
1-Byte |
標識 (0x6A或0×68) |
Reserved |
1-Byte |
預留區(qū) (填充0×00) |
Length |
1-Byte |
(Head + Length + Frame+Da |
Frame |
1-Byte |
用以區(qū)分不同的幀 |
Da |
0~0x8A Bytes |
數(shù)據(jù) |
Checksum |
2 Byte |
校驗和 |
Trail |
1 Byte |
包尾 (0×16) |
至于Cmd的協(xié)議應答之類的:
命令 說明 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 [切換到數(shù)據(jù)波特率上去
PC -> 擦除芯片 -> MCU
MCU ->成功/無回應 ->PC
PC -> 0x80個字節(jié)數(shù)據(jù) ->MCU
MCU -> 校驗碼 ->PC
循環(huán)到文件結束
PC ->設置?型號 ->MCU
MCU ->成功/無回應 -> PC
PC ->設置選項 ->MCU
MCU ->成功/無回應 -> PC
PC ->編程結束 ->MCU
校驗和算法是將標識到數(shù)據(jù)區(qū)的內容統(tǒng)統(tǒng)加起來,取低十六位,看程序:
01 | PUBLIC FUNCTION CheckSum(buff AS String , start AS Integer , endchr AS Integer ) AS String '返回兩個字 |
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 |
15 | END |
關于STC12C5Ax系列的信息幀,這里有一張別人分析的圖:
至于固件版本我這里測試的有:
1 | 6.6I : 66 49 |
2 | 6.2I : 62 49 |
關于晶振速度的計算:
如果是標準12M時鐘,1200Kps波特率,則計數(shù)值為1/1200*7 = 5833uS,數(shù)值也為5833。將八次技術求平均(假設為18 94=6292),則此時單片機時鐘頻率=6292*12M/5833 = 12.994MHz。
我正在想,那么C級別的單片機是不是xx 43呢~
以下數(shù)據(jù)幀省略幀頭幀尾幀長度校驗碼
——————–核對MCU型號幀————————-
發(fā)送數(shù)據(jù) 50 07 00 36 01 MCU型號
接收數(shù)據(jù) 8F
——————-波特率實驗幀—————————–
發(fā)送數(shù)據(jù) 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定時常數(shù),這個值適用于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都沒有問題。
接受數(shù)據(jù):
8F xx yy zz aa dd 83
—————————–波特率確認幀
發(fā)送數(shù)據(jù) 8E xx yy zz dd 83
接收數(shù)據(jù) 同上
——————————擦除幀:
這里我有充分的理由懷疑老妖是有毛病的。都到了下載程序的地步了還搞這么詭異的擦除命令:
1 | 84 FF 00 F0 00 00 F0 00 00 00 00 00 00 00 00 00 00 00 |
2 | 00 80 7F 7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B |
3 | 6A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54 |
4 | 53 52 51 50 4F 4E 4D 4C |
5 | 4B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35 |
6 | 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 1F 1E |
7 | 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E |
回應:
00 00
———————數(shù)據(jù)幀
發(fā)送 00 00 00 ADDR 00 LEN EF 0×80 bytes數(shù)據(jù)
ADDR = 2BYTE 的地址,高位在前低位在后
LEN 似乎是數(shù)據(jù)長度
數(shù)據(jù)字段如果不足80 bytes填ff補足
回應 07 ChkSum
ChkSum的算法和前面介紹的一樣,只不過只是針對數(shù)據(jù)部分的校驗
——————設置型號幀:
69 07 00 36 01 MCU_MODEL
MCU_MODEL是MCU型號
回應就一個字 8D
——————-設置選項幀
發(fā)送:8D FF x1 x2 FF FF FF FF FF x3 FF FF FF FF FF FF 00 A9 0A A6
x1,x2,x3參見前面的選項信息
接受: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
沒有回應。
具體實現(xiàn)可以看kSTC12-ISP的實現(xiàn)方式
萬致遠原創(chuàng),轉載注明出處:http://www.rwzy.co.cc
用ie發(fā)帖應該沒有問題的
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |