Page 197
import subprocess
import io
import fcntl
from time import sleep
def checkI2CBus():
temp = subprocess.Popen(["sudo", "dtparam", "-l"], stdout = subprocess.PIPE)
output = str(temp.communicate())
lasti2c=output.rfind("i2c_arm")
if lasti2c!=-1:
lasti2c=output.find("i2c_arm=on",lasti2c)
if lasti2c==-1:
temp = subprocess.Popen(["sudo", "dtparam", "i2c_arm=on"], stdout = subprocess.PIPE)
output = str(temp.communicate())
return
I2C_SLAVE=0x0703
fdr = io.open("/dev/i2c-1", "rb", buffering=0)
fdw = io.open("/dev/i2c-1", "wb", buffering=0)
fcntl.ioctl(fdr, I2C_SLAVE, 0x40)
fcntl.ioctl(fdw, I2C_SLAVE, 0x40)
fdw.write( bytearray([0xE3]))
data=fdr.read(3)
msb=data[0]
lsb=data[1]
crc=data[2]
print("msb=",msb," lsb=",lsb," crc=",crc)
fdw.close()
fdr.close()
Page 200
import subprocess
from ctypes import *
import os
import fcntl
import io
def checkI2CBus():
temp = subprocess.Popen(["sudo", "dtparam", "-l"], stdout=subprocess.PIPE)
output = str(temp.communicate())
lasti2c = output.rfind("i2c_arm")
if lasti2c != -1:
lasti2c = output.find("i2c_arm=on", lasti2c)
if lasti2c == -1:
temp = subprocess.Popen(["sudo", "dtparam", "i2c_arm=on"], stdout=subprocess.PIPE)
output = str(temp.communicate())
return
checkI2CBus()
I2C_SLAVE = 0x0703
I2C_FUNCS = 0x0705
I2C_FUNC_I2C = 0x00000001
I2C_FUNC_10BIT_ADDR = 0x00000002
I2C_FUNC_PROTOCOL_MANGLING = 0x00000004
I2C_FUNC_NOSTART = 0x00000010
I2C_FUNC_SLAVE = 0x00000020
i2cfd = os.open("/dev/i2c-1", os.O_RDWR | os.O_SYNC)
support = c_uint32(0)
fcntl.ioctl(i2cfd, I2C_FUNCS, support)
support = support.value
if support & I2C_FUNC_I2C:
print("I2C Support")
if support & I2C_FUNC_10BIT_ADDR:
print("10 bit address Support")
if support & I2C_FUNC_PROTOCOL_MANGLING:
print("I2C Mangling Support")
if support & I2C_FUNC_NOSTART:
print("I2C Nostart Support")
if support & I2C_FUNC_SLAVE:
print("I2C Slave Support")
Page 204
import fcntl
import os
from ctypes import *
class Msgs(Structure):
_fields_ = [("addr", c_uint16),
("flags", c_uint16),
("len", c_uint16),
("buf", POINTER(c_uint8))
]
class MsgSet(Structure):
_fields_ = [("msgs", POINTER(Msgs)),
("nmsgs", c_uint32)
]
def i2cReadRegister(i2cfd, slaveaddr, reg, n):
I2C_RDWR = 0x0707
I2C_M_RD = 0x0001
msgs = (Msgs*2)()
msgs[0].addr = c_uint16(slaveaddr)
msgs[0].flags = c_uint16(0)
msgs[0].len = c_uint16(1)
msgs[0].buf = POINTER(c_uint8)(c_uint8(reg))
msgs[1].addr = c_uint16(slaveaddr)
msgs[1].flags = c_uint16(I2C_M_RD)
msgs[1].len = c_uint16(n)
buf = (c_uint8*n)(0)
msgs[1].buf = POINTER(c_uint8)(buf)
msgset = MsgSet()
msgset.msgs = POINTER(Msgs)(msgs)
msgset.nmsgs = c_uint32(2)
libc = CDLL("libc.so.6")
libc.ioctl(i2cfd, I2C_RDWR, byref(msgset))
return msgs[1].buf
def crcCheck(msb, lsb, check):
data32 = (msb << 16) | (lsb << 8) | check
divisor = 0x988000
for i in range(16):
if(data32 & 1 << (23 - i)):
data32 ^= divisor
divisor >>= 1
return data32
i2cfd = os.open("/dev/i2c-1", os.O_RDWR | os.O_SYNC)
data = i2cReadRegister(i2cfd, 0x40, 0xE3, 3)
msb = data[0]
lsb = data[1]
crc = data[2]
data16 = (msb << 8) | (lsb & 0xFC)
temp = -46.85 + (175.72 * data16 / 65536)
print("Temperature=", temp, "C")
print(hex(msb), hex(lsb), hex(crc))
print(crcCheck(msb, lsb, crc))