TI中文支持网
TI专业的中文技术问题搜集分享网站

ti的I2C编程 关于PCF8563

背景: 购买了开发板里面具有I2C驱动(/dev/i2c-1),但是它的驱动是不开源的。

网络上i2c的对这驱动文件的读写方式,有两种:一种是read/write函数;另外一种是ioctl函数控制。

下面使用参考网络上使用ioctl控制的,但是发现寄存器的值没有被写入,读取出来的值也不对。。

这是什么原因?? 或者ti有什么关于i2c的代码可以参考的。

#include <stdio.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/i2c-dev.h>

#include <linux/i2c.h>

#define CHIP "/dev/i2c-1"#define CHIP_ADDR 0x51

int main(){ int fd = open(CHIP, O_RDWR); if (fd < 0) { printf("open "CHIP"failed\n"); goto exit; } struct i2c_msg msg; unsigned char rddata; unsigned char rdaddr[] = {0xA3,0x05}; unsigned char wrbuf[] = {0xA2,0x05,0x02}; // unsigned char testaddr[] = {0x51,0xA2,0x06,0x02}; struct i2c_rdwr_ioctl_data ioctl_data; struct i2c_msg msgs[2]; //写入数据
msgs[0].addr = CHIP_ADDR; msgs[0].len = 3; //3
msgs[0].buf = wrbuf; ioctl_data.nmsgs = 1; ioctl_data.msgs = &msgs[0]; printf("ioctl write,return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data)); //开始读取数据
sleep(1); msgs[0].addr = CHIP_ADDR; msgs[0].len = 2; //2
msgs[0].buf = rdaddr; msgs[1].addr = CHIP_ADDR; msgs[1].flags |= I2C_M_RD; msgs[1].len = 1; msgs[1].buf = &rddata; ioctl_data.nmsgs = 1; ioctl_data.msgs = msgs; printf("ioctl write address, return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data)); ioctl_data.msgs = &msgs[1]; printf("ioctl read, return :%d\n", ioctl(fd, I2C_RDWR, &ioctl_data)); printf("rddata: %x\r\n", rddata);close: close(fd);exit: return 0;}

Steven Liu1:

是什么平台?什么开发板?

如果是AM335x的话,可以看看这个:http://processors.wiki.ti.com/index.php/Sitara_Linux_SDK_I2C_Interface

andarm lin1:

回复 Steven Liu1:

使用的是TQ335 ,不明白内核里面:

1、static struct i2c_board_info am335x_i2c0[] = { { I2C_BOARD_INFO("pcf8563", 0x51) },

2、 对应的设备地址:0x51

#define I2C_BOARD_INFO(dev_type, dev_addr) \ .type = dev_type, .addr = (dev_addr)

3、疑惑是:这里的0x51和PCF8563的读写地址。0xA3,,0xA2?是什么关系。

     我的应用程序上,读写上,有哪里是理解错了??

赞(0)
未经允许不得转载:TI中文支持网 » ti的I2C编程 关于PCF8563
分享到: 更多 (0)