Hi all,

I already broken my head with i2c bit banging mode time ago, whithout the
phrozen patch (because I hadn't when I wrote my code)

If you are interested to, I'll post here the code needed to write to/read
from the PCF8591 and PCF8574
Please note that I've used a custom type for storing the A/D converter
values, a stupid typedef with 4 unsigned chars inside named vect4d.

It works with the functions you can find on the user space bit banging
method tutorial...
I can assure you that it works because I'm actually using it :)

vect4d ADConRead(unsigned char addr) {
 unsigned char address; /* Base address: 1001 000X */
 vect4d temp;
 address = addr;
    i2c_start();
       if (i2c_outbyte(address)==0) {
           //printf("NACK received %d\n",__LINE__);
           i2c_stop();
       }

       if (i2c_outbyte(4)==0) {
           //printf("NACK received %d\n",__LINE__);
           i2c_stop();
       }
       i2c_stop();

       // Read the A/D value

       i2c_start();
       if (i2c_outbyte(address+1)==0) {
           //printf("NACK received %d\n",__LINE__);
           i2c_stop();
       }

       i2c_inbyte2(0);                 // Last conversion result
       temp.val1=i2c_inbyte2(0);     // Current conversion result
       temp.val2=i2c_inbyte2(0);
       temp.val3=i2c_inbyte2(0);
       temp.val4=i2c_inbyte2(1);

       i2c_stop();


 return temp;
}

/* Write values on a I/O Expander: */
int IOExpWrite(unsigned char address, unsigned char pattern) {
 unsigned char o_byte = 112;
 i2c_stop();
 i2c_start();

 o_byte = devices[address].slaveadd;
 if (i2c_outbyte(pattern)==0) return -1;
 i2c_stop();

 return 1;
}

/* Read values from a I/O Expander: */
unsigned char IOExpRead(unsigned char address) {
 unsigned char o_byte = 112;
 unsigned char i_byte;
 i2c_stop();
 i2c_start();

 o_byte = address;
 if (i2c_outbyte(o_byte)==0) printf("NACK !! --");
 i_byte = i2c_inbyte();
 i2c_stop();

 return i_byte;
}

Reply via email to