Skip to content

Commit 7d8369f

Browse files
authored
Merge pull request #7 from melissagirl/master
Fixed size when polling length of FRAM to reflect actual size
2 parents 974a1cc + 5365bea commit 7d8369f

File tree

1 file changed

+52
-52
lines changed

1 file changed

+52
-52
lines changed

adafruit_fram.py

100644100755
Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151
__version__ = "0.0.0-auto.0"
5252
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_FRAM.git"
5353

54-
_MAX_SIZE_I2C = const(32767)
55-
_MAX_SIZE_SPI = const(8191)
54+
_MAX_SIZE_I2C = const(32768)
55+
_MAX_SIZE_SPI = const(8192)
5656

5757
_I2C_MANF_ID = const(0x0A)
5858
_I2C_PROD_ID = const(0x510)
@@ -80,7 +80,7 @@ def __init__(self, max_size, write_protect=False, wp_pin=None):
8080
@property
8181
def write_wraparound(self):
8282
""" Determines if sequential writes will wrapaound highest memory address
83-
(``len(FRAM)``) address. If ``False``, and a requested write will
83+
(``len(FRAM) - 1``) address. If ``False``, and a requested write will
8484
extend beyond the maximum size, an exception is raised.
8585
"""
8686
return self._wraparound
@@ -106,14 +106,14 @@ def write_protected(self):
106106
return self._wp if self._wp_pin is None else self._wp_pin.value
107107

108108
def __len__(self):
109-
""" The maximum size of the current FRAM chip. This is the highest
110-
register location that can be read or written to.
109+
""" The size of the current FRAM chip. This is one more than the highest
110+
address location that can be read or written to.
111111
112112
.. code-block:: python
113113
114114
fram = adafruit_fram.FRAM_xxx() # xxx = 'I2C' or 'SPI'
115115
116-
# maximum size returned by len()
116+
# size returned by len()
117117
len(fram)
118118
119119
# can be used with range
@@ -122,7 +122,7 @@ def __len__(self):
122122
return self._max_size
123123

124124

125-
def __getitem__(self, key):
125+
def __getitem__(self, address):
126126
""" Read the value at the given index, or values in a slice.
127127
128128
.. code-block:: python
@@ -133,28 +133,29 @@ def __getitem__(self, key):
133133
# read values 0 thru 9 with a slice
134134
fram[0:9]
135135
"""
136-
if isinstance(key, int):
137-
if key > self._max_size:
138-
raise ValueError("Register '{0}' greater than maximum FRAM size."
139-
" ({1})".format(key, self._max_size))
136+
if isinstance(address, int):
137+
if not 0 <= address < self._max_size:
138+
raise ValueError("Address '{0}' out of range. It must be 0 <= address < {1}."
139+
.format(address, self._max_size))
140140
buffer = bytearray(1)
141-
read_buffer = self._read_register(key, buffer)
142-
elif isinstance(key, slice):
143-
if key.step is not None:
141+
read_buffer = self._read_address(address, buffer)
142+
elif isinstance(address, slice):
143+
if address.step is not None:
144144
raise ValueError("Slice stepping is not currently available.")
145145

146-
registers = list(range(key.start if key.start is not None else 0,
147-
key.stop if key.stop is not None else self._max_size))
148-
if (registers[0] + len(registers)) > self._max_size:
149-
raise ValueError("Register + Length greater than maximum FRAM size."
150-
" ({0})".format(self._max_size))
146+
regs = list(range(address.start if address.start is not None else 0,
147+
address.stop + 1 if address.stop is not None else self._max_size))
148+
if regs[0] < 0 or (regs[0] + len(regs)) > self._max_size:
149+
raise ValueError("Address slice out of range. It must be 0 <= [starting address"
150+
":stopping address] < {0}."
151+
.format(self._max_size))
151152

152-
buffer = bytearray(len(registers))
153-
read_buffer = self._read_register(registers[0], buffer)
153+
buffer = bytearray(len(regs))
154+
read_buffer = self._read_address(regs[0], buffer)
154155

155156
return read_buffer
156157

