新聞中心
總覽:

在Linux應(yīng)用中,I2C接口操作是很常見的,I2C口和SPI口一樣,都是串行接口的一種,其特點是數(shù)據(jù)傳輸速率較慢,但是使用線路簡單,能夠與多個設(shè)備進行通訊。本文將為大家介紹如何在Linux中使用i2c接口,并對常用i2c外設(shè)進行詳細的操作指南。
之一部分:i2c接口的介紹
i2c接口(Inter-Integrated Circuit)是一個由任意數(shù)目的主機、從機和總線構(gòu)成的串行總線標(biāo)準(zhǔn)。i2c是一種串行通信協(xié)議,由Philips公司開發(fā),主要用于集成電路(IC)之間短距離通信。
i2c總線的主要特點是使用雙線傳輸,包含一個時鐘線SCL(Serial Clock Line)和一個數(shù)據(jù)線SDA(Serial Data Line)。i2c總線和SPI總線不同,它是一種多主機的通信方式,即在同一個總線上可以連接多個主機和多個從機,所有設(shè)備都共享一個時鐘和數(shù)據(jù)線。i2c總線上的設(shè)備地址是可編程的,而且一般默認(rèn)都是使用7位的地址,更高位為0表示寫操作,更高位為1表示讀操作。
第二部分:i2c內(nèi)核驅(qū)動
i2c設(shè)備的驅(qū)動程序分為兩類,一種是適用于User Space(用戶空間)的I2C驅(qū)動,另一種是適用于Kernel Space(內(nèi)核空間)的I2C驅(qū)動。
在Linux內(nèi)核中,i2c驅(qū)動已經(jīng)被內(nèi)置,因此只需要在驅(qū)動模塊中進行引用即可,我們可以使用以下命令來查看當(dāng)前內(nèi)核是否已經(jīng)集成了i2c設(shè)備驅(qū)動:
# ls /dev/i2c*
在i2c設(shè)備驅(qū)動中,需要使用以下頭文件:
#include
另外,我們還需要使用以下結(jié)構(gòu)體和函數(shù):
struct i2c_msg – 這個結(jié)構(gòu)體定義了一個I2C數(shù)據(jù)交換緩沖區(qū)
struct i2c_rdwr_ioctl_data– 這個結(jié)構(gòu)體定義了一個完整的I2C數(shù)據(jù)交換序列,包含多個msg
ioctl()函數(shù) – 這個函數(shù)用于處理I2C數(shù)據(jù)鏈路路徑的IO控制請求
使用以下命令即可在驅(qū)動中配置i2c設(shè)備:
# modprobe i2c-dev
在使用i2c總線接口與外設(shè)通訊時,首先需要通過I2C函數(shù)來打開I2C設(shè)備:
fd = open(“/dev/i2c-0”, O_RDWR);
其中fd就是打開設(shè)備返回的文件描述符。可以使用以下函數(shù)來配置I2C的從設(shè)備地址、寄存器地址等相關(guān)信息。
ioctl(fd, I2C_SLAVE, slave_address);
這里slave_address就是所要訪問的從設(shè)備地址。使用了一些通用的ioctl()來進行I2C鏈路的控制。
接下來便可以通過write()和read()函數(shù)來訪問I2C從設(shè)備中的寄存器和信息等。
第三部分:常用i2c從設(shè)備操作
1. i2c溫度傳感器
當(dāng)想控制一個需要知道溫度變化的應(yīng)用程序時,可以考慮使用I2C溫度傳感器。這里我們以LMT84溫度傳感器為例,來介紹如何使用I2C讀取溫度值。
在對i2c數(shù)據(jù)鏈路路徑的IO控制請求中,我們需要指定讀取8位的溫度值,并將高+低2位數(shù)據(jù)進行轉(zhuǎn)換:
unsigned char buf[2] = {0};
struct i2c_msg msg_recv[] = {
{slave_address, I2C_M_RD, 2, buf}
};
struct i2c_rdwr_ioctl_data rdwr_data_recv = {
msgs : msg_recv,
nmsgs : 1
};
ioctl(fd, I2C_RDWR, &rdwr_data_recv);
int temp = (buf[0]
temp >>= 5;
temp *= 100;
temp >>= 6;
如上代碼,我們使用I2C數(shù)據(jù)交換緩沖區(qū)結(jié)構(gòu)體struct i2c_msg,向i2c設(shè)備進行讀取,并將讀取數(shù)據(jù)放在buf數(shù)組中。
2. i2c觸摸屏
i2c觸摸屏是一種常見的I2C外設(shè),它可以幫助我們實現(xiàn)人機交互的界面操作。觸摸屏常常使用ADS7843芯片,通過I2C協(xié)議與主控制器通訊。我們可以通過I2C設(shè)備驅(qū)動程序,對ADS7843芯片進行初始化參數(shù)配置,實現(xiàn)I2C觸摸屏的基本操作。
初始化I2C:
int gs_i2c_module_open( void )
{
int iResult = 0;
iResult = open( “/dev/i2c-1”, O_RDWR );
if( iResult
printf( “%s : %d , error-code = %d\n”, __func__, __LINE__, errno );
return iResult;
}
return iResult;
}
初始化ADS7843:
int gs_i2c_adc_init( void )
{
i2c_api_open();
i2c_api_write_byte( ADS7843_CMD_MODE );
i2c_api_write_byte( ADS7843_SER_START );
i2c_api_write_byte( ADS7843_CMD_CONTROL1 );
i2c_api_write_byte( ( 0
i2c_api_write_byte( ADS7843_CMD_CONTROL2 );
i2c_api_write_byte( ( 0
i2c_api_write_byte( ADS7843_CMD_START );
return 0;
}
讀取X、Y坐標(biāo)值和觸摸狀態(tài):
#define GS_ST_RETRY (0)
#define GS_ST_FL (1)
#define GS_ST_SUCCESS (2)
int gs_i2c_adc_read( gs_point_t *pst_coord )
{
unsigned short us_x = 0, us_y = 0;
unsigned char uc_i = 0, uc_count = 25;
i2c_api_open();
for( uc_i = 0; uc_i
{
i2c_api_write_byte( ADS7843_CMD_START );
usleep( 200 );
us_x = i2c_api_read_word( ADS7843_CMD_READ_X );
usleep( 200 );
us_y = i2c_api_read_word( ADS7843_CMD_READ_Y );
if( us_x = 4000 || us_y = 4000 )
{
continue;
}
us_x = gs_adc_x_raw_to_value( us_x );
us_y = gs_adc_y_raw_to_value( us_y );
pst_coord->us_x = us_x;
pst_coord->us_y = us_y;
pst_coord->uc_scale = 0;
return GS_ST_SUCCESS;
}
return GS_ST_FL;
}
在手機和平板等移動設(shè)備的控制中,通常都會用到I2C接口。iPhone和iPad中的感應(yīng)器、大多數(shù)Android設(shè)備的觸摸屏都是通過I2C與主機通訊的,因此I2C接口成為當(dāng)今移動設(shè)備上最重要的控制方式之一。
相關(guān)問題拓展閱讀:
- ARM開發(fā)板linux下用I2C讀取mpu6050的數(shù)據(jù)
- linux內(nèi)核中i2c總線驅(qū)動對所有的i2c設(shè)備是否是通用的
ARM開發(fā)板linux下用I2C讀取mpu6050的數(shù)據(jù)
linux 內(nèi)核版本銀談? 有可能內(nèi)核里已經(jīng)有mpu6050的driver了,如果有的話并且編譯進內(nèi)核的花/sys下應(yīng)該有對應(yīng)的文件,讀取的話要看driver怎么寫;直接通過/dev/下鋒茄碰的i2c總線節(jié)點也可以納卜讀,不過需要地址
如果是像德州儀派滑液器這種奇葩的mcu來讀取,那塵物么地址是0x68,但如果是像stm32或atmel8051這種比較正常的mcu來讀取,那么讓芹地址就是0xd0。德州儀器的i2c地址和其他許多種mcu相比,右偏了一位。
linux內(nèi)核中i2c總線驅(qū)動對所有的i2c設(shè)備是否是通用的
i2C總線的驅(qū)動程序一般針對不同的CPU是不一樣的,所歲帆以都位于arch目錄下對應(yīng)的cpu架構(gòu)的common文件夾下。
對同一種架轎雀和構(gòu)的來看,I2C驅(qū)動僅實現(xiàn)底層的通信。故其是通閉盯用的。
linux 應(yīng)用端i2c接口的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 應(yīng)用端i2c接口,Linux應(yīng)用:i2c接口操作指南,ARM開發(fā)板linux下用I2C讀取mpu6050的數(shù)據(jù),linux內(nèi)核中i2c總線驅(qū)動對所有的i2c設(shè)備是否是通用的的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動、聯(lián)通機房等。
標(biāo)題名稱:Linux應(yīng)用:i2c接口操作指南(linux應(yīng)用端i2c接口)
網(wǎng)頁URL:http://www.dlmjj.cn/article/dpdjccg.html


咨詢
建站咨詢
