由於要調查安裝tool-chain的版本, 我想要知道以安裝的cygwin版本
只要輸入下面其中之一個指令就可以得知版號囉!
cygcheck -c
可顯示所有Cygwin中安裝的軟體的版本
cygcheck -c cygwin
顯示當前Cygwin的版本
uname -a顯示Kernel資訊, 也會顯示該Cygwin的版本
(使用cat /proc/version的結果與uname -a一致)
由於要調查安裝tool-chain的版本, 我想要知道以安裝的cygwin版本
只要輸入下面其中之一個指令就可以得知版號囉!
cygcheck -c
可顯示所有Cygwin中安裝的軟體的版本
cygcheck -c cygwin
顯示當前Cygwin的版本
uname -a顯示Kernel資訊, 也會顯示該Cygwin的版本
(使用cat /proc/version的結果與uname -a一致)
台灣Yahoo!關鍵字工具的網址是:
http://tw.emarketing.yahoo.com/ysm/guide/index101.html
關鍵字查詢Google最近熱門搜尋
http://pagerank.tw/google-suggest/
關鍵字查詢Bing最近熱門搜尋
http://pagerank.tw/bing-suggest/
我們之前最常提到git
而git也真的很好用, 但是並非所有客戶都希望使用Git
現在客戶要用perforce這套版本控制軟體
開始研究一下吧!
—————–
官方網站:
http://www.perforce.com/downloads
教學文章:
http://www.weithenn.org/cgi-bin/wiki.pl?Perforce-Version_Control_System
標題下得很像現在訪間的書名
感覺好像很強, 但是其實就是一些小技巧而已啦
我們寫程式的工程師, 需要好用的工具來管理程式碼
當然很多不錯的軟體工具,
比較知名的有 “source insight“, 我以前在Linux平台上用過覺得很不錯
.
現在新發現一個小巧工具軟體也很好用
大家可以試試看- “PSPad” (免費軟體)
1) 由資料夾設定專案位置, 以及收錄檔案
2) 更新與同步
javascript 開啟視窗後,
自動關閉且原本父視窗重新整理<script type="text/javascript">
function refreshAndClose() {
window.opener.location.reload(true);
window.close();
}
</script>
你在寫javascript 開啟視窗或其他動作
可能會發生這類的錯誤 : [object window]或 [object]錯誤
原因來自於回傳值
解法之一, 也是比較快的
就是將你的javascript函式加上void()
<a href="javascript:void(window.open('doc3.htm', '', 'width=100,height=200,scrollbars=yes,resizable=yes'));">
使用cygwin當作你在windows環境裡的unix-like介面, 如果遇到指令執行錯誤,像是python太舊的問題, 這裡有個workaround的方式提供~
1,錯誤發生:
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
2. 分析一下是否環境變數路徑順序的問題Vincent@VINCENTC_PC /cygdrive/d/codebase
$ python --version
Python 2.6.5
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ which python
/usr/bin/python
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ echo $path
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ echo $PATH
/usr/local/bin:/usr/bin:/cygdrive/c/Perl/site/bin:/cygdrive/c/Perl/bin:/cygdrive/c/Program Files/ARM/bin/win_32-pentium:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windows/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/c/Program Files/Microsoft ASP.NET/ASP.NET Web Pages/v1.0:/cygdrive/c/Program Files/Windows Kits/8.0/Windows Performance Toolkit:/cygdrive/c/Program Files/Microsoft SQL Server/110/Tools/Binn:/cygdrive/c/Program Files/ARM/RVCT/Programs/4.1/713/win_32-pentium:/cygdrive/c/Program Files/ARM/RVI/Tools/4.2/39/programs/win_32-pentium:/cygdrive/c/Program Files/ARM/RVD/Core/4.1.2/38/win_32-pentium/bin:/cygdrive/c/Program Files/ARM/Utilities/FLEXlm/10.8.5.0/1/win_32-pentium:/cygdrive/c/Python27:/cygdrive/c/Program Files/Microsoft Visual Studio 11.0/VC/bin:/usr/lib/lapack
(看得出來cygwin創建的環境變數/usr/local/bin:/usr/bin優先於我自己安裝的新版/cygdrive/c/Python27)
3.備份舊版python, 讓系統找到後面環境變數裡的指令python
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ mv /usr/bin/python /usr/bin/pythonBAK
Vincent@VINCENTC_PC /cygdrive/d/codebase
$ which python
/cygdrive/c/Python27/python
4. Build OK
Bluetooth 就是 networking.proximity
Bluetooth support is available to Metro style apps through the proximity APIs. There is no other method to do this from a Metro style app.
A: 有on/off吗
A: 看來沒有@@
A: 如果先打開的話 應該都可以測吧
B: 我剛有看一下
B: 他有兩個API
B: 寫在initialization
B: 可能是on/off
private void ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)
{
WriteMessageText("Proximate device arrived. id = " + device.DeviceId + "\n");
}
private void ProximityDeviceDeparted(Windows.Networking.Proximity.ProximityDevice device)
{
WriteMessageText("Proximate device departed. id = " + device.DeviceId + "\n");
}
B: 對呀 應該按照她寫的範例 initial 就可以打開BT功能
A: Bluetooth support is available to Metro style apps through the proximity APIs. There is no other method to do this from a Metro style app.
A: 那這句話又是甚麼意思
B: 就是 Bluetooth在 Metro裡面, 可以透過proximity API來實現~ 除此之外沒其它API 可以實現BT
B: 所以 當device 在BT的感測範圍內或外
http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.proximity.proximitydevice.aspx
B:
The ProximityDevice class has these events.
Event Description
DeviceArrived Occurs when a device enters the proximate range.
DeviceDeparted Occurs when a device leaves the proximate range.
A:
PeerFinder
Enables you to discover another instance of your app on a nearby device and create a socket connection between the peer apps by using a tap gesture or by browsing.
A: 先叫他由設定打開 然後進來測 我只要叫他去找 找的到我就算ok
B: 找得到就表示metro app是work的
我使用allegro通常都只有基本功能
由於我不是HW工程師 我是寫軟體的
所以通常只想知道:
幾個步驟看硬體線路與symbol位置 – Allegro
上一篇文章我安裝了msysgit, 可以在windows平台使用git
但是遇到一些中文編碼的問題!
1) git bash介面底下:
经常会碰到有一些中文文件名或者路径被转义成\xx\xx\xx之类的,
此时可以通过git的配置来改变默认转义具体命令如下:git config core.quotepath false
2) git history (gitk) 的內文可以顯示中文git config --system i18n.logOutputEncoding gbk
git config --system i18n.commitEncoding gbk
原理:强制log统一使用utf-8编码。
1.在 etc\gitconfig 中添加:[gui]
encoding = utf-8
[i18n]
commitencoding = utf-8
logoutputencoding = gbk
说明:
2.使得 $ git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 etc\profile 中添加: export LESSCHARSET=utf-8
Ref:
msysGit的shell环境中无法输入中文的,想要输入中文,我们需要修改下配置文件/etc/inputrc。
步骤1:进入git安装目录,找到/etc/inputrc;
步骤2:修改配置项找到如下配置代码
set output-meta off
set convert-meta on
修改成
set output-meta on
set convert-meta off
步骤3:关闭git bash然后再重启
就可以在shell环境中输入中文了
之前我就在思考如何管理程式碼,因為程式碼很重要
如果使用一個有效率的管理機制的話,就可以跨平台的使用
畢竟現在平台有可能是Linux或是Windows,或更多作業系統~
–
上次我把程式碼管理透過一台Linux主機
我滿喜歡這樣管哩, 滿方便的! 但是現在這台主機可能必須還別人
下次可能要重新設置在另一台Linux主機~ 有點麻煩
–
雲端工具 Dropbox
所以我把腦筋動到了雲端工具 Dropbox
索性google了一下關鍵字: “Dropbox git”
沒想到真的有人跟我有一樣的想法, 透過dropbox管理程式碼
我的作法
類似這篇文章, 在Dropbox上建立Server端原始碼的repo git,讓個平台再重dropbox上作git clone到client端
root@ROOT-PC /C/Users/root/Dropbox/project$git clone file://git@127.0.0.1/C/Users/root/Dropbox/git/project.git
不過我有點不一樣
就是我連client端都是在dropbox資料夾裡面
主要這樣作是因為我的程式碼都是HTML,PHP的網頁文字檔而已
若以後的程式碼需要被編譯, 我就會跟這篇文章一樣
步驟
(假設程式碼已經放入資料夾 ~/Dropbox/project裡)在Dropbox上建立Client端:~/Dropbox/project $ git init~/Dropbox/project $ git add .~/Dropbox/project $ git commit -m “first commit”~/Dropbox/project $ cd ~/Dropbox/git--在Dropbox上建立Server端:~/Dropbox/git $ mkdir project.git~/Dropbox/git $ cd project.git~/Dropbox/git $ git init –bare~/Dropbox/git $ cd ~/project--將Client端的資料push到Server端:~/Dropbox/project $ git remote add origin ~/Dropbox/git/project.git~/Dropbox/project $ git push origin master
在Linux平台:
使用就是透過git指令, ex: git status, git commit, git push, git log …
在windows平台:
我使用這工具msysgit,
可以方便你在資料夾按右鍵就選git bash執行git指令
參考自 http://www.mrmu.com.tw/2011/05/06/git-tutorial-for-beginner/
作為一個X86的工程師, 基本的晶片各自負責的工作都要知道一下, 還有使用的bus prototype等等, 有點不同於SOC處理晶片幾乎全包了, 在X86處理器通常會有北橋與南橋協助處理週邊高速與低速裝置! X86系統的生態, 處理器彼此如何溝通呢? 我本來以為就CPU管全部的devices/components, 後來我發現我錯了, CPU主要只管邏輯運算那塊, 其他的周邊裝置是南北橋管的! 突然覺得跟人體很像, 應該說電腦當初的設計就是根據人類的構造去發想的吧, 大腦負責運算思考小腦 …脊椎 … / CPU..北橋..南僑..EC

