Skip to content

Commit 5478a0b

Browse files
committed
Fix SPI conflict
2 parents 4417378 + 20515b2 commit 5478a0b

File tree

2 files changed

+113
-97
lines changed

2 files changed

+113
-97
lines changed

i2c.py

Lines changed: 78 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -44,124 +44,124 @@ class i2c_smbus_ioctl_data(Structure):
4444
('data', POINTER(i2c_smbus_data))]
4545

4646
def i2c_smbus_access(file, read_write, command, size, data):
47-
try:
48-
args = i2c_smbus_ioctl_data(read_write, command, size, data)
49-
return fcntl.ioctl(file, I2C_SMBUS, args)
50-
except IOError, e:
51-
if debug: print '## i2c_smbus_access ##: IOError {0}'.format(e)
52-
return -1
53-
except IOError, e:
54-
return -1
55-
except Exception, e:
56-
print '## i2c_smbus_access ## {0}'.format(e)
57-
return -1
47+
args = i2c_smbus_ioctl_data(read_write, command, size, data)
48+
return fcntl.ioctl(file, I2C_SMBUS, args)
5849

5950
def i2c_smbus_write_quick(file, mode):
60-
if debug: print '## i2c_smbus_write_byte ##: mode 0x{0:00X}'.format(mode)
51+
if debug: print '## i2c_smbus_write_quick ##: mode 0x{0:02X}'.format(mode)
6152
data = i2c_smbus_data(0)
62-
return i2c_smbus_access(file, mode, 0, I2C_SMBUS_QUICK, pointer(data))
53+
i2c_smbus_access(file, mode, 0, I2C_SMBUS_QUICK, pointer(data))
6354

6455
def i2c_smbus_read_byte(file):
6556
if debug: print '## i2c_smbus_read_byte ##'
6657
data = i2c_smbus_data(0)
67-
if (i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, pointer(data)) == 0):
68-
return 0x0FF & data.byte
69-
else:
70-
return -1
58+
i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, pointer(data))
59+
return 0x0FF & data.byte
7160

7261
def i2c_smbus_write_byte(file, daddr):
73-
if debug: print '## i2c_smbus_write_byte ##: daddr 0x{0:00X}'.format(daddr)
62+
if debug: print '## i2c_smbus_write_byte ##: daddr 0x{0:02X}'.format(daddr)
7463
data = i2c_smbus_data(0)
75-
return i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_BYTE, pointer(data))
64+
i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_BYTE, pointer(data))
7665

7766
def i2c_smbus_read_byte_data(file, daddr):
78-
if debug: print '## i2c_smbus_read_byte_data ##: daddr 0x{0:00X}'.format(daddr)
67+
if debug: print '## i2c_smbus_read_byte_data ##: daddr 0x{0:02X}'.format(daddr)
7968
data = i2c_smbus_data(0)
80-
if (i2c_smbus_access(file, I2C_SMBUS_READ, daddr, I2C_SMBUS_BYTE_DATA, pointer(data)) == 0):
81-
return 0x0FF & data.byte
82-
else:
83-
return -1
69+
i2c_smbus_access(file, I2C_SMBUS_READ, daddr, I2C_SMBUS_BYTE_DATA, pointer(data))
70+
return 0x0FF & data.byte
8471

8572
def i2c_smbus_write_byte_data(file, daddr, value):
86-
if debug: print '## i2c_smbus_write_byte_data ##: daddr 0x{0:00X}, value=0x{1:00X}'.format(daddr, value)
73+
if debug: print '## i2c_smbus_write_byte_data ##: daddr 0x{0:02X}, value=0x{1:02X}'.format(daddr, value)
8774
data = i2c_smbus_data(0)
8875
data.byte = value
89-
return i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_BYTE_DATA, pointer(data))
76+
i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_BYTE_DATA, pointer(data))
9077

