基于I2C總線的I/O口擴展設計
摘要:由于傳統的NI-DIO驅動板卡能夠驅動的I/O口數量比較有限,一般只應用在測試通道數比較少的實驗場合。而在一般的大型環境試驗中,要求能對多個產品同時測量。如果使用傳統的DIO板卡測試,就會出現測量通道數量不夠的情況。針對此類問題,提出了運用單片機與I/O擴展芯片PCA9554/A采用I2C通信進行I/O擴展,上位機采用LabVIEW編程,界面友好、操作方便,在環境實驗中起到了良好效果。
關鍵詞:I/O口;MCU;PCA9554/A;LabVIEW
0 引言
隨著電子技術的飛速發展,各類電子產品像雨后春筍般大量的進軍電子市場,其中也包括正在蓬勃發展的汽車電子行業。一般汽車電子行業對這些電子產品的要求比較高,會有很多的技術指標去規范它們,其中很重要的一環便是環境實驗。出于對工作效率的考慮,一個環境測試臺架往往要求能對多個產品進行同時測試。而這些產品的引腳數量一般也會比較多,這樣一來,測試臺架上所需的測試通道數量就會很多,往往多達幾百個。
一般多數用于汽車電子產品的環境測試臺架里面會集成有NI公司的DIO驅動板卡,由于它們的驅動端口比較多,便專用來負責產品的環境實驗測試。以NI-6509為例,這是一個12×8的板卡,總共有12個通道,每通道8位I/O控制組成,總計96路I/O控制;NI-2532的矩陣板卡,其能支持的通道數是32×16,共512路。這些I/O端口,針對一般的應用是夠的,但如果用于引腳數量比較多的產品測試,便會出現I/O口數
量不夠用的局面。假如環境實驗要同時測試12個產品,每個產品有40個引腳,那么對于產品引腳繼電器就必須要有480個,再加上一些外圍輔助儀器介入的切換,那么在這種情況下,這類DIO板卡的應用就顯得很勉強。
針對此類問題,本文提出了一種有效的解決方法,便是應用單片機的I/O口配合市面上一些常見的I/O擴展芯片,進行端口的擴展。單片機有4個端口,每個端口8位,總計32個位控制;擴展芯片,比如I2C芯片,只需要2根線(SDA&SCL)即可,因此可以連16組I2C通信,且每組可同時支持8個芯片(每組最大可容納8個地址),每個芯片又可控制8個端口。因此,單片機理論上,至少可支持16×8×8個端口。并且,如果芯片頭地址可以不一樣的話,例如PCA9554和PCA9554A,那么端口數量又可以增加一倍,達到2 048個,這是一般的板卡所遠遠不能及的。
1 系統硬件設計
本文所涉及到的硬件比較簡單,上位機與MCU之間通過RS 232串口連接,MCU靠外部電源提供的5 V直流電進行工作。再將MCU的2個端口模擬成SCL,SDA兩根線與PCA9554/A進行通信連接。這樣就形成了上位機發送指令,單片機接受指令并進行相應解析后再通過SDA、SCL兩根線向PCA9554/A發送命令數據,控制它的輸入與輸出。
1.1 PCA9554/A芯片介紹
PCA9554和PCA9554A是16腳的CMOS器件,它們提供了I2C的應用中的8位通用并行輸入/輸出口(GPIO),PCA9554/54A包含一個8位配置寄存器(輸入或輸出選擇)、8位輸入寄存器、8位輸出寄存器和一個極性反轉(高電平或低電平操作有效)寄存器。系統主控制器通過寫I/O口相應的配置位來激活端口的輸入或輸出。PCA9554/A有3個硬件管腳(A0,A1,A2)來實現不同的I2C地址,最多允許8個器件共用一個I2C總線上。PCA9554與PCA554A的惟一區別在于I2C地址不同,這樣最多允許16個器件(9554和9554A各8個)連接接到同一個I2C總線上。
1.2 基于PCA9554/A的硬件設計
按I2C規約,PCA9554的器件地址為0x40,PCA9554A的器件地址為0x70,當然,由于硬件地址引腳A0~A2可尋址8個器件,所以器件地址并不惟一,例如:A0接GND,A1接VCC,則PCA9554的器件地址為0x4C。使用STC89C52單片機為主控芯片,單片機的P1.3管腳與PCA9554的SDA管腳相連,P1.2管腳與PCA9554的SCL管腳相連。4個LED燈可以受四個按鍵控制,也可以受上位機進行控制。
2 系統軟件設計
本文系統軟件設計主要分為兩部分,一個是上位機的LabVIEW程序設計;另一個則是單片機底層C語言的程序設計。
2.1 LabVIEW的程序設計
上位機的程序設計主要是與MCU串口通信,通過向MCU發送控制命令來達到對PCA9554/A的I/O口進行控制的目的。
LabVIEW是一種圖形化編程語言,由美國國家儀器(NI)公司研制開發的,類似于C和BASIC開發環境。使用這種語言編程時,基本上不寫程序代碼,取而代之的是流程圖。使用它進行原理研究、設計、測試并實現儀器系統時,可以大大提高工作效率。
本文主要是用LabVIEW語言編寫與MCU的串口通信程序,界面友好、操作方便。LabVIEW控制單片機是通過Instrument I/O的Serial控件調用來實現的。主要用到其中的VISA配置串口節點,包括串口配置、讀、寫、關閉等節點。通過對這些節點的調用就可以方便的對串口進行操作。
這里,Command to RS 232欄中的指令必須與單片機事先燒錄好的代碼相符合。這樣,單片機才能將接收到的指令進行正確匹配,并執行相應操作。
程序左端調用Configuration模塊,進行串口的基本配置,比如BaudRate、數據位等,使這些參數與單片機里面的串口預定義設置相一致;右側是Close模塊,用于程序退出時,釋放對串口的控制;中間是程序主體,包含對串口的讀、寫操作,實現對串口的雙向通信。為了程序簡潔、形象易懂,此次程序中用到了對LabVIEW子函數的調用,如RS 232-ini,RS 232W-R等模塊,這些子函數就是用VISA串口節點來編寫的,只是做了封裝而已。
2.2 MCU的串口通信
上位機是通過串口將指令字符傳遞給單片機的。單片機對串口的讀操作是通過中斷的方式實現的,以字符為單位,每接收到一個8位的字符,MCU產生一個讀中斷RI=1,此時,單片機將接收到的字符儲存起來,然后軟件將RI復位置0,繼續接收下一個字符。本系統中,所有計算機發送給單片機的指令均以‘?’結尾。MCU接收到‘?’后,產生一個終止位,然后與事先定義好的指令進行匹配,如果指令事先有定義,那么就會執行相應的操作。
2.3 MCU的I2C時序模擬
上位機向單片機發送指令數據,如果這些指令已在單片機中事先定義好,那么單片機將會通過模擬的SDA與SCL兩個引腳,根據PCA9554/A的datasheet時序圖,將控制命令數據傳遞給PCA9554/A,從而實現對PCA9554/A的I/O口進行控制。
2.3.1 PCA9554/A的寫操作
根據I2C總線傳輸協議以及PCA9554/A的總線讀寫特性,可以看出:對PCA9554/A端口的寫操作主要是通過對它的輸出端口寄存器進行寫操作的。具體過程為:在SCL為高電平期間,SDA由高電平向低電平轉換作為起始信號,SDA由低電平向高電平轉化則為停止信號。在起始條件后,必須是從機地址,對于PCA9554來說從地址的高4位是0100,而PCA9554A則是0111,A2,A1,A0的高低電平狀態可以有8種組合,最后一位是讀寫選擇位。從地址發送完后便是等待從機的應答信號ACK,從機正確應答后便開始由主機發送命令字節,接著又是等待從機應答,應答后便開始發送數據了。以下為PCA9554的寫操作部分代碼。
2.3.2 PCA9554/A的讀操作
對PCA9554/A的讀操作稍微麻煩一點,需要在收到第二次從機應答信號后再一次發送總線起始信號及從機地址即可。
由于篇幅原因,以上均只給出了部分重要程序。需要提出的是I2C總線上的起始、停止、以及讀寫數據的時序模擬均要參考PCA9554/A的datasheet中的時間參數要求,嚴格對應。
3 結語
本文運用單片機與I/O擴展芯片PCA9554/A采用I2C通信進行I/O擴展,提出了具體的軟硬件設計,完成了上位機對PCA9554/A端口的直接控制,并進行了I/O的有效擴展。并成功的應用在對多個汽車電子產品同時測量的環境試驗中,取得了很好的效果。
評論