1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import RPi.GPIO as GPIO
import time
def cleanup():
GPIO.cleanup()
def init_board(write = True):
GPIO.setmode(GPIO.BOARD)
if write:
oparm = GPIO.OUT
else:
oparm = GPIO.IN
# GPIO 0-7
# used as data pins, configure as input/output
GPIO.setup(11, oparm)
GPIO.setup(12, oparm)
GPIO.setup(13, oparm)
GPIO.setup(15, oparm)
GPIO.setup(16, oparm)
GPIO.setup(18, oparm)
GPIO.setup(22, oparm)
GPIO.setup(7, oparm)
# left side of T-cobbler, used as address pins
# configure address pins always out
GPIO.setup(26, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)
GPIO.setup(19, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
GPIO.setup(8, GPIO.OUT)
# used to trigger a write
GPIO.setup(5, GPIO.OUT)
# used to read
GPIO.setup(3, GPIO.OUT)
# set the pins to high, pins are active low
GPIO.output(5, True)
GPIO.output(3, True)
def read_data():
data = (GPIO.input(11))
print(GPIO.input(11))
data |= (GPIO.input(12) << 0x1)
print(GPIO.input(12))
data |= (GPIO.input(13) << 0x2)
print(GPIO.input(13))
data |= (GPIO.input(15) << 0x3)
print(GPIO.input(15))
data |= (GPIO.input(16) << 0x4)
print(GPIO.input(16))
data |= (GPIO.input(18) << 0x5)
print(GPIO.input(18))
data |= (GPIO.input(22) << 0x6)
print(GPIO.input(22))
data |= (GPIO.input(7) << 0x7)
print(GPIO.input(7))
print("read data: %s" % data)
return data
# data should be one byte
def set_data(data):
GPIO.output(11, (data & 0x1) > 0)
print((data & 0x1) > 0)
GPIO.output(12, (data & 0x2) > 0)
print((data & 0x2) > 0)
GPIO.output(13, (data & 0x4) > 0)
print((data & 0x4) > 0)
GPIO.output(15, (data & 0x8) > 0)
print((data & 0x8) > 0)
GPIO.output(16, (data & 0x10) > 0)
print((data & 0x10) > 0)
GPIO.output(18, (data & 0x20) > 0)
print((data & 0x20) > 0)
GPIO.output(22, (data & 0x40) > 0)
print((data & 0x40) > 0)
GPIO.output(7, (data & 0x80) > 0)
print((data & 0x80) > 0)
# address should be one byte
def set_address(address):
GPIO.output(26, (address & 0x1) > 0)
print((address & 0x1) > 0)
GPIO.output(24, (address & 0x2) > 0)
print((address & 0x2) > 0)
GPIO.output(23, (address & 0x4) > 0)
print((address & 0x4) > 0)
GPIO.output(21, (address & 0x8) > 0)
print((address & 0x8) > 0)
GPIO.output(19, (address & 0x10) > 0)
print((address & 0x10) > 0)
GPIO.output(10, (address & 0x20) > 0)
print((address & 0x20) > 0)
GPIO.output(8, (address & 0x40) > 0)
print((address & 0x40) > 0)
# for DEBUG use only 7 address bits to have one left for read trigger
#GPIO.output(5, (address & 0x80) > 0)
#print((address & 0x80) > 0)
def write_data_at(address, data):
print("set address to: %s" % address)
set_address(address)
print("set data to: %s" % data)
set_data(data)
# wait so everythings is stable
time.sleep(0.3)
# trigger write on pin 5
GPIO.output(5, False)
time.sleep(0.3)
GPIO.output(5, True)
def read_data_at(address):
print("set address to: %s" % address)
set_address(address)
# wait a little bit so the address is stable
time.sleep(0.3)
# trigger output enable
GPIO.output(3, False)
data = read_data()
GPIO.output(3, True)
print("read data %s" % data)
|