Hi Graham, Am Freitag, 12. Mai 2017 17:05:55 UTC+2 schrieb Graham: > > It looks like the MPU9250 has a non standard (to my way of thinking) I2C > read sequence that requires you to resend the register address as part of a > consolidated write/read sequence. The default tool i2cget does not deal > with this, and only deals with simple (standard to my way of thinking) read > sequences. >
It's not the MPU9250 that's causing the problem. This is the IMU built into the Beaglebone Blue and connect to I²C bus #0. The example I posted uses the input of the IMU to control the motors via the PicoBorgRev board. Reading the IMU on I²C bus 0 works like a charm, btw. Only reading from the motor controller does not work. > Since you can write to the device, and a write requires an acknowledgement > from the device, there is nothing wrong down at the hardware and low-level > driver level. > Ok, I didn't know that. If you are using Python, I would suggest using Python 2.7 rather than > Python 3. At least to get started, until you are in control. > I'm a fairly advanced Python programmer and I don't want to start off with something as deprecated as Python 2.7. Nonetheless, I tried a Python 2.7 of my code, and it yields the same results: Writing to the motor controller works, while reading from it doesn't. > The last time I did Python control of I2C, you needed to > load python-smbus, and it had not yet been updated for Python 3 > compatibility. > There are inofficial ports that work. One is in my repo: https://github.com/tkurbad/python3-smbus. Works well with Raspberry PI and the built-in devices of the Beaglebone that are connected to I²C bus #0 (i.e. IMU and barometric pressure sensor). Just for completeness' sake, I created a very simple test script using Python 2.7 (it does exactly the same as the original Python code for the motor controller does during init): #!/usr/bin/python2 import smbus address = 0x44 id_cmd = 0x99 i2c_max_len = 4 bus = smbus.SMBus(1) i2cread = bus.read_i2c_block_data(address, id_cmd, i2c_max_len) print "Raw I2C read result:", i2cread print "Would yield a version of:", i2cread[1] If I run the script, this is the result: tkurbad@beaglebone:~$ python revision.py Raw I2C read result: [0, 0, 204, 204] Would yield a version of: 0 The correct value of i2read[1] would be 21 (or 0x15), not 0. The raw result, btw., is also the same, regardless of what register of the motor controller I read from. So, I'm still convinced that it has to do with the hardware and/or the setup of the I²C bus of the beaglebone... Where else could I look? Best, Torsten -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/beagleboard/4221ff40-f8cd-468c-b842-65b3c016dfd5%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
