| 47 | SECTOR_SIZE = const(4096) |
| 48 | |
| 49 | class SPIflash: |
| 50 | def __init__(self, spi, cs, addr4b=False, size=None, pagesize=PAGE_SIZE, sectorsize=SECTOR_SIZE): |
| 51 | self._spi = spi |
| 52 | self._cs = cs |
| 53 | self._cs(1) |
| 54 | self._buf = bytearray(1) |
| 55 | self.pagesize = pagesize |
| 56 | self._addr4b = 0 |
| 57 | self._cmds = _CMDS3BA |
| 58 | self._addrbuf = bytearray(4) |
| 59 | |
| 60 | self.wait() |
| 61 | if size is None: |
| 62 | id = self.getid() |
| 63 | if id[2] == 1: |
| 64 | self._size = 512 * 1024 |
| 65 | else: |
| 66 | self._size = 1 << id[2] |
| 67 | else: |
| 68 | self._size = size |
| 69 | |
| 70 | header = self.get_sfdp(0, 16) |
| 71 | len = header[11] * 4; |
| 72 | if len >= 29: |
| 73 | addr = header[12] + (header[13] << 8) + (header[14] << 16) |
| 74 | table = self.get_sfdp(addr, len) |
| 75 | self._addr4b = ((table[2] >> 1) & 0x03) != 0 |
| 76 | self.sectorsize = 1 << table[28] |
| 77 | else: |
| 78 | self._addr4b = addr4b |
| 79 | self.sectorsize = sectorsize |
| 80 | |
| 81 | if self._addr4b: |
| 82 | self._cmds = _CMDS4BA |
| 83 | self._addrbuf = bytearray(5) |
| 84 | |
| 85 | def flash_size(self): |
| 86 | return self._size |
| 87 | |
| 88 | def flash_sectorsize(self): |
| 89 | return self.sectorsize |
| 90 | |
| 91 | def _write_cmd(self, val): |
| 92 | self._buf[0] = val |
| 93 | self._spi.write(self._buf) |
| 94 | |
| 95 | def _write_addr(self, cmd, addr): |
| 96 | self._addrbuf[0] = cmd |
| 97 | if self._addr4b: |
| 98 | self._addrbuf[-4] = addr >> 24 |
| 99 | self._addrbuf[-3] = addr >> 16 |
| 100 | self._addrbuf[-2] = addr >> 8 |
| 101 | self._addrbuf[-1] = addr |
| 102 | self._cs(0) |
| 103 | self._spi.write(self._addrbuf) |
| 104 | |
| 105 | def getid(self): |
| 106 | self._cs(0) |
no outgoing calls
no test coverage detected