结合ioctl和at24c02的介绍,写了个at24c02的测试程序
测试硬件平台:TQ2440、at24c02
内核版本:linux-2.6.37.1
读写单独分开成两个小程序。源码如下:
写测试程序:
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int num, err, i, j;
int fd, addr;
char *buff;
printf("please input as:");
printf("./wat24 [data]\n");
fflush(stdout);
if(argc < 3){
printf("arg error\n");
return -1;
}
num = argc - 1;
buff = malloc(num*sizeof(char));
if(buff < 0){
printf("alloc failed\n");
return -1;
}
buff[0] = atoi(argv[1]);
printf("write data:\n");
for(i = 1; i < num; i++){
buff[i] = atoi(argv[i + 1]);
printf("%d\n",buff[i]);
}
printf("from word addr:%d\n",buff[0]);
fd = open("/dev/i2c-0",O_RDWR);
if(fd < 0){
printf("device open failed\n");
return -1;
}
err = ioctl(fd, I2C_SLAVE_FORCE, 0x50);
if(err < 0){
printf("ioctl failed:%d\n",err);
return -1;
}
write(fd, buff, num);
close(fd);
return 0;
}
at24c02的写操作可以直接调用write()函数实现。
可以直接进行byte write 或者 page write
在进行page write的时候需要计算好页的起始地址。
程序的使用如下:
page write
./wat24 0 1 2 3 4 5 6 7 8
表示从at24c02中word address为0的地址开始写入1~8。
./wat24 1 1 2 3 4 5 6 7 8
表示从at24c02中的word address为1的地址开始写入1~8数据,但是1是page0内的地址,地址非页对齐。
所以最后在page0内的数据是8 1 2 3 4 5 6 7,8被写到page0的首地址处了。
byte write
./wat24 255 1
byte write相对简单。255表示at24c02中的一个地址,1是向此地址中写入的数据。
读测试程序
#include
#include
#include
#include
#include
#include
struct i2c_rdwr_ioctl_data rdwrdata;
int main(int argc, char *argv[])
{
int i, err;
int fd;
char wordaddr;
char *rdbuf1;
char *rdbuf2;
int bytenum;
if(argc < 3){
printf("please input as:");
printf("./rat24 [read byte addr] [read num of byte]\n");
return -1;
}
wordaddr = atoi(argv[1]);
bytenum = atoi(argv[2]);
printf("%d\n",bytenum);
rdwrdata.msgs = (struct i2c_msg *)malloc(2*sizeof(struct i2c_msg));
if(!rdwrdata.msgs){
printf("rdwrdata.msgs malloc failed!\n");
return -1;
}
rdbuf1 = (unsigned char *)malloc(sizeof(char));
rdbuf2 = (unsigned char *)malloc(bytenum*sizeof(char));
if((!rdbuf1) || (!rdbuf2)){
printf("rdbuf malloc failed!\n");
return -1;
}
rdwrdata.nmsgs = 2;
(rdwrdata.msgs[0]).addr = 0x50;
(rdwrdata.msgs[0]).len = 1;
(rdwrdata.msgs[0]).flags = 0;
(rdwrdata.msgs[0]).buf = rdbuf1;
(rdwrdata.msgs[0]).buf[0] = wordaddr;
(rdwrdata.msgs[1]).addr = 0x50;
(rdwrdata.msgs[1]).len = bytenum;
(rdwrdata.msgs[1]).flags = I2C_M_RD;
(rdwrdata.msgs[1]).buf = rdbuf2;
fd = open("/dev/i2c-0",O_RDWR);
if(fd < 0){
printf("i2c device open failed!\n");
return -1;
}
err = ioctl(fd, I2C_SLAVE_FORCE, 0x50);
if(err < 0){
printf("ioctl failed\n");
return -1;
}
err = ioctl(fd, I2C_RDWR, &rdwrdata);
if(err < 0){
printf("ioctl msgs error, error number:%d\n", err);
return -1;
}
printf("read %d byte data from at24c02 word address 0x%02x:\n",bytenum, wordaddr);
for(i = 0; i < bytenum; i++)
printf("%d\n", rdbuf2[i]);
close(fd);
return 0;
}
at24c02的read总共有三种
1.current read
2.sequential read
3.random read
其中1和2可以直接通过read系统调用实现
3.的话就需要通过ioctl(,I2C_RDWR,)来实现。
上述程序就是实现这个功能的,可以实现at24c02的random read。
random read
./rat24 0 256
表示从at24c02的word address为0的地址开始读取256个字节数据
./rat24 0 8
表示从at24c02的word address为0的地址开始读取8个字节的数据,即读取page0的数据。