Here is the c++ code snippets...pretty basic and follows the documentation
that I have seen.
I2C::I2C(int channel, int addr) {
char file[40];
sprintf(file,"/dev/i2c-%d",channel);
if((fd = open(file,O_RDWR)) < 0) {
cout << "ERROR Opening File" << endl;
status = -1; return; }
if(ioctl(fd,I2C_SLAVE,addr) < 0) {
cout << "ERROR Opening Device" << endl;
status = -1; return; }
status = 0;
}
int I2C::get_status() {
return status;
}
int I2C::write_address(unsigned char reg) {
buf[0] = reg;
if(write(fd,buf,1) != 1) {
return -1;
}
return 0;
}
int I2C::write_byte(unsigned char reg, unsigned char data) {
buf[0] = reg;
buf[1] = data;
if(write(fd,buf,2) != 2) {
return -1;
}
return 0;
}
int I2C::write_masked_byte(unsigned char reg, unsigned char data, unsigned
char mask) {
unsigned char currentData;
if(write_address(reg) != 0) {
return -1;
}
if(read_current_byte(currentData) != 0) {
return -2;
}
data = (currentData & ~mask) | (data & mask);
return write_byte(reg,data);
}
int I2C::read_current_byte(unsigned char &data) {
if(read(fd,buf,1) != 1) {
return -1;
}
data = buf[0];
return 0;
}
int I2C::read_current_bytes(unsigned char *data, int num_bytes) {
if(read(fd,data,num_bytes) != 1) {
return -1;
}
return 0;
}
int I2C::read_byte(unsigned char reg, unsigned char &data) {
if(write_address(reg) != 0) {
return -1;
}
return read_current_byte(data);
}
int I2C::read_multiple_bytes(unsigned char reg, unsigned char *data,
intnum_bytes
) {
if(write_address(reg) != 0) {
return -1;
}
return read_current_bytes(data,num_bytes);
} I do not really see what would cause such a delay here, other than the
actual system calls (and that i2c-clock issue in my last post). Anything
that I am missing? -Joey