2011年11月29日 星期二

USB HID 技術散記(四)--- SiLabs MCU Flash

一般來說:如果MCU 要做到所謂的ISP(In-System Programming) 功能,

大部分MCU本身都需要含有所謂的Boot Code ...再利用這個Boot Code 來完成

程式的下載、更新功能。當然啊,MCU 本身也是需要為Flash Based 的才行。

所以,當我拿到SiLabs MCU 在用時,就發現他的基本ISP 功能並沒有所謂的

Boot code (如果您是要自己做一個UART 介面的ISP 的話,那當然要自己寫一支

屬於自己的UART ISP 的Boot Code ... 這一部份SiLabs 的相關技術文件也有說明與範例!)

而一般晶圓廠標準的 Flash 最小容量單位為512 Bytes, 很明顯的 ...在SiLabs 的MCU

規格中:譬如C8051F300 的Flash Size 為 8KBytes,但實際上,User 可以用的空間

還要減去 512 Bytes...實際上也只能使用 8192 - 512 Bytes 而已。

所以,讓我可以強烈的質疑:他在他的Flash 中的最後一個Page (512 Bytes) 拿來擺了

他們自己C2 介面的ISP 功能的Boot Code...當然,他們的MCU使用手冊也提到:

我們一般User 不能直接利用Code Access (就是movc或Flash ISP 中的movx 指令)

來讀取這一個Page 的資料內容,一旦您使用這些指令來讀取的話,就會造成

MCU 系統的重置(Reset)。...當然用C2介面不在此限。(您用C2指令讀取的話,

您讀到的事保護的 00 碼...但不會發生Reset,廢話,因為在C2 介面下MCU 為Reset 狀態!

--------------------

OK ...這是我們從原廠資料文件所得到的訊息,但真的如此嗎?!有人真的去試過嗎?

我最近因為使用了他的USB MCU就是發生一個奇怪的現象,就不得不更加深我當初的質疑。

我們先來看 C8051F321 這一棵USB MCU 的Flash 的文件資料:

嗯一如往常的,它也是保留了最後一個Page ,不留給User 使用的。

然後,他的保護位元碼是擺在 0x3DFF 的位置。當然這個位置也不能Access 的。

我想一般User 就算用原廠提供的燒錄程式,應該也沒多少人會真的留意到這個問題吧。

好了,好死不死我自己就是有改寫一支我自己方便使用的燒錄程式:

方便我用來檢查燒錄結果用的。大家可以從上圖可以讀到IC 編號為C8051F321。

好了,我們就可以真正的讀出燒錄後的結果了:

果然可以發現在0x3E00 後,就如同保護機制一樣,我們只能讀到 0x00 碼而已。

但是黃色部分卻也是0x00 碼啊?!那是不是我們又被拗了 32 Bytes 了?!

但原廠的資料明明跟我們說是到0x3DFE (其中0x3DFF 為保護機制碼!)。

----

好吧,這個問題就得回到基本的Code Access 方式來實驗了,我們就來寫一支簡單

Code Access 範例小程式,來讀這一段的 Flash 情形:

我們利用程式把本身最後一段的Flash Code 透過UART 的Printf 到超級終端機上:

我們卻發現:其實,我們還是可以Access 到 0x3DFF 的啦。但一旦Access 到最後一個

Page 時,的確 MCU 就會被系統硬體給 Reset 了...所以才會一直出現重覆的Printf 內容。

我們也可以拿來跟C2 的介面所讀到的內容作比對...答案是一樣的。

只是不知為何C2 讀到 0x3DE0 ~ 0x3DF0 都為 0x00 值呢?!這是比較詭異的地方。

-----

所以,根據這樣子的實驗與推論,我還是認為 SiLabs 還是利用Falsh 最後一個Page

拿來作為C2 ISP 功能的Boot code 空間。

當然如果:您用的是大容量 Flash MCU ,少這一個Page (512 Bytes) 沒差。

但如果您是用那一種只有  2K/4K 或是8 K 的Flash MCU 來說,這512 Bytes 確實不小。

----------------

後記:以前我自己也參與開IC 也玩過MCU...以前都認為好像自己開IC 好像比較有競爭力,

也好像蠻好賺的...但是,後來就覺得越來越辛苦,因為要真正把一棵MCU的架構

與使用環境搞到順順利利的經得起像我們這一種老鳥玩家的摧殘的確都不容易。

您不要以為人家跟您說:他的MCU 是8051 Compatible ,您就相信他的MCU

就是8051 ...以前我玩的那一個掃描器SOC也是以一個 8051 為核心啊...

我們搞系統搞了兩、三年之後,明明都已經快量產了,卻被我那『賤手』玩到

他的Timer2 是跟標準8051 Timer2 不一樣...您知道8051 Timer0/Timer1/Timer2

的使用模式有多少種?!彼此之間還不一樣呢,我們搞系統跟做IC 設計反應,他們還

不相信...因為他們也是拿別人給的,他們又不像我們玩系統這麼精...而且已經花了多少

光罩費用了,這時要他們承認這一點,情何以堪啊?!當然打死不相信,結果:

我們搞系統的就是有辦法,在系統上利用不到五行的組合語言呈現系統問題,

他們當然只有不到五行指令就可以跑模擬程式了...果然,證明這一點!當然倒楣的也

不是他們,是另外一家賣 8051 IP 給我們的人...後來這家公司也不敢再賣8051 IP 了!)

