原文:http://blog.csdn.net/imho888/article/details/3861927
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总线驱动的问题,他是如此之复杂,以至于我们不得不静下心来,仔细的研究他的实现!