# re: Linux I2C 驱动阅读的碰到的一些网上没有提到的东西 回复 更多评论
2009-04-11 13:39 by
楼主,你好。我看了你那篇《Linux I2C核心、总线与设备驱动[转]》,让我明白了不少,不过我还是有些不明白的地方,想请教一下。
我挂的I2C设备是只可以写的,不能读,所以只有一个写从机地址,可是当我调用内核的I2C驱动时发现,写操作执行后,在示波器上看到,在开始信号之后,它先发送完从机地址并接收到应答信号,可之后立即出现了一个停止信号(我后面还有数据要发的呀),然后又开始发送从机地址,并在收到应答后又出现一个停止位,如此反复;
在我下面的程序运行时,只在示波器上抓到四组这样“开始—从机地址—应答—停止”的信号,却没有看到我接下来要发数据,同时还打印出“Remote I/O error”的错误,我先把我的程序贴一下,希望能得到你的指点,谢谢
#define I2C_TENBIT 0x704
#define I2C_SLAVE 0x703
#define CHIP_ADDR 0x30 >> 1 // 7 bits for fm31256 address
#define IO_DEV "/dev/i2c-0"
main(int argc, char *argv[])
{
unsigned char REG_WRITE=0X30; /*写地址*/
unsigned char data=0xf4;
int ret;
ret=0;
if ((fd = open(IO_DEV, O_RDWR)) < 0)
perror("open i2c_adpter error");
else //设置I2C访问模式
{
if(ioctl(fd,I2C_TENBIT,0))
perror("set i2c 7bits address mode error");
if(ioctl(fd,I2C_SLAVE,CHIP_ADDR))
perror("set device address error");
}
if((ret = write (fd, REG_WRITE, 1))!= 1)//发从机地址
{
perror("set address error"); //这里打印Remote I/O error
}
else
{
if (write (fd, &data, 1))!= 1)//发送数据,但在示波器上没有 看到date的值
perror("write date error"); //这里打印Remote I/O error
}
return 0;
}
# re: Linux I2C 驱动阅读的碰到的一些网上没有提到的东西 回复 更多评论
2009-04-27 21:16 by
我想,发送4次是因为I2C核心的重发,因些可以看到,核心已经在每次发送时检测到错误了,4次失败后就给应用报错了。我不知你用的是什么CPU,很可能是I2C驱动的问题。你可能多printk一下。