1. 嵌入式ubuntu怎麼載入i2c匯流排
linux定義了系統的IIC驅動體系結構,在Linux系統中,IIC驅動由3部分組成,即IIC核心、IIC匯流排驅動和IIC設備驅動。這3部分相互協作,形成了非常通用、可適應性很強的IIC框架。
3.1.1IIC核心
IIC核心提供了IIC匯流排驅動和設備驅動的注冊、注銷方法,IIC通信方法(即algorithm」,筆者認為直譯為「運算方法」並不合適,為免引起誤解,下文將直接使用「algorithm」)上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼等。
在我們的Linux驅動的i2c文件夾下有algos,busses,chips三個文件夾,另外還有i2c-core.c和i2c-dev.c兩個文件。
i2c-core.c文件實現了I2Ccore框架,是Linux內核用來維護和管理的I2C的核心部分,其中維護了兩個靜態的List,分別記錄系統中的I2Cdriver結構和I2Cadapter結構。I2Ccore提供介面函數,允許一個I2Cadatper,I2Cdriver和I2Cclient初始化時在I2Ccore中進行注冊,以及退出時進行注銷。同時還提供了I2C匯流排讀寫訪問的一般介面,主要應用在I2C設備驅動中。
3.1.2IIC匯流排驅動
IIC匯流排驅動是對IIC硬體體系結構中適配器端的實現,適配器可由CPU控制,甚至直接集成在CPU內部。匯流排驅動的職責,是為系統中每個I2C匯流排增加相應的讀寫方法。但是匯流排驅動本身並不會進行任何的通訊,它只是存在那裡,等待設備驅動調用其函數。
IIC匯流排驅動主要包含了IIC適配器數據結構i2c_adapter、IIC適配器的algorithm數據結構i2c_algorithm和控制IIC適配器產生通信信號的函數。經由IIC匯流排驅動的代碼,我們可以控制IIC適配器以主控方式產生開始位、停止位、讀寫周期,以及以從設備方式被讀寫、產生ACK等。
Busses文件夾下的i2c-mpc.c文件實現了PowerPC下I2C匯流排適配器驅動,定義描述了具體的I2C匯流排適配器的i2c_adapter數據結構,實現比較底層的對I2C匯流排訪問的具體方法。I2Cadapter構造一個對I2Ccore層介面的數據結構,並通過介面函數向I2Ccore注冊一個控制器。I2Cadapter主要實現對I2C匯流排訪問的演算法,iic_xfer()函數就是I2Cadapter底層對I2C匯流排讀寫方法的實現。同時I2Cadpter中還實現了對I2C控制器中斷的處理函數。
3.1.3IIC設備驅動
IIC設備驅動是對IIC硬體體系結構中設備端的實現,設備一般掛接在受CPU控制的IIC適配器上,通過IIC適配器與CPU交換數據。設備驅動則是與掛在I2C匯流排上的具體的設備通訊的驅動。通過I2C匯流排驅動提供的函數,設備驅動可以忽略不同匯流排控制器的差異,不考慮其實現細節地與硬體設備通訊。
IIC設備驅動主要包含了數據結構i2c_driver和i2c_client,我們需要根據具體設備實現其中的成員函數。
i2c-dev.c文件中實現了I2Cdriver,提供了一個通用的I2C設備的驅動程序,實現了字元類型設備的訪問介面,實現了對用戶應用層的介面,提供用戶程序訪問I2C設備的介面,包括實現open,release,read,write以及最重要的ioctl等標准文件操作的介面函數。我們可以通過open函數打開I2C的設備文件,通過ioctl函數設定要訪問從設備的地址,然後就可以通過read和write函數完成對I2C設備的讀寫操作。
通過I2Cdriver提供的通用方法可以訪問任何一個I2C的設備,但是其中實現的read,write及ioctl等功能完全是基於一般設備的實現,所有的操作數據都是基於位元組流,沒有明確的格式和意義。為了更方便和有效地使用I2C設備,我們可以為一個具體的I2C設備開發特定的I2C設備驅動程序,在驅動中完成對特定的數據格式的解釋以及實現一些專用的功能。
2. 用linux 調用內核中的統一I2C驅動 i2c總是 busy,求大神支招,謝謝! 程序很短
最近我也遇到這個問題了,糾結了一天,在網友的支持下解決了,這個天嵌的版本中,i2c和他的攝像頭驅動(OV9650驅動)相沖突,你在編譯內核之前,將攝像頭的驅動全部去掉,這樣子重新編譯之後,i2c就可以正常測試使用了。
3. 數字I2C介面,什麼是數字I2C介面
在介紹I2C匯流排結構之前。要搞清楚兩個概念:I2C匯流排控制器和I2C設備。I2C匯流排控制器為微控制器或微處理器提供控制I2C匯流排的介面,它控制所有I2C匯流排的特殊序列、協議、仲裁、時序,這里指MPC8250提供的I2C匯流排控制介面。
4. I2C介面與SPI和UART介面的區別
區別:SPI:高速同步串列口。
3~4線介面,收發獨立、可同步進行 UART:通用非同步串列口。
按照標准波特率完成雙向通訊,速度慢 SPI:一種串列傳輸方式,三線制,網上可找到其通信協議和用法的 3根線實現數據雙向傳輸 串列外圍介面 Serial peripheral interface UART:通用非同步收發器 UART是用於控制計算機與串列設備的晶元。
有一點要注意的是,它提供了RS-232C數據終 端設備介面,這樣計算機就可以和數據機或其它使用RS-232C介面的串列設備通信了 。
作為介面的一部分,UART還提供以下功能: 將由計算機內部傳送過來的並行數據轉換為輸出的串列數據流。
將計算機外部來的串列 數據轉換為位元組,供計算機內部使用並行數據的器件使用。
在輸出的串列數據流中加入 奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。
在輸出數據流中加入啟停標記, 並從接收數據流中刪除啟停標記。
處理由鍵盤或滑鼠發出的中斷信號(鍵盤和鼠票也是 串列設備)。
可以處理計算機與外部串列設備的同步管理問題。
有一些比較高檔的UART 還提供輸入輸出數據的緩沖區,現在比較新的UART是16550,它可以在計算機需要處理數 據前在其緩沖區內存儲16位元組數據,而通常的UART是8250。
現在如果購買一個內置的 數據機,此數據機內部通常就會有16550 UART。
I2C:能用於替代標準的並行匯流排,能連接的各種集成電路和功能模塊。
I2C是多主控匯流排,所以任何一個設備都能像主控器一樣工作,並控制匯流排。
匯流排上每一個設備都有一個獨一無二的地址,根據設備它們自己的能力,它們可以作為發射器或接收器工作。
多路微控制器能在同一個I2C匯流排上共存。
5. 1602液晶顯示屏在51單片機上用I2C協議驅動
去網路網頁搜51虛擬I2C,有很多相關資料和程序可供參考。
6. I2C是什麼
I²C(Inter-Integrated Circuit)是內部整合電路的稱呼,是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊裝置而發展。I²C(讀作"I-squared-C" ),還有可選的拼寫方式是I2C(讀作I-two-C)以及IIC(讀作I-I-C),在中國則多以"I方C"稱之。
拓展資料:
1. I2C匯流排是由Philips公司開發的一種簡單、雙向二線制同步串列匯流排。它只需要兩根線即可在連接於匯流排上的器件之間傳送信息。
2. 主器件用於啟動匯流排傳送數據,並產生時鍾以開放傳送的器件,此時任何被定址的器件均被認為是從器件.在匯流排上主和從、發和收的關系不是恆定的,而取決於此時數據傳送方向。如果主機要發送數據給從器件,則主機首先定址從器件,然後主動發送數據至從器件,最後由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件定址從器件.然後主機接收從器件發送的數據,最後由主機終止接收過程。在這種情況下.主機負責產生定時時鍾和終止數據傳送。
3. 在硬體上,12C匯流排只需要一根數據線和一根時鍾線兩根線,匯流排介面已經集成在晶元內部,不需要特殊的介面電路,而且片上介面電路的濾波器可以濾去匯流排數據上的毛刺.因此I2C匯流排簡化了硬體電路PCB布線,降低了系統成本,提高了系統可靠性。因為12C晶元除了這兩根線和少量中斷線,與系統再沒有連接的線,用戶常用IC可以很容易形成標准化和模塊化,便於重復利用。
4. I2C匯流排是一個真正的多主機匯流排,如果兩個或多個主機同時初始化數據傳輸,可以通過沖突檢測和仲裁防止數據破壞,每個連接到匯流排上的器件都有唯一的地址,任何器件既可以作為主機也可以作為從機,但同一時刻只允許有一個主機。數據傳輸和地址設定由軟體設定,非常靈活。匯流排上的器件增加和刪除不影響其他器件正常工作。
5. I2C匯流排可以通過外部連線進行在線檢測,便於系統故障診斷和調試,故障可以立即被定址,軟體也利於標准化和模塊化,縮短開發時問。連接到相同匯流排上的IC數量只受匯流排最大電容的限制,串列的8位雙向數據傳輸位速率在標准模式下可達100Kbit/s,快速模式下可達400Kbit/s,高速模式下可達3.4Mbit/s。
7. linux下怎麼直接使用iic介面
利用Linux中IIC設備子系統移植IIC設備驅動
背景描述
IIC匯流排在嵌入式系統中應用十分廣泛,常見的有eeprom,rtc。一般的處理器會包含IIC的控制器,用來完成IIC時序的控制;另外一方面,由於IIC的時序簡單,使用GPIO口來模擬時序也是常見的做法。面對不同的IIC控制器,各種各樣的晶元以及linux源碼,如何更快做好IIC設備驅動。
問題描述
在我們的方案中,我們會用到eeprom,rtc以及tw2865。由於Hi3520的IIC控制器設計有問題,無法正常使用。而IIC控制器的SDA和SCL管腳正好是和兩個GPIO管腳復用的。Hisi將控制gpio來實現IIC的時序,從而對IIC設備進行操作。這種設計方式簡單明了,但使用IIC子系統,可以更方便的移植和維護其他的設備驅動。
問題分析
Hisi對於gpio口,rtc晶元以及tw2865的處理方式如下:將gpio口做成一個模塊化的驅動,該驅動模擬IIC時序,並向外提供一些函數介面,比如:EXPORT_SYMBOL(gpio_i2c_read_tw2815);等。對於具體的rtc晶元,將其注冊為一個misc設備,並利用gpio模塊導出的函數進行rtc晶元的配置操作。
其實對於linux-2.6.24\drivers\i2c目錄下代碼,我們可以加以利用。
Linux的IIC字結構分為三個組成部分:
IIC核心
IIC核心提供了IIC匯流排驅動和設備驅動的注冊、注銷方法,IICalgorithm上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼。
IIC匯流排驅動
IIC匯流排驅動是對IIC硬體體系結構中適配器端的實現。
IIC設備驅動
IIC設備驅動是對IIC硬體體系總設備端的實現。
我們查看下該目錄下的makefile和kconfig:
obj-$(CONFIG_I2C_BOARDINFO) +=i2c-boardinfo.o
obj-$(CONFIG_I2C) += i2c-core.o
obj-$(CONFIG_I2C_CHARDEV) +=i2c-dev.o
obj-y +=busses/ chips/ algos/
i2c-core.c就是IIC核心,buses中的文件是主流處理器中IIC匯流排的匯流排驅動,而chips中的文件就是常用晶元的驅動,algos中的文件實現了一些匯流排適配器的algorithm,其中就包括我們要用到的i2c-algo-bit.c文件。
我們首先利用i2c-gpio.c和i2c-algo-bit.c做好匯流排驅動。
在i2c-gpio.c中,mole_initi2c_gpio_initplatform_driver_probe(&i2c_gpio_driver,i2c_gpio_probe);
將其注冊為platform虛擬匯流排的驅動。
在staticint __init i2c_gpio_probe(struct platform_device *pdev)中,
定義了如下三個結構體:
structi2c_gpio_platform_data *pdata;//平台相關的gpio的設置
structi2c_algo_bit_data *bit_data;//包含algorithm的具體函數,setor
get SDA和SCL
structi2c_adapter *adap;//適配器
i2c_gpio_probe主要做了下面幾件事:
填充bit_data結構的各個函數指針,關聯到具體的操作SDA和SCl函數。
填充adap結構,adap->algo_data= bit_data;
pdata= pdev->dev.platform_data;
bit_data->data= pdata;
pdev->dev->driver_data= adap;
在i2c-core中注冊適配器類型。
inti2c_bit_add_numbered_bus(struct i2c_adapter *adap)
在staticint i2c_bit_prepare_bus(struct i2c_adapter *adap)中
adap->algo= &i2c_bit_algo;
將i2c_bit_algo與adap關聯上。
static const structi2c_algorithm i2c_bit_algo = {
.master_xfer = bit_xfer,
.functionality = bit_func,
};
其中,master_xfer函數指針就是IIC傳輸函數指針。
I2c-algo-bit.c還實現了IIC開始條件,結束條件的模擬,發送位元組,接收位元組以及應答位的處理。
i2c-gpio.c中的i2c_gpio_setsda_val等函數是與具體平台gpio相關的。
修改對應arch-hi3520v100目錄下的gpio.h中的各個函數,這些函數是通過操作寄存器來控制gpio的方向和值。
在對應mach-hi3520v100中的platform-devices.c中添加如下:
static structi2c_gpio_platform_data pdata = {
.sda_pin = 1<<0,
.sda_is_open_drain = 1,
.scl_pin = 1<<1,
.scl_is_open_drain = 1,
.udelay = 4, /* ~100 kHz */
};
static struct platform_devicehisilicon_i2c_gpio_device = {
.name = "i2c-gpio",
.id = -1,
.dev.platform_data = &pdata,
};
static struct platform_device*hisilicon_plat_devs[] __initdata = {
&hisilicon_i2c_gpio_device,
};
int __inithisilicon_register_platform_devices(void)
{
platform_add_devices(hisilicon_plat_devs,ARRAY_SIZE (hisilicon_plat_devs));
return 0;
}
通過platform添加devices和driver,使得pdev->dev.platform_data=pdata
綜合上面的過程,我們完成了adapter的注冊,並將用gpio口模擬的algorithm與adapter完成了關聯。
這樣,在rtc-x1205.c中,x1205_attach函數利用i2c核心完成client和adap的關聯。
在x1205_probe函數中填充i2c_client結構體,並調用i2c_attach_client通知iic核心。
接著注冊rtc驅動。
最後我們要讀取時間,就需要構造i2c_msg結構體,如下所示:
struct i2c_msg msgs[] = {
{ client->addr, 0, 2,dt_addr }, /* setup read ptr */
{ client->addr, I2C_M_RD,8, buf }, /* read date */
};
/* read date registers */
if((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) {
dev_err(&client->dev,"%s: read error\n", __FUNCTION__);
return -EIO;
}
dt_addr是寄存器的地址,I2C_M_RD表示iicread。
8. 什麼是I2C,I2C有什麼作用
I²C(Inter-Integrated Circuit)是內部整合電路的稱呼,是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊裝置而發展。I²C(讀作"I-squared-C" ),還有可選的拼寫方式是I2C(讀作I-two-C)以及IIC(讀作I-I-C),在中國則多以"I方C"稱之。
I2C(Inter-Integrated Circuit)匯流排是由PHILIPS公司開發的兩線式串列匯流排,用於連接微控制器及其外圍設備。是微電子通信控制領域廣泛採用的一種匯流排標准。它是同步通信的一種特殊形式,具有介面線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。I2C 匯流排支持任何IC 生產過程(CMOS、雙極性)。通過串列數據(SDA)線和串列時鍾 (SCL)線在連接到匯流排的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控制器——MCU、LCD 驅動器、存儲器或鍵盤介面),而且都可以作為一個發送器或接收器(由器件的功能決定)。LCD 驅動器只能作為接收器,而存儲器則既可以接收又可以發送數據。除了發送器和接收器外,器件在執行數據傳輸時也可以被看作是主機或從機(見表1)。主機是初始化匯流排的數據傳輸並產生允許傳輸的時鍾信號的器件。此時,任何被定址的器件都被認為是從機。
特徵:
1、只要求兩條匯流排線路:一條串列數據線SDA,一條串列時鍾線SCL;
2、每個連接到匯流排的器件都可以通過唯一的地址和一直存在的簡單的主機/從機關系軟體設定地址,主機可以作為主機發送器或主機接收器;
3、它是一個真正的多主機匯流排,如果兩個或更多主機同時初始化,數據傳輸可以通過沖突檢測和仲裁防止數據被破壞;
4、串列的8 位雙向數據傳輸位速率在標准模式下可達100kbit/s,快速模式下可達400kbit/s,高速模式下可達3.4Mbit/s;
5、連接到相同匯流排的IC 數量只受到匯流排的最大電容400pF 限制。
9. 誰能告訴我I2C介面是什麼意思謝謝
大哥你的問題寫錯了吧, 應該是IC(2)小二吧,是計算機的一種控制技術,屬於兩線式串列匯流排,它由數據線SDA和時鍾SCL構成的串列匯流排,可發送和接收數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送,最高傳送速率100kbps。各種被控制電路均並聯在這條匯流排上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模塊都有唯一的地址,在信息的傳輸過程中,IC2匯流排上並接的每一模塊電路既是主控器(或被控器),又是發送器(或接收器),這取決於它所要完成的功能。CPU發出的控制信號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。這樣,各控制電路雖然掛在同一條匯流排上,卻彼此獨立,互不相關。