|
我的i2c驱动程序没有问题,可以对eeprom进行读写,但是在读写g-sensor(加速度传感器,也是一款支持i2c总线的芯片,里面带有一些寄存器)时出现了问题,测试程序和读写eeprom的差不多,只是将slave address由0x50改成了0x1d,将原来读写eeprom存储空间改成了读写寄存器的值(不知道读eeprom里面的数据和读寄存器的值方法是不是一样?),现在就出现了read address error的错误,我检查了芯片上的sda和scl均有信号,不知道是怎么回事,感觉是mcu根本没有识别这个从设备,也就是说res = ioctl(fd, I2C_SLAVE,CHIP_ADDR);这句程序是无效的,那么怎么判断这个从设备已经挂上去了呢?我的这个错误可能是什么原因呢?希望做过类似开发的指点一下,不胜感激!!!
附测试程序代码:
#include
#include
#include
#include
#include
#include
#include
#include "pvidef.h"
#include "i2c.h"
#include "i2c-dev.h"
#define CHIP_ADDR 0x1d //g-sensor的slave address
#define PAGE_SIZE 256
#define I2C_DEV "/dev/i2c-0"
static int read_eeprom(int fd, char buf[], int addr, int count)
{
int res;
if(write(fd, &addr, 1)!=1) //错误出现在这里!
{
printf("read address error\n");
return -1;
}
res = read(fd, buf, count);
printf("The character you input is: %s\n", buf);
return res;
}
static int write_eeprom(int fd, char buff[], int addr, int count)
{
int res;
int i;
static char sendbuffer[PAGE_SIZE];
memcpy(sendbuffer+1, buff, count);
sendbuffer[0] = addr; //enable write 24C16
if(write(fd, &addr, 1)!=1)
{
printf("write address error\n");
return -1;
}
res = write(fd, sendbuffer, count+1);
}
int i2c_main(void)
{
int fd, n, res,sn_size;
unsigned char buf_rd[10];
fd = open(I2C_DEV,O_RDWR);
if(fd<0)
{
printf("open failed###\n");
return -1;
}
res = ioctl(fd, I2C_TENBIT, 0); //7位slave address
res = ioctl(fd, I2C_SLAVE,CHIP_ADDR);
read_eeprom(fd, buf_rd, 32, 1); //读g-sensor寄存器的值,寄存器的地址为20h(即32),长度为1个字节
return 0;
}
|
|