157-
def __setitem__(self, key, value):
158+
def __setitem__(self, address, value):
158159
""" Write the value at the given starting index.
159160
160161
.. code-block:: python
@@ -168,25 +169,24 @@ def __setitem__(self, key, value):
168169
if self.write_protected:
169170
raise RuntimeError("FRAM currently write protected.")
170171

171-
if isinstance(key, int):
172+
if isinstance(address, int):
172173
if not isinstance(value, (int, bytearray, list, tuple)):
173174
raise ValueError("Data must be a single integer, or a bytearray,"
174175
" list, or tuple.")
175-
if key > self._max_size:
176-
raise ValueError("Requested register '{0}' greater than maximum"
177-
" FRAM size. ({1})".format(key,
178-
self._max_size))
176+
if not 0 <= address < self._max_size:
177+
raise ValueError("Address '{0}' out of range. It must be 0 <= address < {1}."
178+
.format(address, self._max_size))
179179

180-
self._write(key, value, self._wraparound)
180+
self._write(address, value, self._wraparound)
181181

182-
elif isinstance(key, slice):
182+
elif isinstance(address, slice):
183183
raise ValueError("Slicing not available during write operations.")
184184

185-
def _read_register(self, register, read_buffer):
185+
def _read_address(self, address, read_buffer):
186186
# Implemented by subclass
187187
raise NotImplementedError
188188

189-
def _write(self, start_register, data, wraparound):
189+
def _write(self, start_address, data, wraparound):
190190
# Implemened by subclass
191191
raise NotImplementedError
192192

@@ -217,15 +217,15 @@ def __init__(self, i2c_bus, address=0x50, write_protect=False,
217217
self._i2c = i2cdev(i2c_bus, address)
218218
super().__init__(_MAX_SIZE_I2C, write_protect, wp_pin)
219219

220-
def _read_register(self, register, read_buffer):
220+
def _read_address(self, address, read_buffer):
221221
write_buffer = bytearray(2)
222-
write_buffer[0] = register >> 8
223-
write_buffer[1] = register & 0xFF
222+
write_buffer[0] = address >> 8
223+
write_buffer[1] = address & 0xFF
224224
with self._i2c as i2c:
225225
i2c.write_then_readinto(write_buffer, read_buffer)
226226
return read_buffer
227227

228-
def _write(self, start_register, data, wraparound=False):
228+
def _write(self, start_address, data, wraparound=False):
229229
# Decided against using the chip's "Page Write", since that would require
230230
# doubling the memory usage by creating a buffer that includes the passed
231231
# in data so that it can be sent all in one `i2c.write`. The single-write
@@ -237,21 +237,21 @@ def _write(self, start_register, data, wraparound=False):
237237
else:
238238
data_length = 1
239239
data = [data]
240-
if (start_register + data_length) - 1 > self._max_size:
240+
if (start_address + data_length) > self._max_size:
241241
if wraparound:
242242
pass
243243
else:
244-
raise ValueError("Starting register + data length extends beyond"
245-
" FRAM maximum size. Use ``write_wraparound`` to"
244+
raise ValueError("Starting address + data length extends beyond"
245+
" FRAM maximum address. Use ``write_wraparound`` to"
246246
" override this warning.")
247247
with self._i2c as i2c:
248248
for i in range(0, data_length):
249-
if not (start_register + i) > self._max_size:
250-
buffer[0] = (start_register + i) >> 8
251-
buffer[1] = (start_register + i) & 0xFF
249+
if not (start_address + i) > self._max_size - 1:
250+
buffer[0] = (start_address + i) >> 8
251+
buffer[1] = (start_address + i) & 0xFF
252252
else:
253-
buffer[0] = ((start_register + i) - self._max_size) >> 8
254-
buffer[1] = ((start_register + i) - self._max_size) & 0xFF
253+
buffer[0] = ((start_address + i) - self._max_size + 1) >> 8
254+
buffer[1] = ((start_address + i) - self._max_size + 1) & 0xFF
255255
buffer[2] = data[i]
256256
i2c.write(buffer)
257257

@@ -307,36 +307,36 @@ def __init__(self, spi_bus, spi_cs, write_protect=False,
307307
self._spi = _spi
308308
super().__init__(_MAX_SIZE_SPI, write_protect, wp_pin)
309309

310-
def _read_register(self, register, read_buffer):
310+
def _read_address(self, address, read_buffer):
311311
write_buffer = bytearray(3)
312312
write_buffer[0] = _SPI_OPCODE_READ
313-
write_buffer[1] = register >> 8
314-
write_buffer[2] = register & 0xFF
313+
write_buffer[1] = address >> 8
314+
write_buffer[2] = address & 0xFF
315315
with self._spi as spi:
316316
spi.write(write_buffer)
317317
spi.readinto(read_buffer)
318318
return read_buffer
319319

320-
def _write(self, start_register, data, wraparound=False):
320+
def _write(self, start_address, data, wraparound=False):
321321
buffer = bytearray(3)
322322
if not isinstance(data, int):
323323
data_length = len(data)
324324
else:
325325
data_length = 1
326326
data = [data]
327-
if (start_register + data_length) - 1 > self._max_size:
327+
if (start_address + data_length) > self._max_size:
328328
if wraparound:
329329
pass
330330
else:
331-
raise ValueError("Starting register + data length extends beyond"
332-
" FRAM maximum size. Use 'wraparound=True' to"
331+
raise ValueError("Starting address + data length extends beyond"
332+
" FRAM maximum address. Use 'wraparound=True' to"
333333
" override this warning.")
334334
with self._spi as spi:
335335
spi.write(bytearray([_SPI_OPCODE_WREN]))
336336
with self._spi as spi:
337337
buffer[0] = _SPI_OPCODE_WRITE
338-
buffer[1] = start_register >> 8
339-
buffer[2] = start_register & 0xFF
338+
buffer[1] = start_address >> 8
339+
buffer[2] = start_address & 0xFF
340340
spi.write(buffer)
341341
for i in range(0, data_length):
342342
spi.write(bytearray([data[i]]))

0 commit comments

Comments
 (0)