www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

1 I2C總線簡介

I2C (Inter-Integrated )總線是一種由公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線最主要的優(yōu)點(diǎn)就是簡單性和有效性。

1.1 I2C總線工作原理

I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,各種被控制器件均并聯(lián)在這條總線上,每個器件都有一個唯一的地址識別,可以作為總線上的一個發(fā)送器件或接收器件(具體由器件的功能決定) [1]。I2C總線的結(jié)構(gòu)如圖1所示。


圖1 I2C總線

1.2 I2C總線的幾種信號狀態(tài)

1. 空閑狀態(tài):SDA和SCL都為高電平。

2. 開始條件(S):SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。

3. 結(jié)束條件(P):SCL為低電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。

4. 數(shù)據(jù)有效:在SCL的高電平期間, SDA保持穩(wěn)定,數(shù)據(jù)有效。SDA的改變只能發(fā)生在SCL的底電平期間。

5. ACK信號: 數(shù)據(jù)傳輸?shù)倪^程中,接收器件每接收一個字節(jié)數(shù)據(jù)要產(chǎn)生一個ACK信號,向發(fā)送器件發(fā)出特定的低電平脈沖,表示已經(jīng)收到數(shù)據(jù)。

1.3 I2C總線基本操作

I2C總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生串行時鐘(SCL),同時控制總線的傳輸方向,并產(chǎn)生開始和停止條件。

數(shù)據(jù)傳輸中,首先主器件產(chǎn)生開始條件,隨后是器件的控制字節(jié)(前七位是從器件的地址,最后一位為讀寫位 )。接下來是讀寫操作的數(shù)據(jù),以及 ACK響應(yīng)信號。數(shù)據(jù)傳輸結(jié)束時,主器件產(chǎn)生停止條件[1]。具體的過程如圖2所示。

圖2 完整的I2C數(shù)據(jù)傳輸過程

2 下I2C驅(qū)動程序的分析

2.1 系統(tǒng)I2C驅(qū)動的層次結(jié)構(gòu)

系統(tǒng)對I2C設(shè)備具有很好的支持,Linux系統(tǒng)下的I2C驅(qū)動程序從邏輯上可以分為3個部分:

1. I2C總線的驅(qū)動 I2C :實(shí)現(xiàn)對I2C總線、I2C 及I2C 的管理。

2. I2C控制器的驅(qū)動 I2C :針對不同類型的I2C控制器 ,實(shí)現(xiàn)對I2C總線訪問的具體方法。

3. I2C設(shè)備的驅(qū)動 I2C :針對特定的I2C設(shè)備,實(shí)現(xiàn)具體的功能,包括, write以及等對用戶層操作的接口。

這三個部分的層次關(guān)系如圖3和圖4所示。

2.2 I2C 總線驅(qū)動 I2C

I2C 是Linux內(nèi)核用來維護(hù)和管理的I2C的核心部分,其中維護(hù)了兩個靜態(tài)的,分別記錄系統(tǒng)中的I2C 結(jié)構(gòu)和I2C 結(jié)構(gòu)。I2C core提供接口函數(shù),允許一個I2C adatper,I2C driver和I2C 初始化時在I2C core中進(jìn)行注冊,以及退出時進(jìn)行注銷。同時還提供了I2C總線讀寫訪問的一般接口(具體的實(shí)現(xiàn)在與I2C控制器相關(guān)的I2C adapter中實(shí)現(xiàn)),主要應(yīng)用在I2C設(shè)備驅(qū)動中。

2.3 I2C控制器的驅(qū)動 I2C adapter

I2C adapter是針對不同類型I2C控制器硬件,實(shí)現(xiàn)比較底層的對I2C總線訪問的具體方法。I2C adapter 構(gòu)造一個對I2C core層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向I2C core注冊一個控制器。

