版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一、概述I2C只有兩條線,一條串行數(shù)據(jù)線:SDA,一條是時(shí)鐘線SCL.正因?yàn)檫@樣,它方便了工程人員的布線.二、用戶態(tài)實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)在Linux內(nèi)核代碼文件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并沒有針對(duì)特定的設(shè)備而設(shè)計(jì),只是提供了通用的read(),write(),和ioctl()等文件操作接口,在用戶空間的應(yīng)用層就可以借用這些接口訪問掛接在適配器上的I2C設(shè)備的存儲(chǔ)空間或寄存器,并控制I2C設(shè)備的工作方式。i2c適配器的設(shè)備節(jié)點(diǎn)是/dev/i2c-x,其中x是數(shù)字。由于適配器編號(hào)是動(dòng)態(tài)分配
2、的(和注冊(cè)次序有關(guān)),所以想了解哪一個(gè)適配器對(duì)應(yīng)什么編號(hào),可以查看/sys/class/i2c-dev/目錄下的文件內(nèi)容。三、用戶態(tài)調(diào)用i2c-dev用戶空間操作i2c,需要包含以下頭文件。#include#include打開適配器對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)inti2c_open()(fd=open(H/dev/i2c-1,O_RDWR);if(fdadapter;/獲取adapter信息structi2c_msgmsg;/定義一個(gè)臨時(shí)的數(shù)據(jù)包intret;msg.addr=client-addr;/將從機(jī)地址寫入數(shù)據(jù)包msg.flags=client-flags&I2C_M_TEN;/將從機(jī)標(biāo)志并入數(shù)據(jù)
3、包msg.flags|=I2C_M_RD;/將此次通信的標(biāo)志并入數(shù)據(jù)包msg.len=count;/將此次接收的數(shù)據(jù)字節(jié)數(shù)寫入數(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ù)EXPORT_SYMBOL(i2c_master_recv);參考驅(qū)動(dòng)i2c_master_recv()函數(shù)封裝屬于自己用戶
4、態(tài)的接受函數(shù)。用戶態(tài)是通過ioctl(handle-fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)行數(shù)據(jù)交互。主要有2個(gè)步驟:首先是寫入需要讀取的寄存器的地址,然后從寄存器中讀取數(shù)據(jù)。需要2個(gè)數(shù)據(jù)包。如下:inti2c_readCintunsignedcharaddr,unsignedcharegunsignedchar*val)intret;structi2c_dw_t0i:tl_d+tadata;structt2c_Fsgmessages2;messagesmessagesmessagesnessogesmessagesmessagesmessagesMessages1111ad
5、dr=messagesmessagesmessagesnessogesmessagesmessagesmessagesMessages1111flags-*/writeflags*len=sizeof(reg5ibuf=/registeraddress.addr=add;/device己dd電匕主.flags=I2C_M_RD;/readflags,len=sV2eof(val);.buf=vali/recivedatadatm,msgs=messages;data,nnsgs=2;IZCRONR,adapter;/獲取adapter信息structi2c_msgmsg;/定義一個(gè)臨時(shí)的數(shù)據(jù)包
6、msg.addr=client-addr;/將從機(jī)地址寫入數(shù)據(jù)包msg.flags=client-flags&I2C_M_TEN;/將從機(jī)標(biāo)志并入數(shù)據(jù)包msg.len=count;/將此次發(fā)送的數(shù)據(jù)字節(jié)數(shù)寫入數(shù)據(jù)包msg.buf=(char*)buf;/將發(fā)送數(shù)據(jù)寫入數(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ù)EXP
7、ORT_SYMBOL(i2c_master_send);參考驅(qū)動(dòng)i2c_master_send()函數(shù)封裝屬于自己用戶態(tài)的接受函數(shù)。用戶態(tài)是通過ioctl(handle-fd,I2C_RDWR,&data)函數(shù)與i2c從設(shè)備進(jìn)行數(shù)據(jù)交互。每次要寫入兩個(gè)字節(jié)數(shù)據(jù)主要包括寫入的寄存器地址和要寫入的數(shù)據(jù)。只需發(fā)送一次數(shù)據(jù)包。如下:inttiewrite(intfd.unsignedchardevaddunsignedcharregadd.unsignedcharvmL)(intret;unsignedcharbuf2;structrdirtQctldatadata;structi2c._nsgmes
8、sages;buf0=r&g_addr;/registerdatabuf|1=val;/senddatamessages.addr-dev_addr;/deviceaddressmessages.flags=0;/writeflagsmessages.len=2;messages.buf=buf;data.msgs=Kmessages;ddta.nnsgs=1;if(toctl(fdfIZC_RDWRj&data)0)printf(rwriteioctlerrffi11);return1;)usleepf1600);看#include#include#include#include#inclu
9、de#includetLln1;#include#include#include#include#include#include使用案例#include#include#include#defineI2C_FILE_NAME/dev/i2c-1#defineI2C_ADDR0 x40intfd;inti2c_open()fd=open(I2C_FILE_NAME,O_RDWR);if(fd0)perror(Unabletoopeni2ccontrolfile);return1;TOC o 1-5 h zinti2c_write(intfd,unsignedchardev_addr,unsign
10、edcharreg_addr,unsignedcharval)intret;unsignedcharbuf2;structi2c_rdwr_ioctl_datadata;structi2c_msgmessages;buf0=reg_addr;buf1=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)prin
11、tf(writeioctlerrn);return1;usleep(1000);return1;inti2c_read(intfd,unsignedcharaddr,unsignedcharreg,unsignedchar*val)一intret;structi2c_rdwr_ioctl_datadata;structi2c_msgmessages2;messages0.addr=addr;/deviceaddressmessages0.flags=0;/writemessages0.len=sizeof(reg);messages0.buf=/dataaddressmessages1.add
12、r=addr;/deviceaddressmessages1.flags=I2C_M_RD;/readmessages1.len=sizeof(val);messages1.buf=val;data.msgs=messages;data.nmsgs=2;if(ioctl(fd,I2C_RDWR,&data)0)printf(readioctlerrn);return1;return0;intmain()inti;unsignedcharbuf4;unsignedcharval=0 x04,0 x05,0 x06,0 x07;i2c_open();for(i=0;i4;i+)i2c_write(fd,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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é)約用水用電宣傳主題教育方案
- 2025年人工智能醫(yī)療影像輔助診斷技術(shù)發(fā)展報(bào)告
- 教師師德師風(fēng)建設(shè)現(xiàn)狀及提升方案
- 銀行AI算力資源池化方案
- 拉纜施工方案(3篇)
- 水庫垂釣應(yīng)急預(yù)案(3篇)
- 大學(xué)露營活動(dòng)方案策劃(3篇)
- 暴雨應(yīng)急預(yù)案面試(3篇)
- 漏水探測(cè)施工方案(3篇)
- 活動(dòng)策劃方案數(shù)字玩法(3篇)
- 廣西南寧市江南區(qū)維羅中學(xué)2025屆數(shù)學(xué)九上期末統(tǒng)考試題含解析
- 軟件測(cè)試方案模板(完整版)
- 復(fù)方蒲公英注射液在類風(fēng)濕關(guān)節(jié)炎中的應(yīng)用研究
- 假體隆胸護(hù)理查房
- 財(cái)險(xiǎn)保險(xiǎn)述職報(bào)告
- 2.3河流長江的開發(fā)與治理(第2課時(shí))-八年級(jí)地理上冊(cè)上課課件(人教版)
- 房屋評(píng)估報(bào)告
- 唐山首鋼馬蘭莊鐵礦有限責(zé)任公司礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 城市軌道交通工程竣工驗(yàn)收管理培訓(xùn)
- 護(hù)理學(xué)第三章 第四節(jié) 人體力學(xué)在護(hù)理工作的應(yīng)用
- 人性秘籍-絕密人性系列
評(píng)論
0/150
提交評(píng)論