版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、I2C只有兩條線,一條串行數(shù)據(jù)線:SDA1條是時(shí)鐘線SCLE因?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)分配的(和注冊(cè)次
2、序有關(guān)),所以想了解哪一個(gè)適配器對(duì)應(yīng)什么編號(hào),可以查看/sys/class/i2c-dev/目錄下的文件內(nèi)容。三、用戶態(tài)調(diào)用3.1、 i2c-dev用戶空間操作i2c,需要包含以下頭文件。打開適配器對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)i2c-dev為打開的線程建立一個(gè)i2c_client,但是這個(gè)i2c_client并不加到i2c_adapter的client鏈表當(dāng)中。他是一個(gè)虛擬的臨時(shí)client,當(dāng)用戶打開設(shè)備節(jié)點(diǎn)時(shí),它自動(dòng)產(chǎn)生,當(dāng)用戶關(guān)閉設(shè)備節(jié)點(diǎn)時(shí),它自動(dòng)被釋放。3.2、 ioctl()查看include/linux/i2c-dev.h文件,可以看到i2c支持的IOCT僚令1. #define?I2C_RET
3、RIES?0x0701?/*置收不到ACK時(shí)的重試次數(shù)*/?2. #define?I2C_TIMEOUT?0x0702?/*歿置超時(shí)時(shí)限的jiffies?*/?3. #define?I2C_SLAVE?0x0703徼置從機(jī)地址?*/?4. #define?I2C_SLAVE_FORCE?0x0706?/*?制設(shè)置從機(jī)地址?*/?5. #define?I2C_TENBIT?0x0704?感擇地址位長:=0?for?7bit?,?!=?0?for?10?bit?*/?6. #define?I2C_FUNCS?0x0705?獲取適配器支持的功能?*/?7. #define?I2C_RDWR?0x07
4、07?/*Combined?R/W?transfer?(one?STOP?only)?*/?8. #define?I2C_PEC?0x0708?/*?!=?0?to?use?PEC?with?SMBus?*/?9. #define?I2C_SMBUS?0x0720?/*SMBus?transfer?*/?例如: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
5、,addr);ioctl(fd,I2C_SLAVE_FORCE,addr);在調(diào)用read()和write()函數(shù)之前必須設(shè)置從機(jī)地址。這兩行都可以設(shè)置從機(jī)的地址,區(qū)別是第二行無論內(nèi)核中是否已有驅(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位模式。1.3、 據(jù)包i2c
6、發(fā)送或者接收一次數(shù)據(jù)都以數(shù)據(jù)包(structi2c_msg注寸裝addr是設(shè)備從地址。flags是通信標(biāo)志,發(fā)送數(shù)據(jù)為0,接收數(shù)據(jù)為I2C_M_RDlen是數(shù)據(jù)長度buf是傳輸數(shù)據(jù)1.4、 接受數(shù)據(jù)設(shè)備驅(qū)動(dòng)中我們通常調(diào)用/driver/i2c/i2c-core.c定義的接口i2c_master_recv來接收一次數(shù)據(jù)。通過i2c_transfer調(diào)用數(shù)據(jù)包。inti2c_master_recv(structi2c_client*client,char*buf,intcount)?structi2c_adapter*adap=client->adapter;/獲取adapter信息?str
7、ucti2c_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ù)包??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),ret
8、urn#bytes?transmitted,elseerrorcode.*/?return(ret=1)?count:ret;/如果接收成功就返回字節(jié)數(shù)??EXPORT_SYMBOL(i2c_master_recv);?參考驅(qū)動(dòng)i2c_master_recv()®數(shù)封裝屬于自己用戶態(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ù)包。如下:1.5、 發(fā)送數(shù)據(jù)設(shè)備驅(qū)動(dòng)中我們通常調(diào)用/driver/i2c/i2c-co
9、re.c定義的接口?i2c_master_send來發(fā)送一次數(shù)據(jù)。通過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ī)地址寫入數(shù)據(jù)包??msg.flags=client->flags&I2C_M_TEN;相從機(jī)標(biāo)志并入數(shù)
10、據(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#bytes?transmitted,elseerrorcode.*/?return(ret=1)?count:ret;/如果發(fā)送成功就返回字節(jié)數(shù)??EXPORT_SYMBOL(i2c_master_send);?參考驅(qū)動(dòng)i2c_master_send()®數(shù)封裝
11、屬于自己用戶態(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ù)包。如下:1.6、 使用案例1.2.3.4.5.6.7.#include<stdio.h>#include<linux/i2c.h>#include<linux/i2c-dev.h>#include<fcntl.h>#include<stdio.h>#include<unistd.h>#include&
12、lt;sys/ioctl.h>8. #include<string.h>9. #include<stdlib.h>10. #defineI2C_FILE_NAME"/dev/i2c-1"11. #defineI2C_ADDR0x4012. intfd;13. inti2c_open()14. 15. fd=open(I2C_FILE_NAME,O_RDWR);16. if(fd<0)17. perror("Unabletoopeni2ccontrolfile");18. return1;19. 20. 21. inti
13、2c_write(intfd,unsignedchardev_addr,unsignedcharreg_addr,unsignedcharval)22. 23. intret;24. unsignedcharbuf2;25. structi2c_rdwr_ioctl_datadata;26. structi2c_msgmessages;27. buf0=reg_addr;28. buf1=val;29. messages.addr=dev_addr;/deviceaddress30. messages.flags=0;/write31. messages.len=2;32. messages.
14、buf=buf;/dataaddress33. data.msgs=&messages;34. data.nmsgs=1;35. if(ioctl(fd,I2C_RDWR,&data)<0)36. printf("writeioctlerr'n");37. return1;38. 39. usleep(1000);40. return1;41. 42. inti2c_read(intfd,unsignedcharaddr,unsignedcharreg,unsignedchar*val)43. 44. intret;45. structi2c_
15、rdwr_ioctl_datadata;46. structi2c_msgmessages2;47. messages0.addr=addr;/deviceaddress48. messages0.flags=0;/write49. messages0.len=sizeof(reg);50. messages0.buf=®/dataaddress51. messages1.addr=addr;/deviceaddress52. messages1.flags=I2C_M_RD;/read53. messages1.len=sizeof(val);54. messages1.buf=val;55. data.msgs=messages;56. data.nmsgs=2;57. if(ioctl(fd,I2C_RDWR,&data)<0)58. printf("readioctlerr'n");59. returnl;60. 61. return。;62. 63. intmain()64. 65. inti;66. unsignedcharbuf4;67. unsignedcharval=0x04,0x05,0x06,0x07;68. i2c_open();69. for(i=0;i<4;i+)70. i2c
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【KS5U原創(chuàng)】新課標(biāo)2021年高二暑假化學(xué)作業(yè)(八)
- 【創(chuàng)新設(shè)計(jì)】(人教)2020-2021高中化學(xué)選修五【分層訓(xùn)練】4-3-蛋白質(zhì)和核酸
- 【創(chuàng)新設(shè)計(jì)】2020-2021學(xué)年高中物理人教版選修3-1練習(xí):1.10-電容器的電容
- 【名師一號(hào)】2020-2021學(xué)年高中地理人教版必修三-雙基限時(shí)練7
- 【2021春走向高考】2022屆高三歷史(岳麓版)一輪復(fù)習(xí):階段性測試題10
- 保定市2022高考英語閱讀理解選練(1)答案
- 2021廣東韶關(guān)市高考英語自選練習(xí)(3)及答案
- 《結(jié)直腸癌教學(xué)》課件
- 【學(xué)練考】2021-2022學(xué)年高一歷史岳麓版必修1練習(xí)冊(cè):單元測評(píng)一-
- 【名師一號(hào)】2020-2021學(xué)年高中數(shù)學(xué)人教B版必修2雙基限時(shí)練9(第一章)
- 解剖篇2-1內(nèi)臟系統(tǒng)消化呼吸生理學(xué)
- 《小學(xué)生錯(cuò)別字原因及對(duì)策研究(論文)》
- 便攜式氣體檢測報(bào)警儀管理制度
- 酒店安全的管理制度
- (大潔王)化學(xué)品安全技術(shù)說明書
- 2022年科學(xué)道德與學(xué)術(shù)規(guī)范知識(shí)競賽決賽題庫(含答案)
- 市場調(diào)查與預(yù)測期末復(fù)習(xí)試題10套含答案
- 呼吸內(nèi)科國家臨床重點(diǎn)??平ㄔO(shè)項(xiàng)目評(píng)分標(biāo)準(zhǔn)試行
- 煤炭質(zhì)量分級(jí)及低位發(fā)熱量計(jì)算
- 通用個(gè)人全年工資表模板
- 帶電作業(yè)車庫技術(shù)規(guī)范書
評(píng)論
0/150
提交評(píng)論