I2C adapter主要實(shí)現(xiàn)對I2C總線訪問的算法,iic_xfer() 函數(shù)就是I2C adapter底層對I2C總線讀寫方法的實(shí)現(xiàn)。同時I2C adpter 中還實(shí)現(xiàn)了對I2C控制器中斷的處理函數(shù)。

2.4 I2C設(shè)備的驅(qū)動 I2C driver

I2C driver中提供了一個通用的I2C設(shè)備的驅(qū)動程序,實(shí)現(xiàn)了字符類型設(shè)備的訪問接口,對設(shè)備的具體訪問是通過I2C adapter來實(shí)現(xiàn)的。I2C driver構(gòu)造一個對I2C core層接口的數(shù)據(jù)結(jié)構(gòu),通過接口函數(shù)向 I2C 注冊一個I2C設(shè)備驅(qū)動。同時I2C driver 構(gòu)造一個對用戶層接口的數(shù)據(jù)結(jié)構(gòu),并通過接口函數(shù)向內(nèi)核注冊為一個主設(shè)備號為89的字符類型設(shè)備。

I2C driver實(shí)現(xiàn)用戶層對I2C設(shè)備的訪問,包括,,write,,等常規(guī)文件操作,我們可以通過函數(shù)打開 I2C的設(shè)備文件,通過函數(shù)設(shè)定要訪問從設(shè)備的地址,然后就可以通過 和write函數(shù)完成對I2C設(shè)備的讀寫操作。

通過I2C driver提供的通用方法可以訪問任何一個I2C的設(shè)備,但是其中實(shí)現(xiàn)的read,write及ioctl等功能完全是基于一般設(shè)備的實(shí)現(xiàn),所有的操作數(shù)據(jù)都是基于字節(jié)流,沒有明確的格式和意義。為了更方便和有效地使用I2C設(shè)備,我們可以為一個具體的I2C設(shè)備開發(fā)特定的I2C設(shè)備驅(qū)動程序,在驅(qū)動中完成對特定的數(shù)據(jù)格式的解釋以及實(shí)現(xiàn)一些專用的功能。

3 一個具體的I2C設(shè)備驅(qū)動程序的開發(fā)

是一款小巧的I2C接口的實(shí)時時鐘芯片,具有低功耗,全BCD碼時鐘和日歷輸出, 12 /24小時工作模式,時分秒、星期、年月日計時數(shù)據(jù),潤年自動補(bǔ)償,有效期至2100年,外加56 Bytes的NV RAM(非易失性的RAM)等特點(diǎn)。下面以為例,說明一個具體的I2C設(shè)備驅(qū)動程序的設(shè)計要點(diǎn)。

3.1 I2C設(shè)備驅(qū)動程序的一般結(jié)構(gòu)

一個具體的I2C設(shè)備驅(qū)動需要實(shí)現(xiàn)兩個方面的接口,一個是對I2C core層的接口,用以掛接I2C adapter層來實(shí)現(xiàn)對I2C總線及I2C設(shè)備具體的訪問方法,包括要實(shí)現(xiàn)attach_adapter,detach_,command等接口函數(shù)。另一個是對用戶應(yīng)用層的接口,提供用戶程序訪問I2C設(shè)備的接口,包括實(shí)現(xiàn),,read,write以及最重要的ioctl等標(biāo)準(zhǔn)文件操作的接口函數(shù)。

對I2C core層的接口函數(shù)的具體功能解釋如下:

attach_adapter:I2C driver在調(diào)用I2C_add_driver() 注冊時,對發(fā)現(xiàn)的每一個I2C adapter(對應(yīng)一條I2C 總線)都要調(diào)用該函數(shù),檢查該I2C adapter是否符合I2C driver的特定條件,如果符合條件則連接此I2C adapter,并通過I2C adapter來實(shí)現(xiàn)對I2C總線及I2C設(shè)備的訪問。

detach_:I2C driver在刪除一個I2C 時調(diào)用該函數(shù),清除描述這個I2C 的數(shù)據(jù)結(jié)構(gòu),這樣以后就不能訪問該設(shè)備了。

