Hi John,

here's the code and some new's: After inserting a sleep between 
write and read I get plausible values (between 0x0 and 0x3 when 
grounded).
I think the code is ok so far?
I try experimenting with the delay time.

greez, Klaus



#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/ioctl.h"
#include "fcntl.h"
#include "time.h"
#include "string.h"
#include <asm/etraxi2c.h>

/* defintions for address byte */
#define PCF8591_BASE_ADDRESS 0x90
#define PCF8591_WRITE_MODE   0x00
#define PCF8591_READ_MODE    0x01
#define PCF8591_DEVICE_1     0x00
#define PCF8591_DEVICE_2     0x02
#define PCF8591_DEVICE_3     0x04
#define PCF8591_DEVICE_4     0x06
#define PCF8591_DEVICE_5     0x08
#define PCF8591_DEVICE_6     0x0A
#define PCF8591_DEVICE_7     0x0C
#define PCF8591_DEVICE_8     0x0E

/* defintions for control byte */
#define PCF8591_BASE_CONTROL 0x00
#define PCF8591_OUTPUT_ON    0x40
#define PCF8591_OUTPUT_OFF   0x00
#define PCF8591_4_SINGLE     0x00
#define PCF8591_3_DIFF       0x10
#define PCF8591_MIXED        0x20
#define PCF8591_2_DIFF       0x30
#define PCF8591_AUTO_INC     0x04
#define PCF8591_CHANNEL_0    0x00
#define PCF8591_CHANNEL_1    0x01
#define PCF8591_CHANNEL_2    0x02
#define PCF8591_CHANNEL_3    0x03


// Global variables
int fd_i2c;


int I2C_Open(void) {
fd_i2c = open("/dev/i2c", O_RDWR);
if (fd_i2c <= 0) {
printf("I2C: open error on /dev/i2c\n");
return(-1);
}

return(0);
}

void I2C_Close(void) {
close(fd_i2c);
}

int main(int argc, char **argv) {
int retcode;
float vref=5.15f;

retcode = I2C_Open();
if (retcode != 0) {
exit(1);
}

I2C_DATA i2cdata;
int i=0;
int ch=0;
for (ch=0; ch<4; ch++) {
        printf ("Reading channel: %i\n", ch);
        for (i=0; i<5; i++) {
                // now use a register write 1 byte to register 1 and 
read it back (pcf8591)
                i2cdata.reg = 1;
                i2cdata.length = 1;
                i2cdata.slave = (PCF8591_BASE_ADDRESS | 
PCF8591_DEVICE_1 | PCF8591_WRITE_MODE);
                i2cdata.data[0] = (PCF8591_BASE_CONTROL | 
PCF8591_OUTPUT_OFF | PCF8591_4_SINGLE | PCF8591_CHANNEL_0)+ch;
                printf ("PCF8591 control byte: 0x%x\n", 0x00ff & 
i2cdata.data[0]); 
                ioctl(fd_i2c, _IO(ETRAXI2C_IOCTYPE, I2C_WRITEREG_N), 
&i2cdata);
                sleep (1);
        
                i2cdata.reg = 1;
                i2cdata.length = 1;
                i2cdata.data[0] = 0;
                ioctl(fd_i2c, _IO(ETRAXI2C_IOCTYPE, I2C_READREG_N), 
&i2cdata);
        
                printf ("PCF8591 returned: 0x%x = %6.2fV\n", 0x00ff 
& i2cdata.data[0], vref/255.0f*(float)i2cdata.data[0]); 
                sleep (1);
        }
}
I2C_Close();

return(0);
}


Reply via email to