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