#?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;
}