日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件

摘 要: 針對I2C總線的特點(diǎn),Linux內(nèi)核中定義了I2C驅(qū)動(dòng)體系結(jié)構(gòu)。在分析Linux的I2C總線驅(qū)動(dòng)體系結(jié)構(gòu)基礎(chǔ)上,介紹了在S3C2410中設(shè)計(jì)I2C總線驅(qū)動(dòng)的方法。
關(guān)鍵詞: ARM-Linux;I2C體系結(jié)構(gòu);I2C總線驅(qū)動(dòng)程序

 I2C總線是一種串行數(shù)據(jù)傳輸標(biāo)準(zhǔn)總線,使用數(shù)據(jù)線SDA和時(shí)鐘線SCL就可實(shí)現(xiàn)設(shè)備間的數(shù)據(jù)交互,它使得電路系統(tǒng)結(jié)構(gòu)設(shè)計(jì)簡單,具有使用方便、通信速率高等優(yōu)點(diǎn)。因此,在嵌入式系統(tǒng)中,I2C總線被廣泛地應(yīng)用在與RAM、EEPROM、RTC等設(shè)備間的接口電路中。近年來,隨著嵌入式系統(tǒng)應(yīng)用不斷升溫,Linux憑借源碼開放、內(nèi)核穩(wěn)定以及可裁剪性強(qiáng)等優(yōu)點(diǎn)成為在通信、工業(yè)控制、消費(fèi)電子等領(lǐng)域的主流操作系統(tǒng)。而Linux設(shè)備驅(qū)動(dòng)程序是所有Linux應(yīng)用系統(tǒng)中不可或缺的組成部分,是現(xiàn)在Linux開發(fā)中的熱門領(lǐng)域。Linux內(nèi)核已經(jīng)把I2C總線協(xié)議定義為內(nèi)核驅(qū)動(dòng)的一部分,并形成了一種體系結(jié)構(gòu)。本文正是在研究I2C總線驅(qū)動(dòng)體系結(jié)構(gòu)基礎(chǔ)上,提出了其在S3C2410中實(shí)現(xiàn)的基本方法。
1 I2C總線
 I2C總線是由雙向數(shù)據(jù)傳輸線SDA和時(shí)鐘線SCL構(gòu)成的二線制串行總線,可構(gòu)成主從和多主系統(tǒng)。I2C總線多采用主從雙向通信,即總線上在某一時(shí)刻只有一個(gè)主設(shè)備,總線上的其他設(shè)備都作為從設(shè)備。任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主設(shè)備,但是在同一時(shí)間內(nèi)只能有一個(gè)設(shè)備作為主設(shè)備(通常為微控制器),其他每個(gè)I2C器件作為從設(shè)備與主設(shè)備進(jìn)行通信,它們都有唯一的地址用來識(shí)別。
I2C總線的時(shí)序圖[1]如圖1所示。


 從圖1可以看到,I2C總線在傳送數(shù)據(jù)過程中使用了三種信號(hào)[2]。(1)開始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,表示將要開始傳送數(shù)據(jù);(2)應(yīng)答信號(hào):從設(shè)備在接收到1 B數(shù)據(jù)后,向主設(shè)備發(fā)出一個(gè)低電平脈沖應(yīng)答信號(hào),表示已收到數(shù)據(jù),主設(shè)備根據(jù)從設(shè)備的應(yīng)答信號(hào)做出是否繼續(xù)傳輸數(shù)據(jù)的操作(I2C總線每次數(shù)據(jù)傳輸時(shí)字節(jié)數(shù)不限制,但是每發(fā)送1 B都要有一個(gè)應(yīng)答信號(hào));(3)結(jié)束信號(hào):SCL為低電平時(shí),SDA由低電平向高電平跳變,表示數(shù)據(jù)傳送結(jié)束。
I2C總線具體的通信工作原理如下:主設(shè)備首先發(fā)出開始信號(hào),接著發(fā)送1 B的數(shù)據(jù),其由高7 bit地址碼和最低1 bit方向位組成(方向位表明主設(shè)備與從設(shè)備間數(shù)據(jù)的傳送方向)。系統(tǒng)中所有從設(shè)備將自己的地址與主設(shè)備發(fā)送到總線上的地址進(jìn)行比較,如果從設(shè)備地址與總線上的地址相同,該設(shè)備就是與主設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)脑O(shè)備。接著進(jìn)行數(shù)據(jù)傳輸,根據(jù)方向位,主設(shè)備接收從設(shè)備數(shù)據(jù)或發(fā)送數(shù)據(jù)到從設(shè)備。當(dāng)數(shù)據(jù)傳送完成后,主設(shè)備發(fā)出一個(gè)停止信號(hào),釋放I2C總線,然后所有從設(shè)備等待下一個(gè)開始信號(hào)的到來。
2 系統(tǒng)硬件設(shè)計(jì)
2.1 Linux驅(qū)動(dòng)程序
 設(shè)備驅(qū)動(dòng)程序是Linux內(nèi)核的重要組成部分,是操作系統(tǒng)內(nèi)核與底層硬件之間的接口。在ARM系統(tǒng)中,每個(gè)物理設(shè)備都有自己的控制器,每個(gè)硬件控制器都有自己的控制狀態(tài)寄存器(CSR),并且各不相同。這些寄存器用來啟動(dòng)、停止、初始化設(shè)備,并對設(shè)備進(jìn)行診斷,對硬件的控制主要是針對這些寄存器進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的底層細(xì)節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)文件,應(yīng)用程序通過對應(yīng)的設(shè)備驅(qū)動(dòng)程序中定義的通信接口(write、read和ioctl等)像操作普通文件一樣實(shí)現(xiàn)對硬件設(shè)備的操作,簡化了對設(shè)備的訪問,使得應(yīng)用程序的編寫相對簡單。