command:針對設(shè)備的特點(diǎn),實(shí)現(xiàn)一系列的子功能,是用戶接口中的ioctl功能的底層實(shí)現(xiàn)。

3.2 驅(qū)動程序?qū)崿F(xiàn)對I2C core層的接口

在驅(qū)動中必須實(shí)現(xiàn)一個struct i2c_driver 的數(shù)據(jù)結(jié)構(gòu),并在驅(qū)動模塊初始化時向I2C core注冊一個I2C驅(qū)動,并完成對I2C adapter的相關(guān)操作。

struct i2c_driver _driver =

{

: "DS1307",

id: I2C_DRIVERID_DS1307,

flags: I2C_DF_NOTIFY,

attach_adapter:_,

detach_client:_detach,

command: ds1307_command

};

數(shù)據(jù)結(jié)構(gòu)ds1307_driver中的:"DS1307",Id:I2C_DRIVERID_DS1307用來標(biāo)識DS1307驅(qū)動程序。flags: I2C_DF_NOTIFY表示在I2C總線發(fā)生變化時通知該驅(qū)動。

ds1307_對應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的attach_adapter,主要功能:調(diào)用 I2C core 層提供的i2c_函數(shù)查找一條I2C總線,看是否有DS1307的設(shè)備存在,如果存在DS1307,則將對應(yīng)的I2C adapter 和DS1307設(shè)備掛接在一起,并通過該I2C adapter來實(shí)現(xiàn)對DS1307的訪問。同時使能DS1307, 并調(diào)用i2c_attach_client()向I2C core層注冊DS1307。

ds1307_detach對應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的detach_client,主要功能:調(diào)用i2c_detach_client() 向I2C core層注銷DS1307,并不使能DS1307,這樣I2C驅(qū)動就不能訪問DS1307了。

ds1307_command對應(yīng)i2c_driver數(shù)據(jù)結(jié)構(gòu)中的command ,主要功能:針對DS1307時鐘芯片的特點(diǎn),實(shí)現(xiàn)一系列的諸如DS1307_GETTIME ,DS1307_SETTIME,DS1307_GETDATETIME,DS1307_MEM_READ,DS1307_MEM_WRITE等子功能,是用戶接口中的ioctl功能的底層實(shí)現(xiàn)。

以上3個接口函數(shù)使DS1307的驅(qū)動程序?qū)崿F(xiàn)了對I2C 總線及I2C adpater的掛接,因此就可以通過I2C core的提供對I2C總線讀寫訪問的通用接口,來開發(fā)實(shí)現(xiàn)DS1037驅(qū)動程序?qū)τ脩魬?yīng)用層的接口函數(shù)。

3.3 DS1307驅(qū)動程序?qū)崿F(xiàn)對用戶應(yīng)用層的接口

在驅(qū)動中必須實(shí)現(xiàn)一個struct file_operations 的數(shù)據(jù)結(jié)構(gòu),并向內(nèi)核注冊為一個字符類型的設(shè)備(用單獨(dú)的主設(shè)備號來標(biāo)識),或者注冊為一個misc設(shè)備(所有miscdevice設(shè)備共同一個主設(shè)備號,不同的次設(shè)備號,所有的miscdevice設(shè)備形成一個鏈表,對設(shè)備訪問時根據(jù)次設(shè)備號查找對應(yīng)的miscdevice設(shè)備,然后調(diào)用其struct file_operations中注冊的應(yīng)用層接口進(jìn)行操作)。

struct file_operations rtc_fops =

{

owner: THIS_MODULE,

ioctl: ds1307_rtc_ioctl,

read: ds1307_rtc_read,

write: ds1307_rtc_read,

open: ds1307_rtc_open,

: ds1307_rtc_release

};

數(shù)據(jù)結(jié)構(gòu)rtc_fops 中的ds1307_rtc_open 和ds1307_rtc_release對應(yīng)file_operations中的open和release,分別用來打開和關(guān)閉DS1307。

