BeagleBone Black I2C总线相关操作

连接
接线要点:共地(一定得共否则问题很多),SDA、SCL分别和从设备的SDA、SCL对应连接。
下图中我的i2c从设备是TI的9B92,已经给它写好了i2c的程序(i2c地址为0x22),也就是它已经有自己的id了。
连接主要就是三根线(GND、I2C2_SDA、I2C2_SCL)。I2C2对应系统里面的1通道,即/dev/i2c-1。
BeagleBone Black 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。

你可能感兴趣的:(i2c,beagleboneblack)