51
51
__version__ = "0.0.0-auto.0"
52
52
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_FRAM.git"
53
53
54
- _MAX_SIZE_I2C = const (32767 )
55
- _MAX_SIZE_SPI = const (8191 )
54
+ _MAX_SIZE_I2C = const (32768 )
55
+ _MAX_SIZE_SPI = const (8192 )
56
56
57
57
_I2C_MANF_ID = const (0x0A )
58
58
_I2C_PROD_ID = const (0x510 )
@@ -80,7 +80,7 @@ def __init__(self, max_size, write_protect=False, wp_pin=None):
80
80
@property
81
81
def write_wraparound (self ):
82
82
""" 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
84
84
extend beyond the maximum size, an exception is raised.
85
85
"""
86
86
return self ._wraparound
@@ -106,14 +106,14 @@ def write_protected(self):
106
106
return self ._wp if self ._wp_pin is None else self ._wp_pin .value
107
107
108
108
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.
111
111
112
112
.. code-block:: python
113
113
114
114
fram = adafruit_fram.FRAM_xxx() # xxx = 'I2C' or 'SPI'
115
115
116
- # maximum size returned by len()
116
+ # size returned by len()
117
117
len(fram)
118
118
119
119
# can be used with range
@@ -122,7 +122,7 @@ def __len__(self):
122
122
return self ._max_size
123
123
124
124
125
- def __getitem__ (self , key ):
125
+ def __getitem__ (self , address ):
126
126
""" Read the value at the given index, or values in a slice.
127
127
128
128
.. code-block:: python
@@ -133,28 +133,29 @@ def __getitem__(self, key):
133
133
# read values 0 thru 9 with a slice
134
134
fram[0:9]
135
135
"""
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 ))
140
140
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 :
144
144
raise ValueError ("Slice stepping is not currently available." )
145
145
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 ))
151
152
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 )
154
155
155
156
return read_buffer
156
157
157
- def __setitem__ (self , key , value ):
158
+ def __setitem__ (self , address , value ):
158
159
""" Write the value at the given starting index.
159
160
160
161
.. code-block:: python
@@ -168,25 +169,24 @@ def __setitem__(self, key, value):
168
169
if self .write_protected :
169
170
raise RuntimeError ("FRAM currently write protected." )
170
171
171
- if isinstance (key , int ):
172
+ if isinstance (address , int ):
172
173
if not isinstance (value , (int , bytearray , list , tuple )):
173
174
raise ValueError ("Data must be a single integer, or a bytearray,"
174
175
" 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 ))
179
179
180
- self ._write (key , value , self ._wraparound )
180
+ self ._write (address , value , self ._wraparound )
181
181
182
- elif isinstance (key , slice ):
182
+ elif isinstance (address , slice ):
183
183
raise ValueError ("Slicing not available during write operations." )
184
184
185
- def _read_register (self , register , read_buffer ):
185
+ def _read_address (self , address , read_buffer ):
186
186
# Implemented by subclass
187
187
raise NotImplementedError
188
188
189
- def _write (self , start_register , data , wraparound ):
189
+ def _write (self , start_address , data , wraparound ):
190
190
# Implemened by subclass
191
191
raise NotImplementedError
192
192
@@ -217,15 +217,15 @@ def __init__(self, i2c_bus, address=0x50, write_protect=False,
217
217
self ._i2c = i2cdev (i2c_bus , address )
218
218
super ().__init__ (_MAX_SIZE_I2C , write_protect , wp_pin )
219
219
220
- def _read_register (self , register , read_buffer ):
220
+ def _read_address (self , address , read_buffer ):
221
221
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
224
224
with self ._i2c as i2c :
225
225
i2c .write_then_readinto (write_buffer , read_buffer )
226
226
return read_buffer
227
227
228
- def _write (self , start_register , data , wraparound = False ):
228
+ def _write (self , start_address , data , wraparound = False ):
229
229
# Decided against using the chip's "Page Write", since that would require
230
230
# doubling the memory usage by creating a buffer that includes the passed
231
231
# 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):
237
237
else :
238
238
data_length = 1
239
239
data = [data ]
240
- if (start_register + data_length ) - 1 > self ._max_size :
240
+ if (start_address + data_length ) > self ._max_size :
241
241
if wraparound :
242
242
pass
243
243
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"
246
246
" override this warning." )
247
247
with self ._i2c as i2c :
248
248
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
252
252
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
255
255
buffer [2 ] = data [i ]
256
256
i2c .write (buffer )
257
257
@@ -307,36 +307,36 @@ def __init__(self, spi_bus, spi_cs, write_protect=False,
307
307
self ._spi = _spi
308
308
super ().__init__ (_MAX_SIZE_SPI , write_protect , wp_pin )
309
309
310
- def _read_register (self , register , read_buffer ):
310
+ def _read_address (self , address , read_buffer ):
311
311
write_buffer = bytearray (3 )
312
312
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
315
315
with self ._spi as spi :
316
316
spi .write (write_buffer )
317
317
spi .readinto (read_buffer )
318
318
return read_buffer
319
319
320
- def _write (self , start_register , data , wraparound = False ):
320
+ def _write (self , start_address , data , wraparound = False ):
321
321
buffer = bytearray (3 )
322
322
if not isinstance (data , int ):
323
323
data_length = len (data )
324
324
else :
325
325
data_length = 1
326
326
data = [data ]
327
- if (start_register + data_length ) - 1 > self ._max_size :
327
+ if (start_address + data_length ) > self ._max_size :
328
328
if wraparound :
329
329
pass
330
330
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"
333
333
" override this warning." )
334
334
with self ._spi as spi :
335
335
spi .write (bytearray ([_SPI_OPCODE_WREN ]))
336
336
with self ._spi as spi :
337
337
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
340
340
spi .write (buffer )
341
341
for i in range (0 , data_length ):
342
342
spi .write (bytearray ([data [i ]]))
0 commit comments