kopia lustrzana https://github.com/peterhinch/micropython_eeprom
Add delay after Pyboard D 3V3 enable - docs and test scripts.
rodzic
4a55115a5d
commit
82104ac4cc
|
@ -68,6 +68,7 @@ If you use a Pyboard D and power the EEPROMs from the 3V3 output you will need
|
||||||
to enable the voltage rail by issuing:
|
to enable the voltage rail by issuing:
|
||||||
```python
|
```python
|
||||||
machine.Pin.board.EN_3V3.value(1)
|
machine.Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
```
|
```
|
||||||
Other platforms may vary.
|
Other platforms may vary.
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# Copyright (c) 2019 Peter Hinch
|
# Copyright (c) 2019 Peter Hinch
|
||||||
|
|
||||||
import uos
|
import uos
|
||||||
|
import time
|
||||||
from machine import I2C, Pin
|
from machine import I2C, Pin
|
||||||
from eeprom_i2c import EEPROM, T24C512
|
from eeprom_i2c import EEPROM, T24C512
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@ from eeprom_i2c import EEPROM, T24C512
|
||||||
def get_eep():
|
def get_eep():
|
||||||
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
||||||
Pin.board.EN_3V3.value(1)
|
Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
eep = EEPROM(I2C(2), T24C512)
|
eep = EEPROM(I2C(2), T24C512)
|
||||||
print('Instantiated EEPROM')
|
print('Instantiated EEPROM')
|
||||||
return eep
|
return eep
|
||||||
|
|
|
@ -55,6 +55,7 @@ If you use a Pyboard D and power the EEPROMs from the 3V3 output you will need
|
||||||
to enable the voltage rail by issuing:
|
to enable the voltage rail by issuing:
|
||||||
```python
|
```python
|
||||||
machine.Pin.board.EN_3V3.value(1)
|
machine.Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
```
|
```
|
||||||
Other platforms may vary.
|
Other platforms may vary.
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# Copyright (c) 2019 Peter Hinch
|
# Copyright (c) 2019 Peter Hinch
|
||||||
|
|
||||||
import uos
|
import uos
|
||||||
|
import time
|
||||||
from machine import SPI, Pin
|
from machine import SPI, Pin
|
||||||
from eeprom_spi import EEPROM
|
from eeprom_spi import EEPROM
|
||||||
# Add extra pins if using multiple chips
|
# Add extra pins if using multiple chips
|
||||||
|
@ -13,6 +14,7 @@ cspins = (Pin(Pin.board.Y5, Pin.OUT, value=1), Pin(Pin.board.Y4, Pin.OUT, value=
|
||||||
def get_eep(stm):
|
def get_eep(stm):
|
||||||
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
||||||
Pin.board.EN_3V3.value(1)
|
Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
if stm:
|
if stm:
|
||||||
eep = EEPROM(SPI(2, baudrate=5_000_000), cspins, 256)
|
eep = EEPROM(SPI(2, baudrate=5_000_000), cspins, 256)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -59,6 +59,7 @@ If you use a Pyboard D and power the chips from the 3V3 output you will need
|
||||||
to enable the voltage rail by issuing:
|
to enable the voltage rail by issuing:
|
||||||
```python
|
```python
|
||||||
machine.Pin.board.EN_3V3.value(1)
|
machine.Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
```
|
```
|
||||||
Other platforms may vary but the Cypress chips require a 3.3V supply.
|
Other platforms may vary but the Cypress chips require a 3.3V supply.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# flash_spi.py MicroPython driver for SPI NOR flash devices.
|
# flash_spi.py MicroPython driver for SPI NOR flash devices.
|
||||||
|
|
||||||
# Released under the MIT License (MIT). See LICENSE.
|
# Released under the MIT License (MIT). See LICENSE.
|
||||||
# Copyright (c) 2019 Peter Hinch
|
# Copyright (c) 2019-2020 Peter Hinch
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from micropython import const
|
from micropython import const
|
||||||
|
@ -17,7 +17,6 @@ _CMDS4BA = b'\x13\x12\x21'
|
||||||
# No address
|
# No address
|
||||||
_WREN = const(6) # Write enable
|
_WREN = const(6) # Write enable
|
||||||
_RDSR1 = const(5) # Read status register 1
|
_RDSR1 = const(5) # Read status register 1
|
||||||
_RDSR2 = const(7) # Read status register 2
|
|
||||||
_RDID = const(0x9f) # Read manufacturer ID
|
_RDID = const(0x9f) # Read manufacturer ID
|
||||||
_CE = const(0xc7) # Chip erase (takes minutes)
|
_CE = const(0xc7) # Chip erase (takes minutes)
|
||||||
|
|
||||||
|
@ -27,18 +26,19 @@ _SEC_SIZE = const(4096) # Flash sector size 0x1000
|
||||||
class FLASH(FlashDevice):
|
class FLASH(FlashDevice):
|
||||||
|
|
||||||
def __init__(self, spi, cspins, size=None, verbose=True, sec_size=_SEC_SIZE, block_size=9):
|
def __init__(self, spi, cspins, size=None, verbose=True, sec_size=_SEC_SIZE, block_size=9):
|
||||||
# args: virtual block size in bits, no. of chips, bytes in each chip
|
|
||||||
self._spi = spi
|
self._spi = spi
|
||||||
self._cspins = cspins
|
self._cspins = cspins
|
||||||
self._ccs = None # Chip select Pin object for current chip
|
self._ccs = None # Chip select Pin object for current chip
|
||||||
self._bufp = bytearray(6) # instruction + 4 byte address + 1 byte value
|
self._bufp = bytearray(6) # instruction + 4 byte address + 1 byte value
|
||||||
self._mvp = memoryview(self._bufp) # cost-free slicing
|
self._mvp = memoryview(self._bufp) # cost-free slicing
|
||||||
self._page_size = 256 # Write uses 256 byte pages.
|
self._page_size = 256 # Write uses 256 byte pages.
|
||||||
for cs in cspins: # Ensure all chips are deselected
|
# Defensive code: application should have done the following.
|
||||||
|
# Pyboard D 3V3 output may just have been switched on.
|
||||||
|
for cs in cspins: # Deselect all chips
|
||||||
cs(1)
|
cs(1)
|
||||||
time.sleep_ms(1) # Found necessary on fast hosts
|
time.sleep_ms(1) # Meet Tpu 300μs
|
||||||
|
|
||||||
size = self.scan(verbose, size)
|
size = self.scan(verbose, size) # KiB
|
||||||
super().__init__(block_size, len(cspins), size * 1024, sec_size)
|
super().__init__(block_size, len(cspins), size * 1024, sec_size)
|
||||||
|
|
||||||
# Select the correct command set
|
# Select the correct command set
|
||||||
|
@ -52,7 +52,7 @@ class FLASH(FlashDevice):
|
||||||
self.initialise() # Initially cache sector 0
|
self.initialise() # Initially cache sector 0
|
||||||
|
|
||||||
# **** API SPECIAL METHODS ****
|
# **** API SPECIAL METHODS ****
|
||||||
# Scan: read manf ID
|
# Scan: return chip size in KiB as read from ID.
|
||||||
def scan(self, verbose, size):
|
def scan(self, verbose, size):
|
||||||
mvp = self._mvp
|
mvp = self._mvp
|
||||||
for n, cs in enumerate(self._cspins):
|
for n, cs in enumerate(self._cspins):
|
||||||
|
@ -62,7 +62,7 @@ class FLASH(FlashDevice):
|
||||||
self._spi.write_readinto(mvp[:4], mvp[:4])
|
self._spi.write_readinto(mvp[:4], mvp[:4])
|
||||||
cs(1)
|
cs(1)
|
||||||
scansize = 1 << (mvp[3] - 10)
|
scansize = 1 << (mvp[3] - 10)
|
||||||
if not size:
|
if size is None:
|
||||||
size = scansize
|
size = scansize
|
||||||
if size != scansize:
|
if size != scansize:
|
||||||
raise ValueError('Flash size mismatch: expected {}KiB, found {}KiB'.format(size, scansize))
|
raise ValueError('Flash size mismatch: expected {}KiB, found {}KiB'.format(size, scansize))
|
||||||
|
@ -125,7 +125,6 @@ class FLASH(FlashDevice):
|
||||||
self._spi.write(mvp[:self._cmdlen])
|
self._spi.write(mvp[:self._cmdlen])
|
||||||
self._spi.readinto(mvb[start : start + npage])
|
self._spi.readinto(mvb[start : start + npage])
|
||||||
cs(1)
|
cs(1)
|
||||||
# print('addr {} npage {} data {}'.format(addr, npage, mvb[start]))
|
|
||||||
nbytes -= npage
|
nbytes -= npage
|
||||||
start += npage
|
start += npage
|
||||||
addr += npage
|
addr += npage
|
||||||
|
|
|
@ -4,19 +4,21 @@
|
||||||
# Copyright (c) 2019 Peter Hinch
|
# Copyright (c) 2019 Peter Hinch
|
||||||
|
|
||||||
import uos
|
import uos
|
||||||
|
import time
|
||||||
from machine import SPI, Pin
|
from machine import SPI, Pin
|
||||||
from flash_spi import FLASH
|
from flash_spi import FLASH
|
||||||
|
|
||||||
# **** ADAPT THIS FUNCTION ****
|
# **** ADAPT THIS FUNCTION ****
|
||||||
|
|
||||||
# Return an EEPROM array. Adapt for platforms other than Pyboard, chip size and
|
# Return an EEPROM array. Adapt for platforms other than Pyboard.
|
||||||
# baudrate.
|
# May want to set chip size and baudrate.
|
||||||
def get_device():
|
def get_device():
|
||||||
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
||||||
Pin.board.EN_3V3.value(1)
|
Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1)
|
||||||
# Adjust to suit number of chips and their wiring.
|
# Adjust to suit number of chips and their wiring.
|
||||||
cspins = (Pin(Pin.board.Y5, Pin.OUT, value=1), Pin(Pin.board.Y4, Pin.OUT, value=1))
|
cspins = (Pin(Pin.board.Y5, Pin.OUT, value=1), Pin(Pin.board.Y4, Pin.OUT, value=1))
|
||||||
flash = FLASH(SPI(2, baudrate=20_000_000), cspins, size=32768)
|
flash = FLASH(SPI(2, baudrate=20_000_000), cspins)
|
||||||
print('Instantiated Flash')
|
print('Instantiated Flash')
|
||||||
return flash
|
return flash
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ If you use a Pyboard D and power the FRAMs from the 3V3 output you will need
|
||||||
to enable the voltage rail by issuing:
|
to enable the voltage rail by issuing:
|
||||||
```python
|
```python
|
||||||
machine.Pin.board.EN_3V3.value(1)
|
machine.Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
```
|
```
|
||||||
Other platforms may vary.
|
Other platforms may vary.
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
# Copyright (c) 2019 Peter Hinch
|
# Copyright (c) 2019 Peter Hinch
|
||||||
|
|
||||||
import uos
|
import uos
|
||||||
|
import time
|
||||||
from machine import I2C, Pin
|
from machine import I2C, Pin
|
||||||
from fram_i2c import FRAM
|
from fram_i2c import FRAM
|
||||||
|
|
||||||
|
@ -11,6 +12,7 @@ from fram_i2c import FRAM
|
||||||
def get_fram():
|
def get_fram():
|
||||||
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
if uos.uname().machine.split(' ')[0][:4] == 'PYBD':
|
||||||
Pin.board.EN_3V3.value(1)
|
Pin.board.EN_3V3.value(1)
|
||||||
|
time.sleep(0.1) # Allow decouplers to charge
|
||||||
fram = FRAM(I2C(2))
|
fram = FRAM(I2C(2))
|
||||||
print('Instantiated FRAM')
|
print('Instantiated FRAM')
|
||||||
return fram
|
return fram
|
||||||
|
|
Ładowanie…
Reference in New Issue