micropython_eeprom/fram/fram_test.py

140 wiersze
4.0 KiB
Python
Czysty Zwykły widok Historia

2019-12-17 17:10:43 +00:00
# fram_test.py MicroPython test program for Adafruit FRAM devices.
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2019 Peter Hinch
import uos
import time
2019-12-17 17:10:43 +00:00
from machine import I2C, Pin
from fram_i2c import FRAM
# Return an FRAM array. Adapt for platforms other than Pyboard.
def get_fram():
2022-09-22 09:04:29 +00:00
if uos.uname().machine.split(" ")[0][:4] == "PYBD":
2019-12-17 17:10:43 +00:00
Pin.board.EN_3V3.value(1)
time.sleep(0.1) # Allow decouplers to charge
2019-12-17 17:10:43 +00:00
fram = FRAM(I2C(2))
2022-09-22 09:04:29 +00:00
print("Instantiated FRAM")
2019-12-17 17:10:43 +00:00
return fram
2022-09-22 09:04:29 +00:00
2019-12-17 17:10:43 +00:00
# Dumb file copy utility to help with managing FRAM contents at the REPL.
def cp(source, dest):
2022-09-22 09:04:29 +00:00
if dest.endswith("/"): # minimal way to allow
dest = "".join((dest, source.split("/")[-1])) # cp /sd/file /fram/
with open(source, "rb") as infile: # Caller should handle any OSError
with open(dest, "wb") as outfile: # e.g file not found
2019-12-17 17:10:43 +00:00
while True:
buf = infile.read(100)
outfile.write(buf)
if len(buf) < 100:
break
2022-09-22 09:04:29 +00:00
2019-12-17 17:10:43 +00:00
# ***** TEST OF DRIVER *****
def _testblock(eep, bs):
2022-09-22 09:04:29 +00:00
d0 = b"this >"
d1 = b"<is the boundary"
2019-12-17 17:10:43 +00:00
d2 = d0 + d1
2022-09-22 09:04:29 +00:00
garbage = b"xxxxxxxxxxxxxxxxxxx"
2019-12-17 17:10:43 +00:00
start = bs - len(d0)
end = start + len(garbage)
2022-09-22 09:04:29 +00:00
eep[start:end] = garbage
res = eep[start:end]
2019-12-17 17:10:43 +00:00
if res != garbage:
2022-09-22 09:04:29 +00:00
return "Block test fail 1:" + str(list(res))
2019-12-17 17:10:43 +00:00
end = start + len(d0)
2022-09-22 09:04:29 +00:00
eep[start:end] = d0
2019-12-17 17:10:43 +00:00
end = start + len(garbage)
2022-09-22 09:04:29 +00:00
res = eep[start:end]
if res != b"this >xxxxxxxxxxxxx":
return "Block test fail 2:" + str(list(res))
2019-12-17 17:10:43 +00:00
start = bs
end = bs + len(d1)
2022-09-22 09:04:29 +00:00
eep[start:end] = d1
2019-12-17 17:10:43 +00:00
start = bs - len(d0)
end = start + len(d2)
2022-09-22 09:04:29 +00:00
res = eep[start:end]
2019-12-17 17:10:43 +00:00
if res != d2:
2022-09-22 09:04:29 +00:00
return "Block test fail 3:" + str(list(res))
2019-12-17 17:10:43 +00:00
def test():
fram = get_fram()
sa = 1000
for v in range(256):
fram[sa + v] = v
for v in range(256):
if fram[sa + v] != v:
2022-09-22 09:04:29 +00:00
print(
"Fail at address {} data {} should be {}".format(
sa + v, fram[sa + v], v
)
)
2019-12-17 17:10:43 +00:00
break
else:
2022-09-22 09:04:29 +00:00
print("Test of byte addressing passed")
2019-12-17 17:10:43 +00:00
data = uos.urandom(30)
sa = 2000
2022-09-22 09:04:29 +00:00
fram[sa : sa + 30] = data
if fram[sa : sa + 30] == data:
print("Test of slice readback passed")
2019-12-17 17:10:43 +00:00
# On FRAM the only meaningful block test is on a chip boundary.
block = fram._c_bytes
if fram._a_bytes > block:
res = _testblock(fram, block)
if res is None:
2022-09-22 09:04:29 +00:00
print("Test chip boundary {} passed".format(block))
2019-12-17 17:10:43 +00:00
else:
2022-09-22 09:04:29 +00:00
print("Test chip boundary {} fail".format(block))
2019-12-17 17:10:43 +00:00
print(res)
else:
2022-09-22 09:04:29 +00:00
print("Test chip boundary skipped: only one chip!")
2019-12-17 17:10:43 +00:00
# ***** TEST OF FILESYSTEM MOUNT *****
def fstest(format=False):
fram = get_fram()
if format:
uos.VfsFat.mkfs(fram)
2022-09-22 09:04:29 +00:00
vfs = uos.VfsFat(fram)
2019-12-17 17:10:43 +00:00
try:
2022-09-22 09:04:29 +00:00
uos.mount(vfs, "/fram")
2019-12-17 17:10:43 +00:00
except OSError: # Already mounted
pass
2022-09-22 09:04:29 +00:00
print('Contents of "/": {}'.format(uos.listdir("/")))
print('Contents of "/fram": {}'.format(uos.listdir("/fram")))
print(uos.statvfs("/fram"))
2019-12-17 17:10:43 +00:00
def cptest():
fram = get_fram()
2022-09-22 09:04:29 +00:00
if "fram" in uos.listdir("/"):
print("Device already mounted.")
2019-12-17 17:10:43 +00:00
else:
2022-09-22 09:04:29 +00:00
vfs = uos.VfsFat(fram)
2019-12-17 17:10:43 +00:00
try:
2022-09-22 09:04:29 +00:00
uos.mount(vfs, "/fram")
2019-12-17 17:10:43 +00:00
except OSError:
2022-09-22 09:04:29 +00:00
print("Fail mounting device. Have you formatted it?")
2019-12-17 17:10:43 +00:00
return
2022-09-22 09:04:29 +00:00
print("Mounted device.")
cp("fram_test.py", "/fram/")
cp("fram_i2c.py", "/fram/")
print('Contents of "/fram": {}'.format(uos.listdir("/fram")))
print(uos.statvfs("/fram"))
2019-12-17 17:10:43 +00:00
# ***** TEST OF HARDWARE *****
def full_test():
fram = get_fram()
page = 0
for sa in range(0, len(fram), 256):
data = uos.urandom(256)
2022-09-22 09:04:29 +00:00
fram[sa : sa + 256] = data
if fram[sa : sa + 256] == data:
print("Page {} passed".format(page))
2019-12-17 17:10:43 +00:00
else:
2022-09-22 09:04:29 +00:00
print("Page {} readback failed.".format(page))
2019-12-17 17:10:43 +00:00
page += 1