設(shè)備驅(qū)動(dòng)程序一般有以下功能[3]:對硬件設(shè)備的初始化、加載和釋放;對設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置以及提供對設(shè)備的統(tǒng)一操作接口;讀取應(yīng)用程序傳遞給設(shè)備文件的數(shù)據(jù)或回送應(yīng)用程序請求的數(shù)據(jù);檢測或處理設(shè)備出現(xiàn)的錯(cuò)誤等。
 Linux內(nèi)核將打開、關(guān)閉、讀/寫和ioctl等所有相關(guān)操作封裝在一個(gè)結(jié)構(gòu)體file_operations中,設(shè)備驅(qū)動(dòng)程序利用結(jié)構(gòu)體file_operations與文件系統(tǒng)聯(lián)系起來。另外還要使用module_init()和module_exit()兩個(gè)宏。module_init()的本質(zhì)是在.initcall.init段使用空間中定義的一個(gè)指向初始化函數(shù)的指針。設(shè)備驅(qū)動(dòng)程序通過調(diào)用代碼段中設(shè)備初始化函數(shù),完成初始化硬件和向內(nèi)核注冊設(shè)備驅(qū)動(dòng)程序。module_exit()功能與module_init()相反。
2.2 I2C總線驅(qū)動(dòng)體系結(jié)構(gòu)
 直接數(shù)字頻率合成器(DDS)是一種產(chǎn)生模擬波形的方法,其通常是通過數(shù)字形式的時(shí)間轉(zhuǎn)換信號(hào)再執(zhí)行數(shù)模轉(zhuǎn)換產(chǎn)生正弦波。因?yàn)镈DS設(shè)備的運(yùn)行基于數(shù)字,所以能夠在輸出頻率、正弦波頻率分解和運(yùn)行于寬頻率頻譜之間相互轉(zhuǎn)換。本系統(tǒng)采用DDS AD9833作為超聲波發(fā)射單元的脈沖生成器,AD9833是可編程的,通過高速串口外圍接口(SPI),只需要一個(gè)外部時(shí)鐘去產(chǎn)生簡單的正弦波就可以工作了。AD9833可以在基于25 MHz的時(shí)鐘下產(chǎn)生0~12.5 MHz的波形[6]。
 I2C設(shè)備在Linux下完全可以作為一個(gè)字符設(shè)備,可以根據(jù)需要編寫一個(gè)字符設(shè)備驅(qū)動(dòng)程序來支持I2C通信。但是由于I2C總線是一種標(biāo)準(zhǔn)總線,在PC和嵌入式系統(tǒng)中都得到了廣泛的應(yīng)用,Linux專門為I2C總線定義了I2C驅(qū)動(dòng)程序體系結(jié)構(gòu)[4],使驅(qū)動(dòng)程序有統(tǒng)一的接口,方便了驅(qū)動(dòng)設(shè)計(jì)者設(shè)計(jì),也便于移植。
在Linux系統(tǒng)中,I2C總線驅(qū)動(dòng)體系由I2C核心、總線適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)三部分組成。
 (1)I2C核心
 I2C核心即i2c-core.c,是Linux內(nèi)核用來維護(hù)和管理的I2C總線的核心部分,實(shí)現(xiàn)了I2C總線驅(qū)動(dòng)的框架。I2C核心為總線提供了統(tǒng)一的接口函數(shù),實(shí)現(xiàn)了I2C總線驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊、注銷及通信等功能。I2C核心是I2C總線適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)之間的橋梁。
 (2)I2C總線適配器驅(qū)動(dòng)
 I2C總線適配器驅(qū)動(dòng)主要包括了對應(yīng)具體硬件I2C控制器的I2C總線適配器i2c_adapter以及I2C總線適配器的通信傳輸算法i2c_algorithm以及總線驅(qū)動(dòng)控制適配器通信函數(shù)等,為I2C核心提供了底層支持,是與硬件相關(guān)的。需要注意的是,I2C總線驅(qū)動(dòng)程序只是提供了I2C總線的讀寫方法,其本身并不進(jìn)行任何通信,它只是等待設(shè)備驅(qū)動(dòng)調(diào)用其函數(shù)來對具體的硬件設(shè)備進(jìn)行訪問。
?。?)I2C設(shè)備驅(qū)動(dòng)程序
 I2C設(shè)備驅(qū)動(dòng)程序通過I2C總線適配器驅(qū)動(dòng)與具體的硬件設(shè)備進(jìn)行通信。I2C設(shè)備驅(qū)動(dòng)程序中主要包括了數(shù)據(jù)結(jié)構(gòu)i2c_driver(用于管理i2c_client)、i2c_client(掛在I2C總線上的設(shè)備驅(qū)動(dòng)程序)和需要根據(jù)具體設(shè)備實(shí)現(xiàn)的成員函數(shù)。標(biāo)準(zhǔn)的I2C驅(qū)動(dòng)程序也是一個(gè)字符設(shè)備驅(qū)動(dòng)程序,通過i2c-dev.c來進(jìn)行管理,包括open、release、read、write、ioctl和lseek等。
Linux內(nèi)核I2C總線驅(qū)動(dòng)程序構(gòu)架如圖2所示,其反映了I2C總線驅(qū)動(dòng)體系間的關(guān)系。

3 S3C2410中I2C總線驅(qū)動(dòng)程序的實(shí)現(xiàn)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