设为首页 加入收藏

TOP

i2c 驱动编程接口(四)
2012-12-06 13:36:39 来源: 作者: 【 】 浏览:1303
Tags:i2c  驱动 编程 接口

 

    [cpp]

    int i2c_master_recv(struct i2c_client *client, char *buf ,int count)

    {

    struct i2c_adapter *adap=client->adapter;  // 获取adapter信息

    struct i2c_msg msg;                        // 定义一个临时的数据包

    int ret;

    msg.addr = client->addr;                   // 将从机地址写入数据包

    msg.flags = client->flags & I2C_M_TEN;     // 将从机标志并入数据包

    msg.flags |= I2C_M_RD;                     // 将此次通信的标志并入数据包

    msg.len = count;                           // 将此次接收的数据字节数写入数据包

    msg.buf = buf;

    ret = i2c_transfer(adap, &msg, 1);         // 调用平台接口接收数据

    /* If everything went ok (i.e. 1 msg transmitted), return #bytes

    transmitted, else error code. */

    return (ret == 1) count : ret;           // 如果接收成功就返回字节数

    }

    EXPORT_SYMBOL(i2c_master_recv);

    i2c_master_recv 接口的三个参数:client 为此次与主机通信的从机,buf 为接收的数据指针,count 为接收数据的字节数.我们看一下 i2c_transfer 接口的参数说明:

    [cpp

    int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);

    其中 adap 为此次主机与从机通信的适配器;msgs 为通信的数据包,这里可以是单个或多个数据包;num 用于指定数据包的个数,如果大于1则表明将进行不止一次的通信.通信一次就需要寻址一次,如果需要多次通信就需要多次寻址,前面2个接口都是进行一次通信,所以 num 为1;有的情况下我们要读一个寄存器的值,就需要先向从机发送一个寄存器地址然后再接收数据,这样如果想自己封装一个接口就需要将 num 设置为2.接口的返回值如果失败则为负数,如果成功则返回传输的数据包个数.比如读一个寄存器的接口可以按照如下方式封装:

    [cpp]

    static int read_reg(struct i2c_client *client, unsigned char reg, unsigned char *data)

    {

    int ret;

    struct i2c_msg msgs[] = {

    {

    .addr   = client->addr,

    .flags  = 0,

    .len    = 1,

    .buf    = &reg,  // 寄存器地址

    },

    {

    .addr   = client->addr,

    .flags  = I2C_M_RD,

    .len    = 1,

    .buf    = data,  // 寄存器的值

    },

    };

    ret = i2c_transfer(client->adapter, msgs, 2);  // 这里 num = 2,通信成功 ret = 2

    if (ret < 0)

    tp_err(“%s error: %d\n”, __func__, ret);

    return ret;

    }

    还可调用前面所述的接口封装:

    [cpp]

    static unsigned char read_reg(struct i2c_client *client, unsigned char reg)

    {

    unsigned char buf;

    i2c_master_send(client, &reg, 1);  // 发送寄存器地址

    i2c_master_recv(client, &buf, 1);  // 接收寄存器的值

    return  buf;

    }

        

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇小议C++中const的实现机制 下一篇C++获取zip文件列表

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: