i2c总线设备测试应用程序
时间:2010-03-11 来源:cao5170
i2c总线设备测试应用程序
既然是应用程序无非就是read,write。是的如果没有算法加进来的话,就是这样的,更何况这是一个测试程序!
首先介绍一个系统总线(设备)给大家,如果有人接受不了这个概念可以先把它了解清楚再继续阅读,如果觉得自己还可以忍受一会儿的话,我们在后面的i2c总线中给大家详细解释。
[root@Intel rtc]# ll /dev/i2c-0
这个目录就是我们的i2c总线设备(它对应我们的i2c总线适配器),你可以把它简单的理解为总线,我们后面的操作其实就是对总线的读和写。
Code 1:
fd = open(I2C_DEV, O_RDWR);// I2C_DEV /dev/i2c-0
if(fd < 0){
printf("####i2c test device open failed####\n");
return (-1);
}
res = ioctl(fd,I2C_TENBIT,0); //not 10bit
res = ioctl(fd,I2C_SLAVE,CHIP_ADDR); //设置I2C从设备地址[6:0]
上面是打开该设备的源码,并进行了相关的设置,这里需要了解一点i2c总线的知识,简单的给大家提两句,i2c是工作在主从模式下的,也就是说不关是读还是写都是由工作在主模式下的i2c设备发起的。I2c主设备在发送的命令中包含i2c从设备的地址,也就是上面的CHIP_ADDR,这个地址是由phips公司提供给生产i2c设备芯片的厂商的。我们这个芯片的地址是0x68 [6:0]。
打开该设备之后我们对他进行读写,这里还需要了解一点i2c总线的知识,关于读写的时序!
在写i2c从设备寄存器的时候,先发送的是从设备的地址,然后是要写入的寄存器的偏移地址,最后是数据,当然你可以写一个寄存器或者多个,只要给出基址就可以了;在读从设备的时候稍微复杂一点点,先要写入要读写的从设备的寄存器偏移量,然后在再读取数据! 这里有一个细节大家一定要注意,读写是由控制位决定的,由从设备地址(7位)加上1位读写控制位,组成了一个字节! 有了上面的这些介绍我们就不难理解下面的这两个读写函数: Code 2: static int read_HWclock(int fd, char buff[], int addr, int count) { int res; if(write(fd,&addr,1)!=1) //写地址失败 return -1; res=read(fd,buff,count); printf("read %d byte at 0x%x\n", res, addr); return res; } static int write_HWclock(int fd, char buff[], int addr, int count) { int res; int i,n; static char sendbuffer[PAGE_SIZE+1]; memcpy(sendbuffer+1, buff, count); sendbuffer[0]=addr; for(n=0; n<sizeof(sendbuffer); n++) printf("0x%x, ", sendbuffer[n]); res=write(fd,sendbuffer,count+1); printf("write %d byte at 0x%x\n", res, addr); } 好了,既然已经写道这里,我们直接给出结果就可以了: [root@Intel rtc]#./readrtc 07/10/27 6 17:23:20 [root@Intel rtc]# 这个测试结果显然是令人满意了,现在大可放心,这个八只脚的笑臭虫,还是很听话的! 测试结束之后,我们就可以沐浴更衣,去探讨i2c总线驱动的问题,他是如此之复杂,以至于我们不得不静下心来,仔细的研究他的实现!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/imho888/archive/2009/02/05/3861927.aspx
在写i2c从设备寄存器的时候,先发送的是从设备的地址,然后是要写入的寄存器的偏移地址,最后是数据,当然你可以写一个寄存器或者多个,只要给出基址就可以了;在读从设备的时候稍微复杂一点点,先要写入要读写的从设备的寄存器偏移量,然后在再读取数据! 这里有一个细节大家一定要注意,读写是由控制位决定的,由从设备地址(7位)加上1位读写控制位,组成了一个字节! 有了上面的这些介绍我们就不难理解下面的这两个读写函数: Code 2: static int read_HWclock(int fd, char buff[], int addr, int count) { int res; if(write(fd,&addr,1)!=1) //写地址失败 return -1; res=read(fd,buff,count); printf("read %d byte at 0x%x\n", res, addr); return res; } static int write_HWclock(int fd, char buff[], int addr, int count) { int res; int i,n; static char sendbuffer[PAGE_SIZE+1]; memcpy(sendbuffer+1, buff, count); sendbuffer[0]=addr; for(n=0; n<sizeof(sendbuffer); n++) printf("0x%x, ", sendbuffer[n]); res=write(fd,sendbuffer,count+1); printf("write %d byte at 0x%x\n", res, addr); } 好了,既然已经写道这里,我们直接给出结果就可以了: [root@Intel rtc]#./readrtc 07/10/27 6 17:23:20 [root@Intel rtc]# 这个测试结果显然是令人满意了,现在大可放心,这个八只脚的笑臭虫,还是很听话的! 测试结束之后,我们就可以沐浴更衣,去探讨i2c总线驱动的问题,他是如此之复杂,以至于我们不得不静下心来,仔细的研究他的实现!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/imho888/archive/2009/02/05/3861927.aspx
相关阅读 更多 +