9178
def i2c_smbus_read_word_data(file, daddr):
92-
if debug: print '## i2c_smbus_read_word_data ##: daddr 0x{0:00X}'.format(daddr)
79+
if debug: print '## i2c_smbus_read_word_data ##: daddr 0x{0:02X}'.format(daddr)
9380
data = i2c_smbus_data(0)
94-
if (i2c_smbus_access(file, I2C_SMBUS_READ, daddr, I2C_SMBUS_WORD_DATA, pointer(data)) == 0):
95-
return 0x0FFFF & data.word
96-
else:
97-
return -1
81+
i2c_smbus_access(file, I2C_SMBUS_READ, daddr, I2C_SMBUS_WORD_DATA, pointer(data))
82+
return 0x0FFFF & data.word
9883

9984
def i2c_smbus_write_word_data(file, daddr, value):
100-
if debug: print '## i2c_smbus_write_word_data ##: daddr 0x{0:00X}, value=0x{1:0000X}'.format(daddr, value)
85+
if debug: print '## i2c_smbus_write_word_data ##: daddr 0x{0:02X}, value=0x{1:04X}'.format(daddr, value)
10186
data = i2c_smbus_data(0)
10287
data.word = value
103-
return i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_WORD_DATA, pointer(data))
88+
i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_WORD_DATA, pointer(data))
89+
90+
def i2c_smbus_read_i2c_block_data(file, daddr, length):
91+
if debug: print '## i2c_smbus_read_i2c_block_data ##: daddr 0x{0:02X}, length 0x{1:02X}'.format(daddr, length)
92+
data = i2c_smbus_data(0)
93+
if length > 32:
94+
length = 32
95+
data.block[0] = length
96+
i2c_smbus_access(file, I2C_SMBUS_READ, daddr,
97+
I2C_SMBUS_I2C_BLOCK_BROKEN if length == 32 else I2C_SMBUS_I2C_BLOCK_DATA, pointer(data))
98+
values = []
99+
for i in range(data.block[0]):
100+
values.append(data.block[i + 1])
101+
return values
102+
103+
def i2c_smbus_write_i2c_block_data(file, daddr, length, values):
104+
if debug: print '## i2c_smbus_write_i2c_block_data ##: daddr 0x{0:02X}, length 0x{1:02X}'.format(daddr, length)
105+
data = i2c_smbus_data(0)
106+
if length > 32:
107+
length = 32
108+
data.block[0] = length
109+
for i in range(length):
110+
data.block[i + 1] = values[i]
111+
i2c_smbus_access(file, I2C_SMBUS_WRITE, daddr, I2C_SMBUS_I2C_BLOCK_BROKEN, pointer(data))
104112

105113
# Main entry points
106-
def _i2cRead(addr, reg = 0, size = ''):
107-
if debug: print '## i2cRead ## addr={0}, reg={1}, size={2}'.format(addr, reg, size)
108-
try:
109-
file = os.open(RASCAL_I2C, os.O_RDWR)
110-
try:
111-
fcntl.ioctl(file, I2C_SLAVE, addr)
112-
if size.upper() == 'W':
113-
data = i2c_smbus_read_word_data(file, reg)
114-
elif size.upper() == 'B':
115-
data = i2c_smbus_read_byte_data(file, reg)
116-
else:
117-
data = i2c_smbus_read_byte(file)
118-
except Exception, e:
119-
if debug: print '## i2cRead ## Can\'t set slave addr {0}'.format(e)
120-
data = -1
121-
os.close(file)
122-
except OSError:
123-
if debug: print '## i2cRead ## Can\'t open {0}'.format(RASCAL_I2C)
124-
data = -2
114+
def _i2cRead(addr, reg = 0, size = '', length = 0):
115+
if debug: print '## i2cRead ## addr={0}, reg={1}, size={2}, length={3}'.format(addr, reg, size, length)
116+
file = os.open(RASCAL_I2C, os.O_RDWR)
117+
fcntl.ioctl(file, I2C_SLAVE, addr)
118+
if size.upper() == 'I' and length > 0:
119+
data = i2c_smbus_read_i2c_block_data(file, reg, length)
120+
elif size.upper() == 'W':
121+
data = i2c_smbus_read_word_data(file, reg)
122+
elif size.upper() == 'B':
123+
data = i2c_smbus_read_byte_data(file, reg)
124+
else:
125+
data = i2c_smbus_read_byte(file)
126+
os.close(file)
125127
return data
126128

