title: Reading/Writing to LSM6DSOX via SPI from Raspberry Pi
body: <p>I'm having trouble reading and writing to my Adafruit LSM6DSOX IMU from my Raspberry Pi 4 running Ubuntu 20.04. I need to do it via SPI since I require the bandwidth, but I can only seem to read the WHO_AM_I register successfully. Reading/writing to any other register only returns 0x00. I have verified that I can read data off the IMU from an Arduino via SPI, but if I try to read a register  other than 0x0F (the IMU_ID) I get 0x0 as a response. Any insight/ideas what could be causing this would be greatly appreciated!</p>
  <p>EDIT: It turns out I can read the following registers:</p>
  <pre class="lang-auto prettyprint-override"><code>0x0f : 0x6c
  0x13 : 0x1c
  0x33 : 0x1c
  0x53 : 0x1c
  0x73 : 0x1c
  </code></pre>
  <p>These are all random registers however, and the value 0x1C doesn't seem to correspond with anything.</p>
  <p>This is my main.py:</p>
  <pre class="lang-python prettyprint-override"><code>import LSM6DSOX
  
  def main():
      imu=LSM6DSOX.LSM6DSOX()
      imu.initSPI()
      whoamI=imu.read_reg(0x0F)
      while(whoamI != imu.LSM6DSOX_ID):
          imu.ms_sleep(200)
          print('searching for IMU')
          whoamI=imu.get_id()
          print(hex(whoamI))
      print('found lsm6dsox IMU')
  
      imu.spi.close()
      imu.spi = None
  
  if __name__==&quot;__main__&quot;:
      main()
  </code></pre>
  <p>This is an excerpt from my LSM6DSOX.py:</p>
  <pre class="lang-python prettyprint-override"><code>    def initSPI(self):
          # Setup communication SPI
          self.spi = spidev.SpiDev()
          self.spi.open(0, 0)
          self.spi.mode=0b11 #mode 3, (mode 0 is also fine)
          self.spi.max_speed_hz = 500000
          return self.spi
  
      def read_reg(self, reg, len=1):
          # Set up message 
          buf = bytearray(len+1)
          buf[0] = 0b10000000 | reg # MSB bit must be 1 to indicate a read operation. this is OR'd with the register address you want to read
  
          resp =self.spi.xfer2(buf) #send (and recieve) data to the imu
          if len==1:
              return resp[1]
          else:
              return resp[1:] #display recieved data
  
      def write_reg(self, reg, data, len=1):
          # Set up message 
          buf = bytearray(len+1)
          buf[0] = 0b00000000 | reg # MSB bit must be 0 to indicate a read operation. this is OR'd with the register address you want to read
          buf[1:] =bytes(data)
          resp =self.spi.xfer2(buf) #send (and recieve) data to the imu
          return resp[1:] #display recieved data
  </code></pre>