也就是CentralProcessingUnit的縮寫。CPU是驅動整個電腦運作的中心樞紐,又稱電腦的心臟,其內部包括控制單元、算術及邏輯單元、暫存器或記憶單元。當電腦系統開始運作時,CPU從記憶體內,讀取操作它的軟體的指令與資料,透過ALU運算出結果後存回記憶體,同時由主機板,與外界的I/O週邊溝通,達到資料處理的目的。CPU會因其硬體架構如資料/指令格式、分配、解碼、介面與運作方式的不同有差異,而且用途也可能不一。
CPU基本架構:
CPU內部較重要的暫存器:
北橋是主機板上最重要的晶片,主要是控制CPU、記憶體、AGP或PCI-E×16插槽(顯示卡專用)等設備的高速整合晶片,其傳輸速度可達每秒數GB來計算的,比如CPU(8~10 GB/s)、記憶體(8~10 GB/s)、顯示卡(8 GB/s),與南橋晶片兩顆合稱晶片組,越高級的北橋晶片支援的CPU、記憶體的頻率越高(例如圖中P35晶片支援最高到FSB1333,超頻可上1600、且支援雙通道架構的DDRII 667 800,超頻可上1066)
和北橋互連並連接其他週邊,我們熟知的主機板「功能」大多來自南橋,南橋連接慢速週邊,傳輸速度以每秒數MB來計算,例如硬碟(375 MB/s)、USB(60 MB/s)、PCI(133 MB/s),例如鍵盤滑鼠、印表機、USB、網路、音效、SATA/IDE硬碟。
為什麼要分南北橋?
南北橋是主機板上最主要的晶片,通常是上游晶片組廠商(NVIDIA、AMD、Intel)賣出晶片,下游板卡廠(華碩、技嘉、微星等等)再做成主機板,某些極少數的主機板是由晶片組廠商自行生產,再以完整的板子賣給下游板卡廠去出貨。
先來一張之前用過的晶片組簡易架構圖:
為什麼要分成北橋和南橋?這主要是兩個考量:設計和製造。就晶片設計的角度,如果要讓東西溝通的速度越快,那就讓它們越靠近越好,只要一分離,勢必就得拉出傳輸的通道,而有通道就要佈線、就有傳輸的延遲。如果可以的話,最好是把所有功能全部塞進一顆晶片內,可是必須考量到晶片製造的難度,廠商一定想賺錢,如果設計出一顆根本生產不出來、或太貴沒人要買的晶片也沒用。
北橋和南橋就是在這樣的取捨下分離,現在晶片組搭載的功能超多,而且很多週邊的速度太快,很難在一顆晶片內搞定,所以就讓需要高速傳輸的功能靠近CPU,並獨立成北橋晶片,而其他較慢速的週邊就變成南橋來連接北橋,與CPU做間接傳輸。
當然,整合南北橋變成一顆晶片是絕對是可行的,只要設計和製造難度允許,很多廠商都出過單晶片的產品,但通常是AMD平台或功能較少的入門晶片組,因為花樣少、製造難度較低,做成單晶片會有利於降低成本。
南北橋的功用
我們先以最標準的Intel的南北橋架構做解說,特別的案例最後再聊。這部分免不了要看晶片組的架構圖,別太緊張,其實看架構圖會比看實際的板子更容易了解晶片組的設計,只不過是一些PowerPoint的方塊圖而已

