版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-.z.概述I2C只有兩條線,一條串行數(shù)據(jù)線:SDA,一條是時(shí)鐘線SCL.正因?yàn)檫@樣,它方便了工程人員的布線.用戶態(tài)實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)在Linu*核代碼文件i2c-dev.c中實(shí)現(xiàn)了I2C適配器設(shè)備文件的功能,針對(duì)每個(gè)適配器生成一個(gè)主設(shè)備號(hào)為89的設(shè)備節(jié)點(diǎn)〔次設(shè)備號(hào)為0-255〕,I2c-dev.c并沒(méi)有針對(duì)特定的設(shè)備而設(shè)計(jì),只是提供了通用的read(),write(),和ioctl()等文件操作接口,在用戶空間的應(yīng)用層就可以借用這些接口訪問(wèn)掛接在適配器上的I2C設(shè)備的存儲(chǔ)空間或存放器,并控制I2C設(shè)備的工作方式。i2c適配器的設(shè)備節(jié)點(diǎn)是/dev/i2c-*,其中*是數(shù)字。由于適配器編號(hào)是動(dòng)態(tài)分配的〔和注冊(cè)次序有關(guān)〕,所以想了解哪一個(gè)適配器對(duì)應(yīng)什么編號(hào),可以查看/sys/class/i2c-dev/目錄下的文件容。用戶態(tài)調(diào)用3.1、i2c-dev用戶空間操作i2c,需要包含以下頭文件。翻開(kāi)適配器對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)i2c-dev為翻開(kāi)的線程建立一個(gè)i2c_client,但是這個(gè)i2c_client并不加到i2c_adapter的client鏈表當(dāng)中。他是一個(gè)虛擬的臨時(shí)client,當(dāng)用戶翻開(kāi)設(shè)備節(jié)點(diǎn)時(shí),它自動(dòng)產(chǎn)生,當(dāng)用戶關(guān)閉設(shè)備節(jié)點(diǎn)時(shí),它自動(dòng)被釋放。3.2、ioctl()查看include/linu*/i2c-dev.h文件,可以看到i2c支持的IOCTL命令*defineI2C_RETRIES0*0701/*設(shè)置收不到ACK時(shí)的重試次數(shù)*/*defineI2C_TIMEOUT0*0702/*設(shè)置超時(shí)時(shí)限的jiffies*/*defineI2C_SLAVE0*0703/*設(shè)置從機(jī)地址*/*defineI2C_SLAVE_FORCE0*0706/*強(qiáng)制設(shè)置從機(jī)地址*/*defineI2C_TENBIT0*0704/*選擇地址位長(zhǎng):=0for7bit,!=0for10bit*/*defineI2C_FUNCS0*0705/*獲取適配器支持的功能*/*defineI2C_RDWR0*0707/*binedR/Wtransfer(oneSTOPonly)*/*defineI2C_PEC0*0708/*!=0tousePECwithSMBus*/*defineI2C_SMBUS0*0720/*SMBustransfer*/例如:1、設(shè)置重試次數(shù):ioctl(fd,I2C_RETRIES,m);設(shè)置適配器收不到ACK時(shí)重試的次數(shù)為m。默認(rèn)的重試次數(shù)為12、設(shè)置超時(shí)ioctl(fd,I2C_TIMEOUT,m);
設(shè)置SMBus的超時(shí)時(shí)間為m,單位為jiffies。3、設(shè)置從機(jī)地址ioctl(fd,I2C_SLAVE,addr);
ioctl(fd,I2C_SLAVE_FORCE,addr);
在調(diào)用read()和write()函數(shù)之前必須設(shè)置從機(jī)地址。這兩行都可以設(shè)置從機(jī)的地址,區(qū)別是第二行無(wú)論核中是否已有驅(qū)動(dòng)在使用這個(gè)地址都會(huì)成功,第一行則只在該地址空閑的情況下成功。由于i2c-dev創(chuàng)立的i2c_client不參加i2c_adapter的client列表,所以不能防止其它線程使用同一地址,也不能防止驅(qū)動(dòng)模塊占用同一地址。4、設(shè)置地址模式ioctl(file,I2C_TENBIT,select)
如果select不等于0選擇10bit地址模式,如果等于0選擇7bit模式,默認(rèn)7位模式。3.3數(shù)據(jù)包i2c發(fā)送或者接收一次數(shù)據(jù)都以數(shù)據(jù)包(structi2c_msg)封裝addr是設(shè)備從地址。flags是通信標(biāo)志,發(fā)送數(shù)據(jù)為0,接收數(shù)據(jù)為I2C_M_RD。len是數(shù)據(jù)長(zhǎng)度buf是傳輸數(shù)據(jù)3.4、承受數(shù)據(jù)設(shè)備驅(qū)動(dòng)中我們通常調(diào)用/driver/i2c/i2c-core.c定義的接口i2c_master_recv來(lái)接收一次數(shù)據(jù)。通過(guò)i2c_transfer調(diào)用數(shù)據(jù)包。inti2c_master_recv(structi2c_client*client,char*buf,intcount)
{
structi2c_adapter*adap=client->adapter;//獲取adapter信息structi2c_msgmsg;//定義一個(gè)臨時(shí)的數(shù)據(jù)包intret;msg.addr=client->addr;//將從機(jī)地址寫(xiě)入數(shù)據(jù)包msg.flags=client->flags&I2C_M_TEN;//將從機(jī)標(biāo)志并入數(shù)據(jù)包msg.flags|=I2C_M_RD;//將此次通信的標(biāo)志并入數(shù)據(jù)包msg.len=count;//將此次接收的數(shù)據(jù)字節(jié)數(shù)寫(xiě)入數(shù)據(jù)包msg.buf=buf;ret=i2c_transfer(adap,&msg,1);//調(diào)用平臺(tái)接口接收數(shù)據(jù)/*Ifeverythingwentok(i.e.1msgtransmitted),return*bytestransmitted,elseerrorcode.*/return(ret==1)"count:ret;//如果接收成功就返回字節(jié)數(shù)
}
E*PORT_SYMBOL(i2c_master_recv);參考驅(qū)動(dòng)i2c_master_recv()函數(shù)封裝屬于自己用戶態(tài)的承受函數(shù)。用戶態(tài)是通過(guò)ioctl(handle->fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)展數(shù)據(jù)交互。主要有2個(gè)步驟:首先是寫(xiě)入需要讀取的存放器的地址,然后從存放器中讀取數(shù)據(jù)。需要2個(gè)數(shù)據(jù)包。如下:3.5、發(fā)送數(shù)據(jù)設(shè)備驅(qū)動(dòng)中我們通常調(diào)用/driver/i2c/i2c-core.c定義的接口i2c_master_send來(lái)發(fā)送一次數(shù)據(jù)。通過(guò)i2c_transfer調(diào)用數(shù)據(jù)包inti2c_master_send(structi2c_client*client,constchar*buf,intcount)
{
intret;structi2c_adapter*adap=client->adapter;//獲取adapter信息structi2c_msgmsg;//定義一個(gè)臨時(shí)的數(shù)據(jù)包msg.addr=client->addr;//將從機(jī)地址寫(xiě)入數(shù)據(jù)包msg.flags=client->flags&I2C_M_TEN;//將從機(jī)標(biāo)志并入數(shù)據(jù)包msg.len=count;//將此次發(fā)送的數(shù)據(jù)字節(jié)數(shù)寫(xiě)入數(shù)據(jù)包msg.buf=(char*)buf;//將發(fā)送數(shù)據(jù)寫(xiě)入數(shù)據(jù)包ret=i2c_transfer(adap,&msg,1);//調(diào)用平臺(tái)接口發(fā)送數(shù)據(jù)/*Ifeverythingwentok(i.e.1msgtransmitted),return*bytestransmitted,elseerrorcode.*/return(ret==1)"count:ret;//如果發(fā)送成功就返回字節(jié)數(shù)
}
E*PORT_SYMBOL(i2c_master_send);參考驅(qū)動(dòng)i2c_master_send()函數(shù)封裝屬于自己用戶態(tài)的承受函數(shù)。用戶態(tài)是通過(guò)ioctl(handle->fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)展數(shù)據(jù)交互。每次要寫(xiě)入兩個(gè)字節(jié)數(shù)據(jù)主要包括寫(xiě)入的存放器地址和要寫(xiě)入的數(shù)據(jù)。只需發(fā)送一次數(shù)據(jù)包。如下:3.6、使用案例*include<stdio.h>*include<linu*/i2c.h>*include<linu*/i2c-dev.h>*include<ftl.h>*include<stdio.h>*include<unistd.h>*include<sys/ioctl.h>*include<string.h>*include<stdlib.h>*defineI2C_FILE_NAME"/dev/i2c-1"*defineI2C_ADDR0*40intfd;inti2c_open(){fd=open(I2C_FILE_NAME,O_RDWR);if(fd<0){perror("Unabletoopeni2ccontrolfile");return1;}}inti2c_write(intfd,unsignedchardev_addr,unsignedcharreg_addr,unsignedcharval){intret;unsignedcharbuf[2];structi2c_rdwr_ioctl_datadata;structi2c_msgmessages;buf[0]=reg_addr;buf[1]=val;messages.addr=dev_addr;//deviceaddressmessages.flags=0;//writemessages.len=2;messages.buf=buf;//dataaddressdata.msgs=&messages;data.nmsgs=1;if(ioctl(fd,I2C_RDWR,&data)<0){printf("writeioctlerr\n");return1;}usleep(1000);return1;}inti2c_read(intfd,unsignedcharaddr,unsignedcharreg,unsignedchar*val){intret;structi2c_rdwr_ioctl_datadata;structi2c_msgmessages[2];messages[0].addr=addr;//deviceaddressmessages[0].flags=0;//writemessages[0].len=sizeof(reg);messages[0].buf=®//dataaddressmessages[1].addr=addr;//deviceaddressmessages[1].flags=I2C_M_RD;//readmessages[1].len=sizeof(val);messages[1].buf=val;data.msgs=messages;data.nmsgs=2;if(ioctl(fd,I2C_RDWR,&data)<0){printf("readioctlerr\n");return1;}return0;}intmain(){inti;unsignedcharbuf[4];unsignedcharval[]={0*04,0*05,0*06,0*07};i2c_open();for(i=0;i<4;i++)i2c_write(fd,I2C_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 神州公司簡(jiǎn)介教學(xué)幻燈片
- 2025至2031年中國(guó)ABS工程塑料閥門(mén)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024至2030年中國(guó)自動(dòng)急速定型加硫機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)漿料球閥數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)強(qiáng)力蟲(chóng)殺星數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024年中國(guó)食品級(jí)聚丙烯酸鈉市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)螺桿清洗液市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)線切割電極線市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)電動(dòng)平衡叉車市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)控制設(shè)備市場(chǎng)調(diào)查研究報(bào)告
- “銷售技巧課件-讓你掌握銷售技巧”
- 2019北師大版高中英語(yǔ)選修一UNIT 2 單詞短語(yǔ)句子復(fù)習(xí)默寫(xiě)單
- 房地產(chǎn)項(xiàng)目保密協(xié)議
- 2023年云南省初中學(xué)業(yè)水平考試 物理
- 【安吉物流股份有限公司倉(cāng)儲(chǔ)管理現(xiàn)狀及問(wèn)題和優(yōu)化研究15000字(論文)】
- 火災(zāi)自動(dòng)報(bào)警系統(tǒng)施工及驗(yàn)收調(diào)試報(bào)告
- 《13464電腦動(dòng)畫(huà)》自考復(fù)習(xí)必備題庫(kù)(含答案)
- 中國(guó)成人血脂異常防治指南課件
- 2023塔式太陽(yáng)能熱發(fā)電廠集熱系統(tǒng)設(shè)計(jì)規(guī)范
- 消費(fèi)稅改革對(duì)商貿(mào)企業(yè)的影響與對(duì)策
- 識(shí)別藥用植物種類-識(shí)別藥用被子植物
評(píng)論
0/150
提交評(píng)論