使用C语言和i2c-dev驱动
原文地址:blog.csdn.NET/wyt2013/article/details/20740659 感謝作者分享。
在本博客的《使用Beaglebone Black的I2C(一)》中,介紹了BBB上無(wú)需編程對(duì)i2c總線(xiàn)進(jìn)行讀寫(xiě)操作的方法,本文將介紹如何在C語(yǔ)言程序中使用i2c-dev驅(qū)動(dòng)來(lái)操作i2c設(shè)備。
以下將還以前文中使用過(guò)的L3G4200D三軸陀螺儀為例。
BBB自帶了i2c-dev驅(qū)動(dòng),它使用ioctl方法對(duì)i2c設(shè)備進(jìn)行配置,然后利用read()、write()函數(shù)就可以操作i2c設(shè)備了。
要操作某個(gè)i2c設(shè)備,首先要確定它的地址。按照我在前文中的說(shuō)法,通常i2cdetect顯示的器件地址是由“7位”二進(jìn)制數(shù)換算成的,而器件的讀寫(xiě)地址則需要將這7位左移,然后在末尾添加一個(gè)1或0。但是對(duì)于i2c-dev驅(qū)動(dòng)來(lái)說(shuō),我們不必費(fèi)此周折,只要告訴他i2cdetect顯示的那個(gè)地址就可以了,驅(qū)動(dòng)會(huì)自動(dòng)根據(jù)你的讀操作或?qū)懖僮鱽?lái)相應(yīng)地在末尾添加1或者0。
先把完整程序擺出來(lái):
上面的程序首先打開(kāi)/dev/i2c-1這個(gè)設(shè)備,然后用ioctl配置成slave模式。然后通過(guò)將第0x20這個(gè)寄存器寫(xiě)成0x0f來(lái)使能陀螺儀。然后在for循環(huán)中依次讀取0x29和0x28兩個(gè)寄存器的值并輸出,這兩個(gè)寄存器一起組成了X軸的角速度值。
程序輸出如下:
運(yùn)行了兩次,第一次陀螺儀靜止(但輸出仍有一點(diǎn)小波動(dòng)),第二次陀螺儀在晃動(dòng)。可以看到輸出值的不同。
需要注意的一點(diǎn),讀i2c設(shè)備時(shí)如何定位讀取的位置?
使用lseek()的話(huà)會(huì)返回-1,這個(gè)是不可行的。答案就是程序中,用write()寫(xiě)一個(gè)字節(jié)。write函數(shù)參數(shù)中的buf數(shù)組里的第一項(xiàng)代表了write的位置,從第二項(xiàng)開(kāi)始是寫(xiě)入的內(nèi)容,因此只寫(xiě)一個(gè)字節(jié)就是把指針移動(dòng)過(guò)去了但是不寫(xiě)入任何內(nèi)容。
用這個(gè)方法就無(wú)需其他驅(qū)動(dòng)也可以操作任意i2c外設(shè)了。
另外有個(gè)疑問(wèn)。按理說(shuō)執(zhí)行?read(file, rbuf, 10); 的話(huà),可以讀出當(dāng)前指針位置開(kāi)始的10個(gè)字節(jié)的內(nèi)容。我在其他設(shè)備上也驗(yàn)證了這點(diǎn)。但是在L3G4200D陀螺儀上,一次讀取10個(gè)的話(huà),讀出的就全是一樣的數(shù)值,都是第一個(gè)數(shù)值。所以只能一位一位地讀取。難道是陀螺儀芯片有意設(shè)置成這樣?(這個(gè)現(xiàn)象跟我在《使用Beaglebone Black的I2C(一)》中的問(wèn)題相符,即執(zhí)行?i2cdump -y 1 0x69 c?會(huì)導(dǎo)致輸出全部是一樣的,都是第一個(gè)字節(jié)的內(nèi)容。把c參數(shù)去掉才可以。)
轉(zhuǎn)載于:https://www.cnblogs.com/muhuacat/p/7246040.html
總結(jié)
以上是生活随笔為你收集整理的使用C语言和i2c-dev驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 如何使用 Elasticsearc
- 下一篇: ES6,新增数据结构Set的用法