我们输入如下图所示命令,查找 I2C2 对应的设备节点,我们查找如下图所示:
.
所以 I2C2 设备的地址是 0038,对应的节点是 dev 下面的 i2c-1。如果我们要在终结者的上和触摸芯片FT5X06 进行通信,只要操作 dev 下的 i2c-1 这个节点就可以了。
那我们怎么在应用层操作 I2C 呢?应用层操作 I2C 是以数据包进行交流的,所以我们在应用层就要进行封包的操作。数据包对应的结构体是 i2c_rdwr_ioctl_data,这个结构体定义在 includeuapilinuxi2c-dev.h 下面:定义如下:
/* This is the structure as used in the I2C_RDWR ioctl call */
struct i2c_rdwr_ioctl_data
{
struct i2c_msg __user *msgs; /* pointers to i2c_msgs */
__u32 nmsgs; /* number of i2c_msgs */
};
第一个结构体成员是我们要发送的数据包的指针,第二个结构体成员是发送数据包的个数。
我们来看一下 i2c_msg 结构体的定义,这个结构体是定义在 includeuapilinuxi2c.h 下面,定义如下:
struct i2c_msg
{
__u16 addr; /* slave address */
__u16 flags;
#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
#define I2C_M_RD 0x0001 /* read data, from slave to master */
#define I2C_M_STOP 0x8000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_NOSTART */
#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
__u16 len; /* msg length */
__u8 *buf; /* pointer to msg data */
};
结构体成员 addr 是我们从机的地址,flags 为读写标志位,如果 flags 为 1,则为读,反之为 0,则为写。len 为 buf 的大小,单位是字节。当 flags 为 1 是,buf 就是我们要接收的数据,当 flags 为 0 时,就是我们要发送的数据。
那么我们要怎么设计我们的程序呢?我们来看一下。
/*
* @Author: topeet
* @Description: 应用程序与 I2c 通信
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int fd;
int ret;