1、qu
/* * @description : 从ap3216c读取多个寄存器数据 * @param - dev: ap3216c设备 * @param - reg: 要读取的寄存器首地址 * @param - val: 读取到的数据 * @param - len: 要读取的数据长度 * @return : 操作结果 */ static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len) { int ret; struct i2c_msg msg[2]; struct i2c_client *client = (struct i2c_client *)dev->private_data; /* msg[0]为发送要读取的首地址 */ msg[0].addr = client->addr; /* ap3216c地址 */ msg[0].flags = 0; /* 标记为发送数据 */ msg[0].buf = ® /* 读取的首地址 */ msg[0].len = 1; /* reg长度*/ /* msg[1]读取数据 */ msg[1].addr = client->addr; /* ap3216c地址 */ msg[1].flags = I2C_M_RD; /* 标记为读取数据*/ msg[1].buf = val; /* 读取数据缓冲区 */ msg[1].len = len; /* 要读取的数据长度*/ ret = i2c_transfer(client->adapter, msg, 2); if(ret == 2) { ret = 0; } else { printk("i2c rd failed=%d reg=%06x len=%d\n",ret, reg, len); ret = -EREMOTEIO; } return ret; }
/* * @description : 向ap3216c多个寄存器写入数据 * @param - dev: ap3216c设备 * @param - reg: 要写入的寄存器首地址 * @param - val: 要写入的数据缓冲区 * @param - len: 要写入的数据长度 * @return : 操作结果 */ static s32 ap3216c_write_regs(struct ap3216c_dev *dev, u8 reg, u8 *buf, u8 len) { u8 b[256]; struct i2c_msg msg; struct i2c_client *client = (struct i2c_client *)dev->private_data; b[0] = reg; /* 寄存器首地址 */ memcpy(&b[1],buf,len); /* 将要写入的数据拷贝到数组b里面 */ msg.addr = client->addr; /* ap3216c地址 */ msg.flags = 0; /* 标记为写数据 */ msg.buf = b; /* 要写入的数据缓冲区 */ msg.len = len + 1; /* 要写入的数据长度 */ return i2c_transfer(client->adapter, &msg, 1); }
2 单
/* * @description : 向AP3216C写入数据 * @param - addr: 设备地址 * @param - reg : 要写入的寄存器 * @param - data: 要写入的数据 * @return : 操作结果 */ unsigned char ap3216c_writeonebyte(unsigned char addr,unsigned char reg, unsigned char data) { unsigned char status=0; unsigned char writedata=data; struct i2c_transfer masterXfer; /* 配置I2C xfer结构体 */ masterXfer.slaveAddress = addr; /* 设备地址 */ masterXfer.direction = kI2C_Write; /* 写入数据 */ masterXfer.subaddress = reg; /* 要写入的寄存器地址 */ masterXfer.subaddressSize = 1; /* 地址长度一个字节 */ masterXfer.data = &writedata; /* 要写入的数据 */ masterXfer.dataSize = 1; /* 写入数据长度1个字节 */ if(i2c_master_transfer(I2C1, &masterXfer)) status=1; return status; } /* * @description : 从AP3216C读取一个字节的数据 * @param - addr: 设备地址 * @param - reg : 要读取的寄存器 * @return : 读取到的数据。 */ unsigned char ap3216c_readonebyte(unsigned char addr,unsigned char reg) { unsigned char val=0; struct i2c_transfer masterXfer; masterXfer.slaveAddress = addr; /* 设备地址 */ masterXfer.direction = kI2C_Read; /* 读取数据 */ masterXfer.subaddress = reg; /* 要读取的寄存器地址 */ masterXfer.subaddressSize = 1; /* 地址长度一个字节 */ masterXfer.data = &val; /* 接收数据缓冲区 */ masterXfer.dataSize = 1; /* 读取数据长度1个字节 */ i2c_master_transfer(I2C1, &masterXfer); return val; }
关于底层 的–
i2c_master_transfer reg的实现
原文地址:http://www.cnblogs.com/cnchengv/p/16858017.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性