127129
def _i2cWrite(addr, reg, value = '', size = 'B'):
128130
if value == '': size = 'C'; value = 0
129131
if debug: print '## i2cWrite ## addr=0x{0:02x}, reg=0x{1:02x}, value=0x{2:04X}, size={3}'.format(addr, reg, value, size)
130-
try:
131-
file = os.open(RASCAL_I2C, os.O_RDWR)
132-
try:
133-
fcntl.ioctl(file, I2C_SLAVE, addr)
134-
if size.upper() == 'W':
135-
data = i2c_smbus_write_word_data(file, reg, value)
136-
elif size.upper() == 'B':
137-
data = i2c_smbus_write_byte_data(file, reg, value)
138-
else:
139-
data = i2c_smbus_write_byte(file, reg)
140-
except Exception, e:
141-
if debug: print '## i2cWrite ## Can\'t set slave addr {0}'.format(e)
142-
data = -1
143-
os.close(file)
144-
except OSError:
145-
if debug: print '## i2cWrite ## Can\'t open {0}'.format(RASCAL_I2C)
146-
data = -2
132+
file = os.open(RASCAL_I2C, os.O_RDWR)
133+
fcntl.ioctl(file, I2C_SLAVE, addr)
134+
if size.upper() == 'I' and isinstance(value, list) and len(value) > 0:
135+
data = i2c_smbus_write_i2c_block_data(file, reg, len(value), value)
136+
elif size.upper() == 'W':
137+
data = i2c_smbus_write_word_data(file, reg, value)
138+
elif size.upper() == 'B':
139+
data = i2c_smbus_write_byte_data(file, reg, value)
140+
else:
141+
data = i2c_smbus_write_byte(file, reg)
142+
os.close(file)
147143
return data
148144

149145
# Support for scanning i2C bus
150146
def probe_bus(file, addr):
151147
# Set slave address
152148
try:
153149
fcntl.ioctl(file, I2C_SLAVE, addr)
154-
if ((addr >= 0x30 and addr <= 0x37) or (addr >= 0x50 and addr <= 0x5F)):
155-
res = i2c_smbus_read_byte(file)
156-
else:
157-
res = i2c_smbus_write_quick(file, I2C_SMBUS_WRITE)
158-
if res < 0:
159-
return I2C_SCAN_NODEV
160-
else:
150+
try:
151+
if ((addr >= 0x30 and addr <= 0x37) or (addr >= 0x50 and addr <= 0x5F)):
152+
res = i2c_smbus_read_byte(file)
153+
else:
154+
res = i2c_smbus_write_quick(file, I2C_SMBUS_WRITE)
161155
return addr
162-
except Exception, e:
156+
except IOError:
157+
return I2C_SCAN_NODEV
158+
except Exception as e:
159+
print '## probe_bus ## Unexpected exception: probe address {0}'.format(e)
160+
except IOError:
163161
return I2C_SCAN_BUSY
164-
162+
except Exception as e:
163+
print '## probe_bus ## Unexpected exception: set slave address {0}'.format(e)
164+
165165
# Address status: 0=out of range, -1=not present, -2=busy, otherwise device address
166166
def scanBus(first = 0x03, last = 0x77):
167167
file = os.open(RASCAL_I2C, os.O_RDWR)
@@ -178,6 +178,3 @@ def scanBus(first = 0x03, last = 0x77):
178178
scan[i] = row
179179
os.close(file)
180180
return scan
181-
182-
183-

