Hi, I do not understand what you mean. Yes, the address is 7 bit but the last r/w bit is also sent with the address to make it 8 bit. So 0x20 will be 0x40 for write right?
I am a little confused how we understand the address byte. According the PCF8591 datasheet, the address byte format is : 1001 A2 A1 A0 R/W So this would make the address to be 90/91 if A2, A1, A0 = 000 or 92/93 if A2 A1 A0 = 001. However this does not work. For one chip it works for 48, 49. Do you understand this? Thanks BG ________________________________________ From: András Bíró [[email protected]] Sent: Tuesday, February 28, 2012 1:34 AM To: #BHARTI GOEL# Cc: [email protected] Subject: Re: [Tinyos-help] Reading two PCF8591 chips over I2C bus Hi, I think that code shouldn't work with one sensor eighter. The I2CPacket interface only needs the 7 bit address, whithout the read/~write bit. So your address for the 0x40/0x41 chip is 0x20. Andris On Mon, Feb 27, 2012 at 6:10 PM, #BHARTI GOEL# <[email protected]> wrote: > Hi, > > I am trying to interface PCF8591 chips over I2C bus with an iris mote to get > pressure sensor reading. When I use one chip, my program is working. However > when I add one more chip , it stops after taking one reading. I am not sure > what the problem is. I am reading the 2 chips in sequence one after the > other. I am using Atm128I2CMasterC as the master device for both the chips. > Here is my code. Thanks a lot > > #include <I2C.h> > #include "Timer.h" > #include "bed.h" > > module BedC @safe() { > uses { > interface Boot; > interface Leds; > interface Timer<TMilli>; > //I2C > interface Resource as I2CResource; > interface I2CPacket<TI2CBasicAddr> as I2CPacket1; > interface I2CPacket<TI2CBasicAddr> as I2CPacket2; > // RADIO COMMUNICATION > interface AMSend; > interface SplitControl as RadioControl; > > } > } > > implementation { > > message_t sendBuf; > bool sendBusy = FALSE; > bed_t local; > uint8_t getDataCommand; > uint8_t* readData; > bool isReadyToSend = FALSE; > uint8_t prevData[NREADINGS]; > //bool isDetection = FALSE; > > > event void Boot.booted() { > local.id = TOS_NODE_ID; > call RadioControl.start(); > } > > event void RadioControl.startDone(error_t error) { > > call Timer.startPeriodic(3000); > } > > event void RadioControl.stopDone(error_t error) { > } > > task void sendData() { > if (!sendBusy && sizeof local <= call AMSend.maxPayloadLength()) { > memcpy(call AMSend.getPayload(&sendBuf, sizeof(local)), &local, > sizeof local); > if (call AMSend.send(AM_BROADCAST_ADDR, &sendBuf, sizeof local) > == SUCCESS) { > sendBusy = TRUE; > local.count++; > } > } > } > > event void Timer.fired() { > if(isReadyToSend) { > call Leds.led0Toggle(); //red > post sendData(); > isReadyToSend = FALSE; > } else { > call Leds.led2Toggle(); //yellow > call I2CResource.request(); > } > } > > event void I2CResource.granted() { > getDataCommand = 0x43; > if(call I2CPacket1.write(I2C_START | I2C_STOP, 0x48, 1, > (uint8_t*)(&getDataCommand)) == SUCCESS) { > > } > } > > async event void I2CPacket1.writeDone(error_t success, uint16_t addr, > uint8_t length, uint8_t* data) { > if(call I2CPacket1.read(I2C_START | I2C_STOP, 0x49, 4, > (uint8_t*)(&readData)) == SUCCESS) { > > } > } > > async event void I2CPacket1.readDone(error_t success, uint16_t addr, > uint8_t length, uint8_t* data) { > > if(success == SUCCESS) { > local.reading[0] = readData[0]; > local.reading[1] = readData[1]; > local.reading[2] = readData[2]; > local.reading[3] = readData[3]; > //call Leds.led1Toggle(); //green > > > } > if(call I2CPacket2.write(I2C_START | I2C_STOP, 0x40, 1, > (uint8_t*)(&getDataCommand)) == SUCCESS) { > > } > } > > async event void I2CPacket2.writeDone(error_t success, uint16_t addr, > uint8_t length, uint8_t* data) { > if(call I2CPacket2.read(I2C_START | I2C_STOP, 0x41, 4, > (uint8_t*)(&readData)) == SUCCESS) { > > } > } > > > async event void I2CPacket2.readDone(error_t success, uint16_t addr, > uint8_t length, uint8_t* data) { > > if(success == SUCCESS) { > local.reading[4] = readData[0]; > local.reading[5] = readData[1]; > local.reading[6] = readData[2]; > local.reading[7] = readData[3]; > isReadyToSend = TRUE; > call I2CResource.release(); > > } > > > } > > > event void AMSend.sendDone(message_t* msg, error_t error) { > call Leds.led1Toggle(); //green > sendBusy = FALSE; > } > > } > > --------------------------------------------------------------//// > > configuration BedAppC { } > > implementation > { > components BedC, MainC, LedsC, ActiveMessageC, > new TimerMilliC(), new Atm128I2CMasterC() as Atm128I2CMasterC, new > AMSenderC(AM_BED); > > BedC.Boot -> MainC; > BedC.Leds -> LedsC; > BedC.I2CResource -> Atm128I2CMasterC; > BedC.I2CPacket1 -> Atm128I2CMasterC; > BedC.I2CPacket2 -> Atm128I2CMasterC; > BedC.Timer -> TimerMilliC; > BedC.AMSend -> AMSenderC; > BedC.RadioControl -> ActiveMessageC; > } > > > regards > Bharti > > > _______________________________________________ > Tinyos-help mailing list > [email protected] > https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help _______________________________________________ Tinyos-help mailing list [email protected] https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