所以,現在台灣許多開IC 的公司...到最後才不得已得自己找人跳下來順便幫客人做

系統應用設計。否則,一棵新架構IC 要歷經多少程式歷練才會真正被認為是一棵

公認的好IC 。過去,像這一種MCU 種類或家族不多,客戶選擇也少,當然不得已

就得陪您原廠慢慢的 Debug ...但現在滿街都是這樣子的產品,我自己本身就不想再

花這一種時間幫原廠抬轎了。因為我還根本不知道一棵新的IC 或MCU 您還可以

存活市場多久?!...您說像SiLAbs 或是台面上的這些MCU廠就比較好賺嗎?!

差別只是因為他們做得早,許多類似我碰到的這一種問題,他們大概也都碰過了。

而且有許多既有的產品線的MCU 大概也都累積了龐大的市場經驗...

我想原廠也沒有投多少人力物力在維護這樣一棵IC 了,剩下的就我常說的:

就算公司剩下老闆,幾個不懂技術的助理...接接訂單,再轉包給相關的代工廠

投片生產,人家也可以活得很自在,所以,我也常常勸勸那些很『衝動』又有點

『激動』的工程師或PM...就不要動不動急著想自己開IC,錢太多嗎?!

現在就算您會IC ~也算您功力深厚,運氣很好(指的是只要幾個光罩就大致OK了!)。

您的毛利也不會好到哪裡去的...您相不相信呢?!

您還不如像我這樣子,好好的靜下來,好好的把一個系統應用的諸多眉眉角角搞清楚

一點,好好的把一棵MCU 適才適用的導到一個應用領域是比較實際的。

我跟您說:搞不好,還會有一大堆搞MCU的通路商抱著他們家的MCU 來求您用呢!

您說:是不是啊?!....

2 則留言:

  1. =D> ~說的很好~真的如你所說的這樣~果然是前輩的一段良言~

    回覆刪除
    回覆
    1. 您說的是指哪一段話?!
      系統應用呢?!還是指那些搞MCU 廠的?!難道您也是在MCU 廠?!
      不是我說得好,而是有沒有人想真的去面對問題,來講出心裡的話。
      有許多國內MCU 廠,都是難道、否則...要我怎麼辦?!
      我們就只會搞MCU IC 設計而已啊!唉~ [-(

      刪除