ds1307_rtc_ioctl對應(yīng)file_operations中的ioctl,對用戶提供的一系列控制時鐘芯片的具體命令:RTC_GET_TIME: 以固定的數(shù)據(jù)格式讀取實(shí)時時鐘的時間。RTC_SET_TIME:以固定的數(shù)據(jù)格式設(shè)定實(shí)時時鐘的時間。RTC_SYNC_TIME:系統(tǒng)時鐘和實(shí)時時鐘之間的時間同步。

ds1307_rtc_read 對應(yīng)對應(yīng)file_operations中的read,實(shí)現(xiàn)與ds1307_rtc_ioctl 的子功能RTC_GET_TIME相同的功能,以及從NV RAM讀取數(shù)據(jù)。

ds1307_rtc_write 對應(yīng)file_operations中的write,實(shí)現(xiàn)與ds1307_rtc_ioctl的子功能 RTC_SET_TIME相同的功能,以及將數(shù)據(jù)寫入NV RAM。

3.4 DS1307驅(qū)動程序的加載和測試

在DS1307驅(qū)動模塊的初始化函數(shù)ds1307_init()中,首先通過i2c_add_driver(&ds1307_driver)向I2C core層注冊一個I2C的設(shè)備驅(qū)動,然后再通過misc_register (&ds1307_rtc_miscdev)將DS1307注冊為一個miscdevice設(shè)備,這樣用戶程序就可以通過主設(shè)備號10 次設(shè)備號 135的設(shè)備節(jié)點(diǎn)/dev/rtc來訪問DS1307了。

將DS1307的驅(qū)動程序編譯成模塊的方式,通過insmod命令加載進(jìn)內(nèi)核,然后用測試代碼進(jìn)行測試,DS1307驅(qū)動程序中實(shí)現(xiàn)的所有功能都達(dá)到了預(yù)期的效果。

由于DS1307驅(qū)動程序在底層實(shí)現(xiàn)了對DS1307時鐘芯片數(shù)據(jù)的解釋和轉(zhuǎn)換,所以在用戶程序中得到的就是有固定格式和意義的數(shù)據(jù),這樣就方便了用戶程序的訪問,提高了應(yīng)用開發(fā)的效率。

4 總結(jié)

I2C總線是一種結(jié)構(gòu)小巧,協(xié)議簡單的總線,應(yīng)用很廣泛,訪問起來簡單方便。linux系統(tǒng)下I2C的驅(qū)動程序具有清晰的層次結(jié)構(gòu),可以很容易地為一個特定的I2C設(shè)備開發(fā)驅(qū)動。本文通過對linux系統(tǒng)下I2C驅(qū)動,以及一個具體的DS1307時鐘芯片驅(qū)動結(jié)構(gòu)的分析,基本上可以很清楚看出一個I2C設(shè)備驅(qū)動的開發(fā)過程。實(shí)現(xiàn)的關(guān)鍵分為兩個部分,1. 對I2C core的接口,必須實(shí)現(xiàn) struct i2c_drvier數(shù)據(jù)結(jié)構(gòu)中的幾個特定的功能函數(shù)。這些函數(shù)是I2C驅(qū)動與I2C總線物理層(I2C控制器)和I2C設(shè)備器件之間通信的基礎(chǔ)。2. 對用戶應(yīng)用層的接口,必須實(shí)現(xiàn)struct file_operation數(shù)據(jù)結(jié)構(gòu)中的一些特定功能的函數(shù),如 open ,release , read ,write,lseek等函數(shù)。以上兩類接口中,對I2C core的接口是對I2C設(shè)備訪問的基礎(chǔ),實(shí)現(xiàn)對I2C總線具體的訪問方法;對用戶應(yīng)用層的接口則是方便應(yīng)用程序開發(fā),實(shí)現(xiàn)設(shè)備特定功能的必不可少的部分。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