Intel P35晶片組的架構圖,這是非常標準的南北橋設計,由P35北橋加ICH9南橋,旁邊都有標上通道的速度,可明顯看出南橋連出去的週邊都比北橋慢。
北橋所連的都是高速傳輸的週邊,包括CPU、記憶體和顯示卡,也就是電腦最核心的三項零組件,只要其中有一項產品出現大改的新規格,相對應的北橋就一定要出新版,而換北橋就是出新的主機板,換主機板差不多就是砍掉重練整台電腦,也就是大家常說的世代交替或敗家升級了。
基本上,北橋可視為一堆通道的集合體,有專屬的通道連往CPU、記憶體、顯示卡和南橋,透過北橋這個轉運中心,CPU就可接收和送出資料給所有電腦週邊。
1.CPU通道
北橋和CPU連接的通道就是Intel的FSB或AMD的HyperTransport,在CPU的章節已經提過很多次,這是CPU對外的溝通管道,也就是和北橋連接,進而與所有週邊溝通。很直覺的,CPU和北橋的FSB和HyperTransport,兩邊一定要配對才能使用,或是北橋支援的FSB/HyperTransport速度要高於CPU的,也就是新主機板能向下相容舊CPU,但舊主機板不一定能向上相容新CPU(注意是不一定,例外到處都有,能不斷向上相容的板子很多,台灣板卡廠RD太強了)。
CPU每隔一兩年,對外的FSB或HyperTransport的速度就會提升,自然就會有新的北橋出現與它搭配,比如AMD最近要推新的AM2+ CPU,支援HyperTransport到最新的3.0版,時脈達2GHz(之前的是1GHz),AMD就推出新的RD790北橋來搭配。除了CPU與北橋之間的通道要匹配之外,當然還有CPU腳位的問題,如果CPU更改傳輸腳位的定義,主機板上的北橋通常也要更新或修改才能支援。
2.記憶體通道
北橋另一個重點是記憶體控制器,直接決定支援的記憶體種類和時脈,時脈的部分,就是由CPU的外頻,乘上北橋裡控制器內附的比值,計算出記憶體時脈。比如CPU的外頻是266,北橋設定的比值是1:1.5,那記憶體的真實時脈就會是266×1.5=400MHz,DDR之後就是800MHz。這個比值有很多種,計算方式也不一定都是這樣,但無論如何,都是由北橋的記憶體控制器來決定算法和時脈。至於記憶體種類,北橋通常只會支援一種記憶體,比如現在主流的DDR2,但在世代交替的當口,就會出現同時支援兩種記憶體的北橋,以緩和世代轉換的陣痛,像Intel現在正要推行DDR3新規格,P35/X38晶片組就同時支援DDR2和DDR3。
3.顯示卡
顯示卡是近幾年才變成高速週邊的,當它開始需要大頻寬時,北橋其實並沒有對應的匯流排可用(PCI的每秒133MB頻寬太慢了),所以才會有AGP的出現。AGP是專門給顯示卡用的擴充「埠」,它是一對一的通道,不是匯流排,北橋內建一個AGP埠就只能插一張顯示卡。由於AGP限制太多,所以現在都改用PCI-Express,希望可以統合PCI和AGP,做為擴充卡的匯流排單一標準。不過結果大家都看的到,AGP是差不多淘汰了,但PCI還活的好好的。PCI-Express的設計是以Lane為主,每條Lane就像一條獨立車道,雙向頻寬是每秒500MB,北橋會支援一個固定的Lane數,但可自由調配組合成寬度不一的道路。比如NVIDIA MCP55支援PCI-E Lanes x28,當插一張顯示卡時,就可以用PCI-E x16的速度,插兩張顯示卡時就變x8加x8,剩下的12 Lanes,可以再分成x8、x4、x1等不同數目的插槽,給不同的擴充卡週邊使用。
另外,一些低階的北橋產品也會直接內建顯示晶片,當然,在設計與製造成本的考量下,內建顯示晶片通常就是拿來「顯示」而已,3D能力絕對比不上同一個世代的獨立顯示卡,不過針對它所在的定位,只要能顯示畫面就很夠了。
4.包山包海的南橋
相對於北橋都是高速週邊,南橋就是比較功能面的,除了以上那些核心零組件之外,其他都是放在南橋,比如PCI插槽、IDE/SATA硬碟介面、大家一定用過的USB、AC97或HD Audio音效和10/100/1000網路,如果板卡廠願意,還可以另加晶片和南橋連接,讓主機板的附加價值更高,比如快閃記憶體(ReadyBoost)、無線網路、IEEE 1394、RAID晶片……。由於南橋晶片的獨立性和它所控制的功能面,晶片組廠商都會讓一顆北橋搭配不同的南橋,做出不同定位與附加功能的晶片組產品。
雖然現在晶片組的南橋都已經包山包海,但廠商為了增加附加價值,可能自己還會在主機板外加晶片,塞進更多功能,比如這顆VIA VT6308P就是讓主機板多出IEEE 1394功能的晶片。現在的南橋都有內建音效,但那只有「數位音效處理」,要讓主機板可以直接發聲,必需把數位音訊轉換成類比輸出,才能連接耳機或喇叭,而這個數位/類比的轉換晶片,南橋通常不會內建,所以主機板都會有一顆類似照片中「ALC888T」的Audio Codec,負責轉換成類比輸出,或是顛倒過來,把類比轉成數位做出錄音功能。南橋的網路功能通常只有提供MAC,做為網路數位資料的傳輸功能,但要真正支援實體網路線的電子訊號傳輸,還要另外再加網路PHY晶片,比如照片中的RTL811B。
水銀電池是系統BIOS的主要供電來源, BIOS(黃圈處),是主機板內建的「系統軟體」,用來辨識主機板上的各式裝置,調整各種設定,再交給作業系統啟動,BIOS是開機過程中的第一步,BIOS辨識完畢之後再給作業系統接手。BIOS軟體通常放在一個很小的Flash ROM儲存裝置(可以刷BIOS更新內容)。
BIOS 是被固定在電腦主板上的ROM晶片中的一群組程式:
(引用出處) 其主要功能是為電腦提供最底層的、最直接的硬體設定和控制。BIOS設定程式是儲存在BIOS晶片中的,只有在開機時才可以進行設定。CMOS主要用於存儲BIOS設定程式所設定的參數與資料,而BIOS設定程式主要對技巧的基本輸入輸出系統進行管理和設定,是系統執行在最好狀態下,使用BIOS設定程式還可以排除系統故障或是診斷系統問題。 準確地說,BIOS是硬體與軟體程式之間的一個「轉換器」或是說是接口(雖然它本身也只是一個程式),負責解決硬體的即時需求,並按軟體對硬體的動作要求具體執行。
BIOS分為三大功能:
之前寫了一篇在windows底下設定putty的方法, 熟悉windows的人應該會知道registry是windows重要的設定方式
今天學到一個小技巧,可以匯出registry設定檔
修改某一部分之後,再重新執行就可以將windows作業系統裡的registry修改完畢
.
按右鍵>匯出 (改完之後再執行該檔案即可匯入)
i2c-smbus-difference.pdf
https://docs.google.com/open?id=0B7Hc2mvu-wI_eFROSzVUZzVqbkk
I2C信號的原理與解碼
https://docs.google.com/open?id=0B7Hc2mvu-wI_ZWZmYWY4MWQtN2Q1MC00YmMwLThhN2YtODExNTgwODk0ZWY3
| 深入I2C匯流排 解決多重主控端所引發之各種問題 |
| 新通訊 2005 年 8 月號 54 期《 技術前瞻 》 |
| 文.陳乃塘 |
| 相信從事產品規劃或是工程人員,或多或少在元件規格中會見到I2C介面的存在,也許也見過SM-Bus,兩者究竟有何差異?兩造的內在又是如何,相信是很多人想去知道的事情… |
| 相信從事產品規劃或是工程人員,或多或少在元件規格中會見到I2C介面的存在,也許也見過SM-Bus,兩者究竟有何差異?兩造的內在又是如何,相信是很多人想去知道的事情。一個歷經時間打不死的介面,必然有其前因與後果。有不少場合,I2C介面也被寫成I2C介面,是指向同樣東西。 回首1980年代初期,飛利浦半導體為了積體電路內部的連接方便,發展了兩線式(2 Wire)的雙向介面,當時將之稱作「Inter-IC」介面,簡稱I2C介面或I2C匯流排,原本的目的是為了在電視機內部讓處理器CPU晶片與周邊晶片更容易連接。我們都知道嵌入式系統的設計,連接到MCU控制器的周邊裝置往往用記憶體映射的I/O處理方式,換句話說,在線路板上的微控制器必須連接一堆的位址信號線(Address Bus)與資料信號線(Data Bus)。不用多說,必要的位址解碼線路以及額外的邏輯線路是跑不掉的,這一點對於像電視機、錄放影機或音響機器在大量生產的時候,是很不利的一面,至於多條控制線引起額外的副作用,好比說電磁干擾EMI等,也是惱人的問題。 飛利浦為了克服這個問題,座落於荷蘭Eindhoven的實驗室,最終發展出I2C介面。由於容易使用,讓積體電路之間的控制更為有效率。此介面逐漸成為產業上一個泛用的標準。目前,該公司有超過1,000種以上的元件,諸如控制器等都內建了此介面。同時,I2C介面也授權給很多知名公司使用,好比說Xicor、ST Microelectronics、英飛凌、Intel、TI、Maxim、Atmel、Analog Devices等。 意思是說,只要在晶片上納入了I2C介面,元件之間就可以直接透過該介面來彼此溝通,尤其是設計數位控制電路的時候,這個介面或許可以幫您解決不少問題。 I2C匯流排的基本傳輸協定 從信號的實質面來看,I2C介面僅包含了兩條主動信號線以及一條地線,這兩條主動信號線分別是「SDA」與「SCL」,兩者皆是雙方向的傳輸信號線。 ‧SDA=Serial DAta line ‧SCL=Serial CLock line 每一個連接到匯流排上的元件裝置,無論是MCU控制器、LCD驅動器或ASIC,都會擁有其唯一的位址,依據功能上的差異,每一個元件可以是傳送端或是接收端,比如說,LCD驅動器僅僅是接收端,而像一些記憶體晶片或是I/O晶片很可能是兩者具備。 正如同一般匯流排的慣例,啟動資料傳輸的一方稱之為主控端(Bus Master),非主控端的元件就是從屬端(Bus Slave),有趣的地方是,I2C介面可以是隸屬一個多重主控端(Multi-Master)的匯流排架構。 通常,微控制器MCU總是扮演著主控端的角色,如果微控制器要送資料到某一個從屬端,首先,微控制器會送出「起始」(Start)的狀態,有如告知所有連接元件的注意信號,介面上的元件就要留意有資料即將到來,接著,主控端送出要存取元件的位址,以及讀取或是寫入的資訊,若接收元件獲知是自己的位址,就必須回應認可(Acknowledge)信號,若是位址事不關己則不予理會。 一旦微控制器MCU接收到認可信號之後,才開始傳送接收資料,當完成資料傳輸之後,微控制器MCU送出「結束(Stop)」狀況,也就是表示將介面釋放出來,其他的元件可以起始新的動作。若是就介面的狀態來說,介面有起始狀態(Start)、位址狀態(Address)、認可狀態(ACK)、資料狀態與結束狀態(Stop)。 I2C匯流排的硬體結構 誠如前面所言,SDA與SCL皆是雙向的信號線,通常,這些信號採用開集極(Open Collector)或開源極(Open Drain)的技術。當介面處於閒置(Idle)狀態,介面信號線就呈現邏輯高(Logic HIGH)狀態,因為外部往往接一個拉高電阻,當驅動信號到介面時,晶片會驅動其輸出電晶體,將介面拉到邏輯低狀態。 不過,開集極的技巧也有一個缺點,假若介面長度太長時,因為長距離的介面在輸出驅動器上會呈現電容負載(Capacitive Load)的效應,速度會落下來(圖1)。因為,拉高電阻是被動式元件,與電容器C會產生RC常數,而影響到信號波形的外觀,當RC常數越大時,會影響到信號的迴轉率(Slew Rate),而將速度拉下來。當到了最壞的情況下時,介面上的積體電路甚至難以分別究竟是邏輯一還是邏輯零的信號狀態,信號動作自然出問題啦! 還有一個令人困擾的問題,就是當信號快速的時候,信號反射引起的負效應也是令人難以忍受的問題(圖2)。通常,IC的輸入端會用舒密特觸發(Schmitt Triggers)的電路型態,但是,嚴重的時候也難以克服這道難題,因此在電氣特性的規定就需要更為嚴謹。為了解決該問題,飛利浦半導體發展出主動式終端阻抗(Active Terminator)的方式(圖3),這種元件會包含有一對電荷幫浦(Charge Pump),您可以將其視為介面上的一個動態阻抗,如此措施的好處就是可以很快速地將寄生電容充電,一但電壓高過某個位階,高電流模式就會火速切斷輸出電流。 請仔細看圖3,只要介面維持在邏輯低的時候,電晶體C是開著,這時候由於電晶體B的柵極(Gate)也維持在低電位,因此電荷幫浦就會被關閉。 只要元件晶片釋放出匯流排,電晶體A與電晶體C就會關閉。電容將從四個電阻汲取電流開始充電,當電阻2的電壓降將會開啟電晶體B,將電阻3短路。由於電阻3的數值很小,電流上升。但很快地,電晶體B的柵極(Gate)與源極(Source)將不足夠維持開關開起,開關關閉之後,電流注入停止,這個時候就僅有外部的拉高電阻存在來克服介面上的漏電流(Leakage)問題。 I2C介面的使用仲裁議題 I2C介面是一個多重主控端的匯流排,也就是有機會多個元件會激發傳送,如果在系統上僅有一個主控端,並不會發生什麼資料毀損的風險,除非從屬元件發生了狀況,但是若有兩個以上微控制器存在的場合,情況就可能改觀了(圖4)。 就如圖4,首先當微控制器1送出起始狀態後並送出位址資訊,此時所有的從屬元件,包括微控制器2都在等候,只要位址並不是指向微控制器2,該元件就會抑制任何活動,直到介面匯流排在停止狀態後回到閒置(Idle)的狀態。 當然只要該兩個微控制器的介面監視機能電路做得好,對於介面上的活動瞭若指掌,基本上並不會有問題產生,但是畢竟這是指理想的情況下而說的,意外的人生也同樣會發生在介面上。我們就姑且假設某一個微控制器未察覺到起始狀態,因此它依然會以為介面是處於閒置狀態,而打算開始使用介面,此時,問題就可能跟著來了。 因為,基本的疑問就是您如何知道有其他元件正在介面上傳載資料。幸好,介面的結構是「Wired AND」的型態,也就是說,只要有一個元件驅使在邏輯低,信號線就會維持在邏輯低,因此,您可以測試介面是被佔用還是閒置狀態。 當某一個主控器改變了信號狀態到邏輯高的時候,它必須去檢查是否信號線真的跑到邏輯高,萬一信號線卻呈現在邏輯低的狀況,這就表示著介面是被佔據掉,有其他元件將信號線拉低。 因此,通用的經驗法則是如果主控器並不能確定信號線確實拉高,寧可先放棄(Back Off)等候,到看見停止狀態的出現才開始傳送。 接著,我們來談談資料崩毀(Data Corruption)到底是怎麼一回事。剛前所說是指主控器不能確定SCL或SDA信號線拉高時,會喪失了匯流排使用仲裁權,也指出了送出邏輯零的元件支配了介面。然而,此種放棄的方法,對於主控器不同時運作是可行的,但是,如果兩個主控器剛剛好同時進行時,有趣的問題就出現了(圖5)。 請對照圖5,兩個微控制器MCU正針對位址為「1111001」的從屬裝置進行資料寫入模式,兩個微控制器咸認為他們擁有匯流排的使用權。MCU1要傳送資料「0101.0101」給從屬端,而MCU2要傳送資料「0110.0110」給從屬端,這時候,資料線就衝突發生了,因此,需要妥協的辦法才能夠解決。以圖5為例,MCU2先行放棄,也就是途中色塊的部分,等候到看見停止狀態的出現,才另開始傳送。從此例我們就可以學到一課,那就是匯流排使用權仲裁(Arbitration)的機制,哪一個主控端先拉低,誰就贏得優先使用權。當然啦!仲裁輸的一方唯有等待介面出現停止狀態的出現,才開始傳送。 其次,來談時脈同步(Clock Synchronization)之道。我們明瞭所有的主控端會在SCL信號線上產生其自己的時脈(Clock)在I2C介面上載送訊息。依照規定,時脈信號在高電位時,資料才具有實效性,I2C介面對於SCL信號是採用了「Wired-AND」的連接形式,當SCL信號線從邏輯高轉換到邏輯低時,所有的元件會關心邏輯低的時間,如果時脈從低電位轉換到高電位並不等於SCL信號線一定會在邏輯高,因為,有可能其他的時脈尚在低電位。如果經過所有元件關心的低電位時間,時脈信號線將釋放到高電位,第一個完成高電位時脈週期的元件,會先拉低SCL信號線,因此,可以得知SCL信號的同步,低電位乃是取決於時脈低電位時間最長的元件,而時脈高電位則是取決於時脈高電位週期最短的元件。 如此般的時脈同步機制,就可以拿來作為信號交握(Handshake)的用途。比如說,慢速元件與快速元件或是在多個主控端的場合來使用,這裡所說的慢速元件是指元件內部執行時間,好比說,EEPROM元件需要耗一點時間去寫入資料。I2C介面的同步方式是由SCL信號線來擔當,當從屬端需要主控端來等待的場合,只需將SCL信號拉低,主控端就不會產生ACK的波形。 這種手段,坦白說是存在不少的缺點。第一個能夠想到的問題就是電路設計出了問題,SCL信號線陷入困境,所有的主控端也相對地掉入僵局。當然,可以用逾時(Timeout)的方法來打破僵持不下的停頓狀況,間接地說,就是會影響到速率。 1982年首個I2C規格出現,到了1992年,I2C規格增加了快速模式(Fast Mode)以及10位元的定址方式。對於快速模式來說,實體上介面參數諸如協定、介面位階、電容負載等並沒有變更,只是將資料傳送速率拉升到400Kbps的高水準,當然約束就比較嚴謹,尤其是時序上的考量。所有支援快速模式(Fast Mode)的元件,其輸入端必須納入舒密特觸發(Schmitt Triggers)的電氣特性,可以用來抑制雜訊。輸出端緩衝器要具備斜率控制的能力,能夠讓SDA與SCL信號產生漂亮的下沿,同時,支援快速模式的元件電源關閉之際,介面上的接腳信號也必須維持在漂浮(Floating)狀態,避免妨礙到介面的正常運作,且必須適應拉高電阻的使用。通常200pF的負載情況使用被動式的電阻元件就可以了,若是200~400pF的高負載,建議採用主動式的電流源。 好比USB介面的鳳凰傳奇,I2C介面的驚人之舉就是介面速度的大躍升,增加了高速模式(High Mode),將速率提升到3.4Mbps,而且依然可以與傳統標準模式或快速模式相容。 從原本7個位元的位址增加到10個位元的定址能力,稱之為延伸定址(Extended Addressing)。符合這個新標準的晶片理所當然需要兩個位址位元組,第一個位元組包含了位址的兩個MSB以及讀出/寫入位元,第二個位元組即是位址的8個LSB。在介面上產生任何資料交易(Transaction)之前都必須先發出起始狀態。意思是說該狀態是對所有的連接的元件扮演一個通知的信號,告知即將傳送資料,因此,介面上的所有元件都在等待。當交易完成之後,也必須送出結束的狀態,也就是釋放出匯流排的使用權,讓介面回到閒置的情況下(圖6)。 有一些小細節需要去在意,一筆單獨的訊息交易允許多個起始狀態的發生,而結束狀態不管發生在哪一個時間點,一定表示傳送交易的結束。 一旦主控端送出起始狀態後,就能夠傳送一個位元組給從屬端,在起始狀態之後的第一個位元組就是從屬端的位址。但前面有提到新規格追加了10位元位址延伸定址模式,勢必有第二個位元組,如果是不支援延伸定址的元件,什麼都不必作(圖7)。 如果從屬端支援10位元延伸定址模式,就必須在主控端送出的認可(ACK)狀態之後,作出回應。請留意,無論是傳統的定址模式還是10位元延伸定址模式,第一個位元組的位元零(Bit 0)一定是定義為從屬端的存取模式。 ‧邏輯1=讀取(Read)模式 ‧邏輯0=寫入(Write)模式 如果從屬端被定址也認可之後,若R/W位元設定為邏輯1,就可以接收從屬端送來的一個位元組,此時,主控端會先釋放SDA信號線,因為從屬端必須擁有該信號的控制權,但是,時脈信號SCL依然還是必須由主控端來產生(圖8)。主控端產生SCL的上沿(2),讀取SDA資訊(3),然後產生SCL的下沿(4),因此,從屬端在SCL邏輯高的時間內是不能改變資料的。在圖8步驟(1)與步驟(5)期間,從屬端可以更新資料。總之,以上的順序總共執行8次完成一個位元組的載送,而且是從MSB位元開始送,至於位元組各個位元的涵義,就必須檢視從屬端元件的資料規範了(圖9)。 當一個位元組(資料或位址)送往從屬端之後,從屬端也必須做出認可(ACK)的回應(圖10)。從屬端在接收第八個位元之後,立即將SDA信號拉低,也就是主控端拉低SCL(1)表示完成位元傳送,從屬端繼續拉低SDA信號線(2),主控端會在SCL信號產生一個脈衝(3),爾後,從屬端在時脈結束之際釋放出SDA信號線(4),這時候主控端可以使用介面繼續送資料產生結束狀態。 相同的道理,當接收到從屬端送來的位元組之後,主控端元件也必須做出認可(ACK)的回應。在這個情形下,SDA與SCL信號線的掌控權完全是在主控端手上(圖11)。 當從屬端送完最後一個位元之後(1),從屬端就會釋放出SDA信號線(2),而主控端卻會將該信號拉低(3),其次,主控端在SCL信號線上產生一個脈衝(4),完成脈衝後,主控端將釋出SDA信號線,此時,從屬端就再次獲得SDA信號線的控制權。如果主控端想要停止從屬端送過來的接收,它必須能夠送出停止的狀態。 有一種情況是當主控端送完第八個位元之後,從屬端並沒有將SDA信號拉低,這種情況被視為「No ACK」的事件,但它不是一種狀態,通常意味著從屬端不在那(如果是位址)、從屬端漏掉了脈衝,或介面被Down掉了。不論是何種狀況,主控端都要對介面送出停止狀態。讓介面回歸到正常動作。 常見問題解答 文章末了,將一些平常對於I2C介面的詢問做個條列式整理摘要,方便讀者們閱讀。 ‧I2C介面的最長連接距離為何?這個問題的答案與介面上的負載相關聯,典型的應用約是9~12英尺左右。 ‧若要延長I2C介面,有沒有類似中繼器(Repeater)解決方法?當然有,這是屬於電流放大器(Current Amplifier)的屬性(圖12),可以解決線長的電容負載。然而,傳送端以及接收端必須搭配使用,避免衍生困擾。 ‧市面上有沒有存在獨立的I2C介面控制器?確實有,比如PCD8584或PCF8584等元件。 ‧為何SCL信號線必須為雙向?理由很單純,當使用多個主控制的場合就需要了。 ‧如何來追蹤I2C介面上的信號活動?市面上有一些廠商在販售監視裝置(Monitor)或是除錯工具(Debugger),可以上網查詢。 ‧I2C介面與SMbus的差異究竟在哪裡?這是一個絕佳的好問題,兩者都是兩線式(2-Wire) 的介面,基本上是彼此相容的。然而,SMbus的動作速度僅有100KHz,I2C介面尚有400KHz與2MHz,因此,相容性是指有限度的相容性。 逾時(Timeout)以及最小的時脈速度,可以說是I2C介面與SMbus的最大差異。 ‧I2C Bus=DC(no timeout) ‧SMBus=10kHz(35ms timeout) 其次,若仔細來觀察信號邏輯位階,兩者還是有所不同,請參閱圖13。同時,拉高電阻與電流位階(Current Level)也是個好問題,SMBus規定的沉入電流(Sink Current)為100uA~350uA,而I2C介面卻是3mA,也就間接決定了拉高電阻的可接受值。
|