STC單片機(jī)的下載協(xié)議
關(guān)于STC的下載在Linux平臺(tái)下面一直是一個(gè)老大難的問(wèn)題。我最近一段時(shí)間去ourdev網(wǎng)站,和數(shù)碼之家,包括有一些熱心人的協(xié)助。以及一些前人開(kāi)發(fā)的開(kāi)源軟件,類(lèi)似gSTC-ISP之類(lèi)的軟件。才讓我完全的搞懂了STC的ISP協(xié)議。
本文引用地址:http://m.butianyuan.cn/article/201611/323410.htm本文以GPL v3條款發(fā)布。但是切勿胡亂傳播。影響宏晶的利益。這個(gè)逆向工程做的并不妥當(dāng)。望宏晶包涵,畢竟你并未公開(kāi)協(xié)議。導(dǎo)致我們使用Linux的人痛苦不堪。
現(xiàn)在先放出用Gambas寫(xiě)的兩個(gè)ISP軟件。分別對(duì)應(yīng)89系列和12系列。15系列正在分析。別的系列因?yàn)椴怀S脮簾o(wú)協(xié)議。
SerialPortkSTC89-ISP
那么呢,我就先從STC89系列的講起。大同小異的。
STC89系列的單片機(jī)在上電的時(shí)候會(huì)執(zhí)行在ISP FLASH的ISP程序。只要在串口上收到連續(xù)的0x7f,便會(huì)進(jìn)入ISP模式。老姚選擇 0x7f的理由是里面沒(méi)有連續(xù)的低電平。這樣的話(huà)就可以讓單片機(jī)來(lái)調(diào)整自身UART的時(shí)鐘到計(jì)算機(jī)的時(shí)鐘,讓波特率同步。但是若頻率太高,則測(cè)不準(zhǔn)。所以啟動(dòng)波特率要控制在9600以下為宜。
而且均有時(shí)間限制。如果不在超時(shí)時(shí)間內(nèi)連接MCU。MCU會(huì)自動(dòng)斷開(kāi),跑用戶(hù)程序。這就是為什么某些芯片,類(lèi)似PL2303打開(kāi)關(guān)閉速度慢的芯片下載容易出問(wèn)題的原因。
切入正題:
STC的數(shù)據(jù)包格式為:
包頭 2BYTE+標(biāo)識(shí) 2BYTE +長(zhǎng)度 1BYTE +包類(lèi)型1 BYTE+數(shù)據(jù) nnBYTE+校驗(yàn)碼 1BYTE+包尾1BYTE。
包頭固定0×46,0xb9.(但是在信息幀中不包含包頭
標(biāo)識(shí)來(lái)自單片機(jī)的是68 00
而來(lái)自計(jì)算機(jī)的是6A 00
包尾固定0×16.
至于我這里捕獲的標(biāo)識(shí),在89系列里大概有
0×00 ——信息(注意,這里沒(méi)有包頭)
0×00 ——數(shù)據(jù)(這個(gè)是切換波特率以后的
0x8F ——新波特率實(shí)驗(yàn)
0x8E ——波特率正式更改
0×84 ——擦除芯片
0×80 ——校驗(yàn)返回
0x8D ——設(shè)置選項(xiàng)并且結(jié)束編程
0×80 ——(結(jié)束時(shí),上位機(jī))結(jié)束編程,通知MCU復(fù)位。
0×80 ——暫時(shí)未知(交互中的,不影響下載)
通訊的交互過(guò)程
PC =》開(kāi)啟0x7f MCU
MCU=》信息 PC
PC=》計(jì)算重載值,波特率測(cè)試 MCU(發(fā)送完立馬要切換波特率到計(jì)算值) MCU
MCU =》確認(rèn)波特率測(cè)試 =》PC
PC=》(切換回原波特率)波特率正式改變 MCU
MCU =》(切換到計(jì)算值)確認(rèn)
PC=》未知
MCU=》確認(rèn)
PC=》擦除
MCU =》 確認(rèn)
PC=》寫(xiě)入數(shù)據(jù)包
MCU =》確認(rèn)
PC =》設(shè)置選項(xiàng)
MCU =》確認(rèn)
PC=》退出編程
MCU =》返回。
校驗(yàn)和的算法就是除了包頭,包尾,校驗(yàn)和,其他統(tǒng)統(tǒng)加起來(lái),取低八位(STC89)或者低16位(STC12)。
—————————–大致的通訊過(guò)程如上,現(xiàn)在從信息幀講起—————————-
信息幀是類(lèi)似這個(gè)的信息(注意,沒(méi)有包頭):
68 00 3B 00 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 14 DA 43 43 FD F0 02 82 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 0A 16
其中數(shù)據(jù)部分的Byte 4 ~ 19均為測(cè)量PC的脈寬,而按照脈寬計(jì)算CPU的速度的公式為:
fOSC=脈寬 *波特率 * 12 /7,依次可以計(jì)算出MCU可以用的最高波特率。
后面的0×43 0×43代表MCU固件是4.3C.
緊跟的0xFD代表選項(xiàng)信息:
x x x x x x x x
8 7 6 5 4 3 2 1
3=需要短接P1.0/P1.1 才能下載 1=關(guān)閉,0=開(kāi)啟
6=ALE腳,0=P4.5,1=ALE
8=停止看門(mén)狗,1=復(fù)位關(guān),0=停電關(guān)
7=允許訪(fǎng)問(wèn)內(nèi)部AUX RAM,1=允許,0=不允許
4=下次下載擦DATAFLASH,0=開(kāi),1=管
5=時(shí)鐘增益,1=高,0=低
1=時(shí)鐘倍速,1=12T,0=6T
然后,PC需要計(jì)算出MCU最高可用波特率。但是這里STC89系列比較的奇怪。因?yàn)樵?1.0592M的晶振下,居然能跑到115200的波特率。但是用傳統(tǒng)公式計(jì)算。最多就57600.
似乎是倍頻再倍頻,也就是原來(lái)是/16的現(xiàn)在/8了。實(shí)在是奇怪。
PUBLIC FUNCTION Calculate_load(Baud AS Integer, Crystal AS Long) AS StringCrystal以HZ計(jì)單位12T函數(shù)DIM reload AS ByteDIM Baud0 AS IntegerDIM v AS Long使用12T模式,加倍STC超級(jí)波特率v = Baud * 32reload = Int(256 - (crystal / v) + 0.5)baud0 = ((crystal / 2) / (256 - reload) / 16)TRY calc_error = Abs((Baud / baud0) - 1) * 10000RETURN Chr(reload)END
看起來(lái)這個(gè)玩意的實(shí)現(xiàn)應(yīng)該是*軟件模擬的。但是具體的實(shí)現(xiàn)的話(huà)。我還是不清楚。畢竟現(xiàn)在老姚學(xué)聰明了。MOVC讀FLASH以外的地方均會(huì)導(dǎo)致復(fù)位……所以具體實(shí)現(xiàn)方式實(shí)在弄不清楚。
波特率實(shí)驗(yàn)幀的數(shù)據(jù)部分是
FF 重載值 00 00 06 等待回應(yīng)值 ISP定時(shí)常數(shù)
重載值的上面已經(jīng)貼出GAMBAS的計(jì)算方式。對(duì)于PL2303芯片這種打開(kāi)和關(guān)閉速度比較慢的串口,等待回應(yīng)值我喜歡用0xE0。因?yàn)榭梢栽诒容^快的速度下不出錯(cuò)。ISP定時(shí)常數(shù)推薦使用0×81。我測(cè)試到50M的外部時(shí)鐘都不出問(wèn)題。
然后PC必須在規(guī)定的時(shí)間內(nèi)切換到新的波特率上,等待MCU的回應(yīng)。
MCU的回應(yīng)PC的幀一模一樣,只是標(biāo)識(shí)和校驗(yàn)和有差別。
然后再次重復(fù)。只不過(guò)不發(fā)送ISP定時(shí)值。
接著一番交互以后:
1 | Sent:46B9 6A000C8002003601F0022116 |
2 | recv:46B968000680EE16 |
這一段代碼似乎是固定的。
PC就會(huì)向MCU發(fā)送擦除命令。很簡(jiǎn)單,直接順序發(fā)出去即可:
1 | 46B9 6A000D84023333333333332F16 |
然后接受到MCU的回應(yīng)后。發(fā)送ROM數(shù)據(jù)包:
ROM數(shù)據(jù)包的格式很簡(jiǎn)單
0×00(標(biāo)識(shí))+0×00 0×00(填充) +高八位地址+低八位地址+0×00+長(zhǎng)度(一般固定0×80,后面填充就OK了)+數(shù)據(jù)
然后MCU的回應(yīng)也比較簡(jiǎn)單:
1 | 46B968000780796816 |
0×80是標(biāo)識(shí)。
至于0×79就是寫(xiě)入的時(shí)候返回的校驗(yàn)和了。算法就是把上一次發(fā)送的數(shù)據(jù)部分用一次加法校驗(yàn)和。
循環(huán)到終點(diǎn),就發(fā)送設(shè)置選項(xiàng)命令:
1 | 46B9 6A000A 8D FD FF F4 FF F016 |
其中的0xFD君就是選項(xiàng)信息了。參見(jiàn)信息幀的介紹章。
等待MCU回應(yīng)后,發(fā)送退出幀讓MCU復(fù)位。執(zhí)行用戶(hù)程序。
STC89系列的先介紹到這里。
評(píng)論