Hi, The address you provide to the i2cpacket will be automatically shift left, and r/~w bit will be added based on the command (read or write). So, your slave address is 1001 A2 A1 A0.
Andris 2012/2/28 #BHARTI GOEL# <[email protected]>: > 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
