新聞中心
總覽:

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


咨詢
建站咨詢
