Hi Ytai Thank you for your response. I have fixed it because I soldered different slaves on the save I2C bus. It works after seperate them to different I2C bus ports. I am thinking there is signal conflict when using different slaves on the same I2C port. Thank you
Li Ping 在 2014年1月24日星期五UTC-5下午8时40分42秒,Ytai写道: > Why are those delays? > Can you focus on a simpler use-case (e.g. reading WHO_AM_I) and get rid of > the other code? This is too long and complicated for easily spotting bugs. > Also, how are you wiring this thing? Do you have pull-ups? Can you check > the return value from writeRead() and verify that it's "true"? > > > On Fri, Jan 24, 2014 at 2:55 PM, Ping li <[email protected] > <javascript:>>wrote: > >> Hi Ytai >> >> I am using IOIO V2 to read MPU9150, a 9DOF motion sensor: >> https://www.sparkfun.com/products/11486 >> >> The problem I encountered is that I can not read out the register by >> I2C. I modified the code base on https://github.com/twyatt/ioio-adxl345, >> from SPI to I2C, it works for ADXL345 >> >> >> >> I list down the code: >> >> ////////////////////////////////////code from >> here//////////////////////////////////////////////// >> >> *public* *byte* getDeviceId() *throws* ConnectionLostException, >> InterruptedException { >> >> read(*WHO_AM_I*, 1, readBuffer); >> >> *return* readBuffer[0]; >> >> } >> >> *private* *void* setupDevice() *throws* InterruptedException, >> ConnectionLostException { >> >> write(*PWR_MGMT_1*, (*byte*) 0x80); // reset >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> write(*PWR_MGMT_1*, (*byte*) 0x00); >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> read(*WHO_AM_I*, 1, readBuffer); >> >> System.*out*.println("device ID is "+readBuffer[0]); >> >> *byte* id = readBuffer[0]; >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> /* >> >> write(SMPLRT_DIV, (byte) 0x00); >> >> Thread.sleep(REGISTER_WRITE_DELAY); >> >> read(SMPLRT_DIV, 1, readBuffer); >> >> Thread.sleep(REGISTER_WRITE_DELAY); >> >> System.out.println("The first SMPLRT_DIV is "+readBuffer[0]); >> >> */ >> >> write(*SMPLRT_DIV*, (*byte*) 0x07); // *Gyro* sample rate, 0x07=125Hz >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> read(*SMPLRT_DIV*, 1, readBuffer); >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> System.*out*.println("The second SMPLRT_DIV is "+readBuffer[0]); >> >> write(*CONFIG*, (*byte*) 0x06); //0x06=5Hz >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> write(*GYRO_CONFIG*, (*byte*) 0x18); //2000degree/s >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> write(*ACCEL_CONFIG*, (*byte*) 0x01); // 2G, 5Hz >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> *if* (id == *WHO_AM_I_default*) { >> >> deviceId = id; >> >> System.*out*.println("afjskldfjklasdjfklasfjaklsdfjsdklf The id is "+id); >> >> } *else* { >> >> onError("Invalid device ID, expected " + (*WHO_AM_I_default* & 0xFF) + " >> but got " + (id & 0xFF)); >> >> System.*out*.println("afjskldfjklasdjfklasfjaklsdfjsdklf The id is wrong >> "+id); >> >> } >> >> *if* (listener != *null*) { >> >> listener.onDeviceId(deviceId); >> >> } >> >> //setRange(2); // +/- 16 G >> >> >> } >> >> *protected* *void* write(*byte* register, *byte* value) >> *throws*ConnectionLostException, InterruptedException { >> >> writeBuffer[0] = register; >> >> writeBuffer[1] = value; >> >> flush(2); >> >> } >> >> *protected* *void* write(*byte* register, *byte*[] values) >> *throws*ConnectionLostException, InterruptedException { >> >> writeBuffer[0] = register; >> >> System.*arraycopy*(values, 0, writeBuffer, 1, values.length); >> >> flush(1 + values.length); >> >> } >> >> /** >> >> * Writes the write buffer to the I2C. >> >> * >> >> * *@param* length Number of bytes of the buffer to write. >> >> * *@throws* ConnectionLostException >> >> * *@throws* InterruptedException >> >> */ >> >> *protected* *void* flush(*int* length) *throws* ConnectionLostException, >> InterruptedException { >> >> *boolean* tenBitAddr = *false*; >> >> *int* readSize = 0; >> >> i2c.writeRead(*ADDRESS_AD0_LOW*, tenBitAddr, writeBuffer, length, >> readBuffer, readSize); >> >> *if* (*REGISTER_WRITE_DELAY* > 0) >> >> Thread.*sleep*(*REGISTER_WRITE_DELAY*); >> >> } >> >> *protected* *void* read(*byte* register, *int* length, *byte*[] values) >> *throws* ConnectionLostException, InterruptedException { >> >> *boolean* tenBitAddr = *false*; >> >> writeBuffer[0] = register; >> >> i2c.writeRead(*ADDRESS_AD0_LOW*, tenBitAddr, writeBuffer, 1, readBuffer, >> length); >> >> } >> >> *private* *void* onError(String message) { >> >> *if* (listener != *null*) { >> >> listener.onError(message); >> >> } >> >> } >> >> /* >> >> * IOIOLooper interface methods. >> >> */ >> >> @Override >> >> *public* *void* setup(IOIO ioio) *throws* ConnectionLostException, >> InterruptedException { >> >> i2c = ioio.openTwiMaster(twiNum, rate, *false* /* *smbus* */); >> >> setupDevice(); >> >> } >> >> @Override >> >> *public* *void* loop() *throws* ConnectionLostException, >> InterruptedException { >> >> *if* (listener != *null*) { >> >> read(*GYRO_XOUT_H*, 6, readBuffer); >> >> x = (readBuffer[0] << 8) | readBuffer[1]; >> >> y = (readBuffer[2] << 8) | readBuffer[3]; >> >> z = (readBuffer[4] << 8) | readBuffer[5]; >> >> listener.onData(x, y, z); >> >> } >> >> } >> >> -- >> You received this message because you are subscribed to the Google Groups >> "ioio-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected]<javascript:> >> . >> Visit this group at http://groups.google.com/group/ioio-users. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- You received this message because you are subscribed to the Google Groups "ioio-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/ioio-users. For more options, visit https://groups.google.com/groups/opt_out.
