Adafruit_I2C.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #!/usr/bin/python
  2. import smbus
  3. # ===========================================================================
  4. # Adafruit_I2C Class
  5. # ===========================================================================
  6. class Adafruit_I2C :
  7. @staticmethod
  8. def getPiRevision():
  9. "Gets the version number of the Raspberry Pi board"
  10. # Courtesy quick2wire-python-api
  11. # https://github.com/quick2wire/quick2wire-python-api
  12. try:
  13. with open('/proc/cpuinfo','r') as f:
  14. for line in f:
  15. if line.startswith('Revision'):
  16. return 1 if line.rstrip()[-1] in ['1','2'] else 2
  17. except:
  18. return 0
  19. @staticmethod
  20. def getPiI2CBusNumber():
  21. # Gets the I2C bus number /dev/i2c#
  22. return 1 if Adafruit_I2C.getPiRevision() > 1 else 0
  23. def __init__(self, address, busnum=-1, debug=False):
  24. self.address = address
  25. # By default, the correct I2C bus is auto-detected using /proc/cpuinfo
  26. # Alternatively, you can hard-code the bus version below:
  27. # self.bus = smbus.SMBus(0); # Force I2C0 (early 256MB Pi's)
  28. # self.bus = smbus.SMBus(1); # Force I2C1 (512MB Pi's)
  29. self.bus = smbus.SMBus(
  30. busnum if busnum >= 0 else Adafruit_I2C.getPiI2CBusNumber())
  31. self.debug = debug
  32. def reverseByteOrder(self, data):
  33. "Reverses the byte order of an int (16-bit) or long (32-bit) value"
  34. # Courtesy Vishal Sapre
  35. byteCount = len(hex(data)[2:].replace('L','')[::2])
  36. val = 0
  37. for i in range(byteCount):
  38. val = (val << 8) | (data & 0xff)
  39. data >>= 8
  40. return val
  41. def errMsg(self):
  42. print "Error accessing 0x%02X: Check your I2C address" % self.address
  43. return -1
  44. def write8(self, reg, value):
  45. "Writes an 8-bit value to the specified register/address"
  46. try:
  47. self.bus.write_byte_data(self.address, reg, value)
  48. if self.debug:
  49. print "I2C: Wrote 0x%02X to register 0x%02X" % (value, reg)
  50. except IOError, err:
  51. return self.errMsg()
  52. def write16(self, reg, value):
  53. "Writes a 16-bit value to the specified register/address pair"
  54. try:
  55. self.bus.write_word_data(self.address, reg, value)
  56. if self.debug:
  57. print ("I2C: Wrote 0x%02X to register pair 0x%02X,0x%02X" %
  58. (value, reg, reg+1))
  59. except IOError, err:
  60. return self.errMsg()
  61. def writeList(self, reg, list):
  62. "Writes an array of bytes using I2C format"
  63. try:
  64. if self.debug:
  65. print "I2C: Writing list to register 0x%02X:" % reg
  66. print list
  67. self.bus.write_i2c_block_data(self.address, reg, list)
  68. except IOError, err:
  69. return self.errMsg()
  70. def readList(self, reg, length):
  71. "Read a list of bytes from the I2C device"
  72. try:
  73. results = self.bus.read_i2c_block_data(self.address, reg, length)
  74. if self.debug:
  75. print ("I2C: Device 0x%02X returned the following from reg 0x%02X" %
  76. (self.address, reg))
  77. print results
  78. return results
  79. except IOError, err:
  80. return self.errMsg()
  81. def readU8(self, reg):
  82. "Read an unsigned byte from the I2C device"
  83. try:
  84. result = self.bus.read_byte_data(self.address, reg)
  85. if self.debug:
  86. print ("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" %
  87. (self.address, result & 0xFF, reg))
  88. return result
  89. except IOError, err:
  90. return self.errMsg()
  91. def readS8(self, reg):
  92. "Reads a signed byte from the I2C device"
  93. try:
  94. result = self.bus.read_byte_data(self.address, reg)
  95. if result > 127: result -= 256
  96. if self.debug:
  97. print ("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" %
  98. (self.address, result & 0xFF, reg))
  99. return result
  100. except IOError, err:
  101. return self.errMsg()
  102. def readU16(self, reg):
  103. "Reads an unsigned 16-bit value from the I2C device"
  104. try:
  105. hibyte = self.readU8(reg)
  106. lobyte = self.readU8(reg+1)
  107. result = (hibyte << 8) + lobyte
  108. if (self.debug):
  109. print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
  110. return result
  111. except IOError, err:
  112. return self.errMsg()
  113. def readS16(self, reg):
  114. "Reads a signed 16-bit value from the I2C device"
  115. try:
  116. hibyte = self.readS8(reg)
  117. lobyte = self.readU8(reg+1)
  118. result = (hibyte << 8) + lobyte
  119. if (self.debug):
  120. print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
  121. return result
  122. except IOError, err:
  123. return self.errMsg()
  124. def readU16Rev(self, reg):
  125. "Reads an unsigned 16-bit value from the I2C device with rev byte order"
  126. try:
  127. lobyte = self.readU8(reg)
  128. hibyte = self.readU8(reg+1)
  129. result = (hibyte << 8) + lobyte
  130. if (self.debug):
  131. print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
  132. return result
  133. except IOError, err:
  134. return self.errMsg()
  135. def readS16Rev(self, reg):
  136. "Reads a signed 16-bit value from the I2C device with rev byte order"
  137. try:
  138. lobyte = self.readS8(reg)
  139. hibyte = self.readU8(reg+1)
  140. result = (hibyte << 8) + lobyte
  141. if (self.debug):
  142. print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
  143. return result
  144. except IOError, err:
  145. return self.errMsg()
  146. if __name__ == '__main__':
  147. try:
  148. bus = Adafruit_I2C(address=0)
  149. print "Default I2C bus is accessible"
  150. except:
  151. print "Error accessing default I2C bus"