(珠海市光聯通訊技術有限公司 OMS/軟件組,珠海 519030)
嵌入式系統(Embedded system)是一種“完全嵌入受控器件內部,為特定應用而設計的專用計算機系統”,根據英國電氣工程師協會的定義,嵌入式系統為控制、監視或輔助設備、機器或用于工廠運作的設備。與個人計算機這樣的通用計算機系統不同,嵌入式系統通常執行的是帶有特定要求的預先定義的任務。由于嵌入式系統只針對一項特殊的任務,設計人員能夠對它進行優化,減小尺寸降低成本。
Linux是類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統,用C語言寫成,符合POSIX標準的類Unix操作系統。
Linux是一款免費的操作系統,用戶可以通過網絡或其它途徑獲得,并可以任意修改其源代碼,這是其它的操作系統所做不到的。正是由于這一點,來自全世界的無數程序員參與了Linux的修改、編寫工作,程序員可以根據自己的興趣和靈感對其進行改變,這讓Linux吸收了無數程序員的精華,不斷壯大。
Linux內核的主要模塊(或組件)分為以下幾個部分:存儲管理、CPU和進程管理、文件系統、設備管理和驅動、網絡通信,以及系統的初始化(引導)、系統調用等。
本系統主機采用的是Linux嵌入式操作系統。
本系統由主機和從機構成,主機采用嵌入式Linux操作系統,從機為K20 MCU,主、從機之間采用I2C總線通信方式:

從機MCU型號是恩智浦MK20DN512ZVLL10-ND,自帶I2C總線接口和SCI接口(備用),通過I2C總線接口與主機通信;通過SCI接口可與PC機通信。
系統硬件I2C總線部分原理圖如圖1所示。

圖1 I2C部分原理圖
從機MCU firmware升級主要有兩種方法:通過PC和通過主機。
方法一:通過PC,該方法在沒有主機的情況下大量使用,技術成熟,本文不做詳細描述。
從機利用備用的SCI接口,通過PC按XMODEM協議升級下載firmware成功,驗證從機代碼和firmware升級包都正確。
升級包描述如下:

I2C從設備地址(1byte)FWDATA(6 bytes)0x20(1 byte)Data0……Data31
每包包長度為40個bytes=從設備地址+FWDATA的ASCII碼(不分大小寫)+0x20+Data0+……+Data31。
方法二:通過主機,系統主機通過I2C總線接口與從
機通信,在發送命令、接收數據等都正常的情況下,主機通過網頁界面、I2C總線通信對從機firmware升級,下載失敗,下面做詳細描述。
用示波器抓SDA波形,正確的和錯誤的SDA波形比較如下:
① 正常的波形是每個byte后跟ACK(即第9個SCK對應的SDA為0),正確波形如圖2所示。
② 從機接收升級數據包時,前8個bytes正常,每個byte后跟一個ACK,即Data0之前的地址、命令(FWDATA)等都正常,從Data0開始到Data31,不定某個位置開始出現NACK,直到stop前一直都是NACK,錯誤波形如圖3所示。

圖2 正確波形

圖3 錯誤波形
下面對升級失敗原因進行分析:
① 對不同主、從機I2C總線升級結果及波形對比結果如下:

主機S3C2440主機XA9S12從機DSP升級OK,波形如圖4-----------從機K20升級NO,波形同DSP升級OK,波形如圖5
②兩種升級成功的SDA波形比較及有關參數如圖4、圖5所示。
所采用的改進措施和改進結果比較如下:
① 改硬件上拉電阻,無效,方法如下:去掉從機I2C
總線上拉電阻(圖1的R24和R25),波形無改善,升級不成功;去掉從機I2C總線上拉電阻(圖1的R24和R25),并且短路圖1的U4芯片,波形無改善,升級不成功。
② I2C總線 通信速度由400 kHz降為100 kHz,升級不成功。
③ 配置主機SDA延遲時間(即SDA hold時間)由5clocks改為0,升級通過,但SDA建立時間仍為80 ns,SDA hold時間由200 ns變為100 ns,波形如圖6、圖7所示。

圖4 S3C2440&&DSP(SDA建立時間為80 ns)

圖5 XA9S12&&K20(SDA建立時間為460 ns)

圖6 SDA延遲5clocks(SDA hold時間為200 ns)
④ 增加SDA建立時間,修改后SDA建立時間由80 ns增加到180 ns,滿足I2C總線 datasheet要求,針對上述第3條兩種配置,升級都成功。
參考s3c2440A白皮書(圖8)以及K20 白皮書(圖9)。

圖7 SDA延遲0clocks(SDA hold時間為100 ns)

圖8 s3c2440A白皮書部分

圖9 K20白皮書部分
主機代碼做了如下修改,升級成功,I2C總線接口時序符合標準:
① 修改函數static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat),增加ndelay(1);//等待建立時間
② 增加ndelay(5)后,SDA建立時間為580 ns,波形如圖10所示。


圖10 增加ndelay(5)后波形圖