i2c.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. '''
  2. I2C test for the CC3200 based boards.
  3. A MPU-9150 sensor must be connected to the I2C bus.
  4. '''
  5. from machine import I2C
  6. import os
  7. import time
  8. mch = os.uname().machine
  9. if 'LaunchPad' in mch:
  10. i2c_pins = ('GP11', 'GP10')
  11. elif 'WiPy' in mch:
  12. i2c_pins = ('GP15', 'GP10')
  13. else:
  14. raise Exception('Board not supported!')
  15. i2c = I2C(0, I2C.MASTER, baudrate=400000)
  16. # try initing without the peripheral id
  17. i2c = I2C()
  18. print(i2c)
  19. i2c = I2C(mode=I2C.MASTER, baudrate=50000, pins=i2c_pins)
  20. print(i2c)
  21. i2c = I2C(0, I2C.MASTER, baudrate=100000)
  22. print(i2c)
  23. i2c = I2C(0, mode=I2C.MASTER, baudrate=400000)
  24. print(i2c)
  25. i2c = I2C(0, mode=I2C.MASTER, baudrate=400000, pins=i2c_pins)
  26. print(i2c)
  27. addr = i2c.scan()[0]
  28. print(addr)
  29. reg = bytearray(1)
  30. reg2 = bytearray(2)
  31. reg2_r = bytearray(2)
  32. # reset the sensor
  33. reg[0] |= 0x80
  34. print(1 == i2c.writeto_mem(addr, 107, reg))
  35. time.sleep_ms(100) # wait for the sensor to reset...
  36. print(1 == i2c.readfrom_mem_into(addr, 107, reg)) # read the power management register 1
  37. print(0x40 == reg[0])
  38. # now just read one byte
  39. data = i2c.readfrom_mem(addr, 117, 1) # read the "who am I?" register
  40. print(0x68 == data[0])
  41. print(len(data) == 1)
  42. print(1 == i2c.readfrom_mem_into(addr, 117, reg)) # read the "who am I?" register again
  43. print(0x68 == reg[0])
  44. # now try reading two bytes
  45. data = i2c.readfrom_mem(addr, 116, 2) # read the "who am I?" register
  46. print(0x68 == data[1])
  47. print(data == b'\x00\x68')
  48. print(len(data) == 2)
  49. print(2 == i2c.readfrom_mem_into(addr, 116, reg2)) # read the "who am I?" register again
  50. print(0x68 == reg2[1])
  51. print(reg2 == b'\x00\x68')
  52. print(1 == i2c.readfrom_mem_into(addr, 107, reg)) # read the power management register 1
  53. print(0x40 == reg[0])
  54. # clear the sleep bit
  55. reg[0] = 0
  56. print(1 == i2c.writeto_mem(addr, 107, reg))
  57. # read it back
  58. i2c.readfrom_mem_into(addr, 107, reg)
  59. print(0 == reg[0])
  60. # set the sleep bit
  61. reg[0] = 0x40
  62. print(1 == i2c.writeto_mem(addr, 107, reg))
  63. # read it back
  64. i2c.readfrom_mem_into(addr, 107, reg)
  65. print(0x40 == reg[0])
  66. # reset the sensor
  67. reg[0] |= 0x80
  68. print(1 == i2c.writeto_mem(addr, 107, reg))
  69. time.sleep_ms(100) # wait for the sensor to reset...
  70. # now read and write two register at a time
  71. print(2 == i2c.readfrom_mem_into(addr, 107, reg2))
  72. print(0x40 == reg2[0])
  73. print(0x00 == reg2[1])
  74. # clear the sleep bit
  75. reg2[0] = 0
  76. # set some other bits
  77. reg2[1] |= 0x03
  78. print(2 == i2c.writeto_mem(addr, 107, reg2))
  79. # read it back
  80. i2c.readfrom_mem_into(addr, 107, reg2_r)
  81. print(reg2 == reg2_r)
  82. # reset the sensor
  83. reg[0] = 0x80
  84. print(1 == i2c.writeto_mem(addr, 107, reg))
  85. time.sleep_ms(100) # wait for the sensor to reset...
  86. # try some raw read and writes
  87. reg[0] = 117 # register address
  88. print(1 == i2c.writeto(addr, reg, stop=False)) # just write the register address
  89. # now read
  90. print(1 == i2c.readfrom_into(addr, reg))
  91. print(reg[0] == 0x68)
  92. reg[0] = 117 # register address
  93. print(1 == i2c.writeto(addr, reg, stop=False)) # just write the register address
  94. # now read
  95. print(0x68 == i2c.readfrom(addr, 1)[0])
  96. i2c.readfrom_mem_into(addr, 107, reg2)
  97. print(0x40 == reg2[0])
  98. print(0x00 == reg2[1])
  99. reg2[0] = 107 # register address
  100. reg2[1] = 0
  101. print(2 == i2c.writeto(addr, reg2, stop=True)) # write the register address and the data
  102. i2c.readfrom_mem_into(addr, 107, reg) # check it back
  103. print(reg[0] == 0)
  104. # check for memory leaks...
  105. for i in range (0, 1000):
  106. i2c = I2C(0, I2C.MASTER, baudrate=100000)
  107. # test deinit
  108. i2c = I2C(0, I2C.MASTER, baudrate=100000)
  109. i2c.deinit()
  110. print(i2c)
  111. # next ones should raise
  112. try:
  113. i2c.scan()
  114. except Exception:
  115. print("Exception")
  116. try:
  117. i2c.readfrom(addr, 1)
  118. except Exception:
  119. print("Exception")
  120. try:
  121. i2c.readfrom_into(addr, reg)
  122. except Exception:
  123. print("Exception")
  124. try:
  125. i2c.readfrom_mem_into(addr, 107, reg)
  126. except Exception:
  127. print("Exception")
  128. try:
  129. i2c.writeto(addr, reg, stop=False)
  130. except Exception:
  131. print("Exception")
  132. try:
  133. i2c.writeto_mem(addr, 107, reg)
  134. except Exception:
  135. print("Exception")
  136. try:
  137. i2c.readfrom_mem(addr, 116, 2)
  138. except Exception:
  139. print("Exception")
  140. try:
  141. I2C(1, I2C.MASTER, baudrate=100000)
  142. except Exception:
  143. print("Exception")
  144. # reinitialization must work
  145. i2c.init(baudrate=400000)
  146. print(i2c)