摘要: 針對目前IIC總線(xiàn)以及具有IIC接口的芯片在嵌入式系統中的廣泛應用,設計了一種基于ARM9平臺S3C2440的, Linux操作系統下的IIC接口設備驅動(dòng)程序。通過(guò)IIC總線(xiàn)協(xié)議,驅動(dòng)程序實(shí)現了在內核狀態(tài)下對數字溫度傳感器DS1621的配置和獲取其溫度信息,并將其傳回用戶(hù)空間并打印顯示。實(shí)驗結果表明,工作時(shí)典型數據更新時(shí)間為1 s,精度為小數點(diǎn)后一位。且利用多片DS1621可擴展一個(gè)低電壓、低功耗的多點(diǎn)數字測溫系統,在嵌入式設備的溫度監測方面將有著(zhù)廣泛應用。 IIC總線(xiàn)作為一種申行傳輸總線(xiàn),其使用連線(xiàn)少,結構簡(jiǎn)單,是一種應用廣泛的高性能總線(xiàn)方式。而Linux作為一個(gè)源代碼公開(kāi)、易于裁剪的操作系統,非常適合于嵌入式系統的應用。Linux操作系統下的嵌入式設備驅動(dòng),通過(guò)IIC總線(xiàn),實(shí)現ARM與外圍模塊間的協(xié)同工作,有著(zhù)廣泛的應用。 1 IIC總線(xiàn)協(xié)議以及選用芯片功能 1.1 IIC總線(xiàn)的特點(diǎn)以及工作協(xié)議 IIC串行總線(xiàn)由兩根信號線(xiàn)組成:一根雙向傳輸的數據線(xiàn)SDA;另一根是時(shí)鐘線(xiàn)SCL。IIC總線(xiàn)通過(guò)簡(jiǎn)單的結構即能實(shí)現半雙工的同步數據傳輸。 IIC總線(xiàn)采用一主多從的運行機制,在同一時(shí)間只能有一臺設備作為主設備,總線(xiàn)的運行由主設備控制,主設備控制數據的傳送起始信號、發(fā)出時(shí)鐘信號、從機地址信號、數據信號,由接收數據方在傳送結束時(shí)發(fā)出應答信號,每個(gè)IIC總線(xiàn)上的設備都有一個(gè)唯一的地址,和主設備進(jìn)行通信。 IIC總線(xiàn)時(shí)序如圖1所示,在IIC總線(xiàn)使用過(guò)程中,傳輸開(kāi)始和停止的條件如下:當SCL持續為“1”而SDA從“1”變?yōu)椤?”時(shí)表示將要開(kāi)始發(fā)送數據;而當SCL持續為“1”而SDA從“0”變?yōu)椤?”表示停止發(fā)送數據。其中SDA線(xiàn)上的數據在時(shí)鐘線(xiàn)SCL為“1”期間必須是穩定的,只有當SCL線(xiàn)上的時(shí)鐘信號為低時(shí)數據線(xiàn)上的狀態(tài)才能改變。 ![]() 圖1 IIC總線(xiàn)時(shí)序圖 SDA線(xiàn)上的每個(gè)字節必須為8位,每次傳輸的字節數不限制,每發(fā)送1個(gè)字節都有1個(gè)ACK應答位。 1.2 選用ARM9芯片功能介紹 MCU采用某公司的S3C2440芯片,S3C2440A是某公司的一款基于A(yíng)RM920T內核的16/32位RISC嵌入式微處理器,主要面向手持設備以及高性?xún)r(jià)比、低功耗的應用,且集成了1個(gè)IIC總線(xiàn)控制器,能夠方便的與帶有IIC接口外設的通信。 1.3 數字溫度傳感器DS1621的芯片功能介紹 DS1621是DALLAS公司生產(chǎn)的一種功能強大的數字式溫度傳感器和恒溫控制器。接口與IIC總線(xiàn)兼容,一片控制器控制可控制多達8片的DS1621,工作電壓為2.7~5.5 V,適用于低功耗應用系統。 DS1621可作為恒溫控制器單獨使用,也可通過(guò)2線(xiàn)接口在A(yíng)RM的控制下完成溫度的測量及計算?梢酝ㄟ^(guò)寄存器設置調整。DS1621無(wú)需外圍元件即可測量溫度,結果以9位數字量(兩字節)給出,測量范圍為-55~+155℃,精度為0.5℃:典型轉換時(shí)間為1 s。 2 電路結構設計 設計采用了S3C2440作為電路中的主設備,控制IIC總線(xiàn)上從器件,由主設備控制IIC總線(xiàn)上的時(shí)鐘信號以及各種數據信號。采用2片DS16 21作為IIC總線(xiàn)上的從設備,由于DS1621具備IIC總線(xiàn)接口,可直接與S3C2440的SDA和SCL腳相接,通過(guò)對DS1621的A2、A1、A0腳(5、6、7腳)組合輸入不同的片選信號,可以確定其在IIC總線(xiàn)下工作的從機地址。因為IIC從設備一般都是MOS工藝,所以總線(xiàn)都有上拉電阻。工作時(shí),通過(guò)IIC總線(xiàn)將DS1621設置為溫度傳感器功能和逐次獲取數據的工作方式,電路的原理圖設計如圖2所示。 ![]() 圖2 電路的原理圖 3 驅動(dòng)程序設計 在Linux下的驅動(dòng)程序將所有設備看作文件,驅動(dòng)程序則為應用程序和硬件設備之間提供了操作訪(fǎng)問(wèn)的接口,使應用程序可以像操作普通文件一樣對硬件設備操作訪(fǎng)問(wèn)。Linux內核把驅動(dòng)程序劃分為3種類(lèi)型:字符設備、塊設備和網(wǎng)絡(luò )設備。其中,字符設備和塊設備可以像文件一樣被訪(fǎng)問(wèn)。DS1621的IIC驅動(dòng)屬于字符設備。 開(kāi)始工作時(shí),DS1621的工作方式是由片上的設置/狀態(tài)寄存器來(lái)決定的:1)當通過(guò)IIC總線(xiàn)向DS1621寫(xiě)入讀寫(xiě)設置命令ACh之后ARM發(fā)出的一字節將設置DS1621的工作方式,然后發(fā)出溫度轉換命令EEh,讀溫度命令AAh;2)DONE比特位表示工作在測溫功能時(shí),溫度數據已轉換完畢,保存在非易失性寄存器中;3)THF、TLF是DS1621作為恒溫器時(shí)的狀態(tài)標識位,當超過(guò)TH預置值或低于TL預置值時(shí)被置為1;4)1SHOT為一次模式位,該位為1時(shí)每次收到溫度轉換命令就執行一次溫度轉換,為0時(shí)將執行連續溫度轉換。DS1621寄存器配置如圖3所示。 ![]() 圖3 DS1621寄存器配置 在調試過(guò)程中發(fā)現,若使用連續轉換模式時(shí),在極少數情況下出現數據明顯不正確,故采用了逐次讀取數據模式,即逐次配置DS1621的溫度轉換,逐次獲取數據,并每次判斷DS1621工作狀態(tài)、數據范圍和精度,從而獲得了更加穩定、精確的實(shí)驗結果。 驅動(dòng)程序的功能包括:初始化以及釋放硬件設備;S3C2440通過(guò)IIC總線(xiàn)對DS1621的控制寄存器進(jìn)行配置;S3C2440讀取DS1621寄存器內的溫度數據,通過(guò)接口函數,將數據從內核空間發(fā)送到用戶(hù)空間。驅動(dòng)程序設計流程圖如圖4所示。 ![]() 圖4 驅動(dòng)程序設計流程圖 3.1 設備驅動(dòng)的主要函數 對于字符設備,Linux內核對這些操作進(jìn)行了統一的抽象,把它們定義在結構體file-operation中。通常,字符設備提供給應用程序的是一個(gè)流控制接口,主要包括open、release、read、ioctl等。 ![]() 3.2 從器件,設備DS1621的初始化代碼 ![]() 對S3C2440的IIC控制器進(jìn)行配置時(shí)需要用到的寄存器有:IICCON、IICSTAT、IICDS、IICADD。 IICCON:IIC總線(xiàn)控制寄存器;IICSTAT:IIC總線(xiàn)控制狀態(tài)寄存器;HCDS:IIC總線(xiàn)接收/發(fā)送數據移位寄存器;IICADD:IIC總線(xiàn)地址寄存器。 1)S3C2440的GPE15為HCSDA,是串行數據線(xiàn)端口,GPE14為IICSCL,是串行時(shí)鐘線(xiàn); 2)將IICCON設置為:0xA7,表示傳輸過(guò)程中ACK應答使能,IIC的工作時(shí)鐘為:HCCLK=fpclk/512,IlC總線(xiàn)中斷使能,數據傳輸的時(shí)鐘為:Tx clock=IICCLK/(IICCON[3:O]+1),約為400 k/s; 3)將IICSTAT置為:0x10,即使用從器件接收數據模式,數據輸出/接收使能。 ![]() 3.4 主器件從HC總線(xiàn)讀數據 對于DS1621的寄存器配置,當通過(guò)IIC讀取從器件DS1621的數據時(shí),需要切換數據收發(fā)的方向,S3C2440先在主機發(fā)送數據模式下,向從器件DS1621發(fā)送從地址、DS1621內部寄存器的子地址和寫(xiě)信號位,然后在主機接收數據模式下,再次向從器件發(fā)送從地址和讀信號位,并將子地址內的數據讀回,其讀數據操作如圖5所示。 ![]() 圖5 IIC總線(xiàn)讀數據操作 其中S為發(fā)送開(kāi)始標志START,W為寫(xiě)信號位,R為讀信號位,A為ACK應答信號,RS為重復開(kāi)始信號REPEATED START,NA為主機收回數據后發(fā)送的NACK信號,P為停止信號STOP。 ![]() 3.5 主器件向IIC總線(xiàn)寫(xiě)數據 ![]() 3.6 S3C2440從DS1621獲得溫度數據,保存在內核空間并傳送到用戶(hù)空間 4 驅動(dòng)的加載以及測試 應用程序將驅動(dòng)從內核空間獲得的數據保存下來(lái),首先根據傳回的DONE比特位判斷溫度傳感器是否正在數據轉換的過(guò)程中,如果是,則拋棄該數據,并打印數據不可用的信息;如果否,則接下來(lái)根據精度位判斷小數點(diǎn)后的數據值,并將結果打印出來(lái)。 ![]() 最后將驅動(dòng)程序編譯成模塊,可以動(dòng)態(tài)地加載、卸載設備驅動(dòng),不用重新啟動(dòng)系統就能查看驅動(dòng)程序結果,方便了驅動(dòng)的編寫(xiě)與調試工作。 經(jīng)過(guò)動(dòng)態(tài)編譯后,得到目標文件iic.o、1621.o以及應用程序1621_iic_test,將文件下載到S3C2440中,通過(guò)#insmodiic.o、#insmod 1621.o加載模塊,#./1621_iic_test運行測試程序,如圖6所示。 ![]() 圖6 運行測試程序并打印信息 5 結論 本文以ARM920T內核的S3C2440為MCU與數字溫度傳感器模塊DS1621搭建成多點(diǎn)數字測溫電路。MCU通過(guò)IIC總線(xiàn)與DS1621進(jìn)行通信,通過(guò)編寫(xiě)linux2.4版本下的IIC驅動(dòng)程序,完成了S3C2440與帶有IIC接口的外圍芯片的通信,并實(shí)現了DS1621的配置和測溫工作,正常工作中DS1621的典型溫度轉化時(shí)間為1 s,數據精度為0.5℃,典型的工作電壓和電流值僅為3 V、10μA,具備較高的精度,且自身工作功耗小。通過(guò)增加DS1621的使用片數,還可擴展為一個(gè)低電壓、低功耗的多點(diǎn)數字測溫系統,可以廣泛地應用在各種嵌入式系統中。驅動(dòng)程序可使用于其他具有IlC接口的外圍芯片的工作,也可將驅動(dòng)應用于其他具有IIC接口的外圍設備通信。 |