BeagleBone Black I2C总线相关操作

来源:互联网 发布:佛山市数据开放平台 编辑:程序博客网 时间:2024/05/21 11:33
连接
接线要点:共地(一定得共否则问题很多),SDA、SCL分别和从设备的SDA、SCL对应连接。
下图中我的i2c从设备是TI的9B92,已经给它写好了i2c的程序(i2c地址为0x22),也就是它已经有自己的id了。
连接主要就是三根线(GND、I2C2_SDA、I2C2_SCL)。I2C2对应系统里面的1通道,即/dev/i2c-1。


使用i2c探测命令查看是连接正确:
root@BBB-CAN:~# i2cdetect -y -r 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- 22 -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- UU UU UU UU -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                        

可以看到已经有22设备,不清楚为什么会出现50和51

Python操作i2c
如果使用Python来操作i2c的话需要安装python-smbus模块:
    先更新安装包库:opkg update
    安装python-smbus库:opkg install python-smbus
     导入smbus模块
     >>> import smbus
     创建1通道上的总线
     >>> bus = smbus.SMBus(1)
     向总线的0x22地址(即i2c地址)的0号寄存器写0x11
     >>> bus.write_byte_data(0x22, 0x00, 0x11)
     向总线的0x22地址(即i2c地址)的0号到4号寄存器写分别写1,2,3,4,5
     >>> bus.write_i2c_block_data(0x22, 0x00, [1,2,3,4,5])
     使用好之后close一下
     >>>bus.close()

C语言操作i2c
/*** BeagleBone Black I2C Bus* trb* 2013-12-13* ©ynsoft.cn*/// 相关头文件:#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <linux/i2c-dev.h>int main(int argc, char *argv[]){ int fd, i; // 写缓存,第一个字节为i2c器件中起始地址(寄存器地址) unsigned char wbuf[] = {0x10,0,1,2}; // 读缓存 unsigned char rbuf[4] = {0x10}; // 打开i2c总线1,需要根据具体情况来的打开 fd = open("/dev/i2c-1", O_RDWR); if(!fd){  printf("open i2c fail\n");  exit(1); } // 设置i2c从地址(我测试用的i2c从设备地址为0x22) // I2C_SLAVE_FORCE表示强制设置不管有没有其他进程在使用i2c驱动 // I2C_SLAVE是温柔型的 if(ioctl(fd, I2C_SLAVE_FORCE, 0x22) < 0){  printf("ioctl fail\n");  exit(2); } // 向i2c设备(地址为0x22的从设备)0x10起始的地方写入3个字节,wbuf第一个值代表起始地址 write(fd, wbuf, 4); // 下面是读出测试 // 读之前先设置开始读的位置 // 当write的第三个参数为1的时候就只是设置起始地址(该地址在rbuf第一个字节指定)的作用 write(fd, rbuf, 1);    // 设置完成之后开始连续读出3个,其实就是刚刚写进去的那三个 read(fd, rbuf+1, 3); // 下面只是简单输出 // 器件没有问题的话输出的应该和之前写入的一样 for(i=1; i<4; ++i){  printf("%02x ", rbuf[i]); } printf("\n"); // 最后关闭文件 close(fd); return 0;}


当然,如果喜欢的话你也完全可以使用Python来操作i2c文件,而不去使用smbus。

0 0