pytronics.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,8 @@ def decode_pin_name(pin):
2727
'3': 70, # PB6
2828
'4': 73, # PB9
2929
'5': 72, # PB8
30-
'6': 55, # PA23
31-
'7': 56, # PA24
32-
'8': 100, # PC4
33-
'9': 101, # PC5
34-
'10': 67, # PB3
35-
'11': 65, # PB1
36-
'12': 64, # PB0
37-
'13': 66, # PB2
30+
'6': 75, # PB11 Rascal 1.2
31+
'7': 74, # PB10 Rascal 1.2
3832
'A0': 96, # PC0
3933
'A1': 97, # PC1
4034
'A2': 98, # PC2
@@ -62,8 +56,11 @@ def analogWrite():
6256
def digitalRead(pin):
6357
pin = decode_pin_name(pin)
6458
with open('/sys/class/gpio/gpio' + str(pin) + '/value', 'r') as f:
65-
reading = f.read()
66-
return reading.strip()
59+
reading = f.read().strip()
60+
if (reading == '1'):
61+
return 1
62+
else:
63+
return 0
6764

6865
# Write a HIGH or LOW value to a digital pin
6966
# E.g. digitalWrite('11', 'HIGH')
@@ -101,13 +98,19 @@ def readPins(pinlist):
10198
print ('## readPins ## Cannot access pin {0} ({1})'.format(pin, syspin))
10299
return pins
103100

104-
def i2cRead(addr, reg = 0, size = 'B'):
101+
def readWeatherBoard():
102+
from sh import read_ftdi
103+
names = ['header', 'temperature', 'humidity', 'dewpoint', 'pressure', 'light', 'wind_speed', 'wind_direction', 'rainfall', 'voltage', 'trailer']
104+
readings = read_ftdi().split(',')
105+
return dict(zip(names, readings))
106+
107+
def i2cRead(addr, reg = 0, size = 'B', length = 0):
105108
from i2c import _i2cRead
106-
return _i2cRead(addr, reg, size)
109+
return _i2cRead(addr, reg, size, length)
107110

108111
def i2cWrite(addr, reg, val = '', size = 'B'):
109112
from i2c import _i2cWrite
110-
return _i2cWrite(addr, reg, val, size)
113+
_i2cWrite(addr, reg, val, size)
111114

112115
def serialRead():
113116
pass
@@ -129,8 +132,11 @@ def toggle(pin):
129132
else:
130133
digitalWrite(pin, 'HIGH')
131134

132-
def spiRead():
133-
pass
135+
def spiRead(bytes, cs='0'):
136+
with open('/dev/spidev1.' + str(cs), 'r') as f:
137+
data = f.read(min(bytes, 8191))
138+
f.close()
139+
return data
134140

135141
def spiWrite(val, cs='0'):
136142
with open('/dev/spidev1.' + str(cs), 'w') as f:
@@ -147,4 +153,17 @@ def spiGetSpeed(channel='0'):
147153
def spiSetSpeed(speed, channel='0'):
148154
import array, fcntl
149155
with open('/dev/spidev1.' + str(channel), 'w') as f:
150-
return fcntl.ioctl(f, 0x40046B04, array.array('i', [int(speed)]))
156+
return fcntl.ioctl(f, 0x40046B04, array.array('i', [int(speed)]))
157+
158+
def dmxWrite(data): # expects a list of up to 512 integers in range 0-255
159+
import serial
160+
161+
dmxPacket = chr(0x00) + ''.join(chr(element) for element in data)
162+
163+
# slow transmission is a hack to send break and mark-after-break signals
164+
slow = serial.Serial('/dev/ttyS1', 19200)
165+
slow.write(chr(0x00))
166+
slow.close()
167+
fast = serial.Serial('/dev/ttyS1', 250000, stopbits=serial.STOPBITS_TWO)
168+
fast.write(dmxPacket)
169+
fast.close()

0 commit comments

Comments
 (0)