micropython_spiFlash_w25qxx

w25qxx.py

python 复制代码
from machine import Pin,SoftSPI
import time

class W25QXX:
    def __init__(self, sck_pin, mosi_pin, miso_pin, cs_pin, capacity):
        self.spi = SoftSPI(-1, sck=Pin(sck_pin), mosi=Pin(mosi_pin), miso=Pin(miso_pin))
        self.cs = Pin(cs_pin, Pin.OUT)
        self.capacity = capacity
        self._write_enable()

    def _write_enable(self):
        self.cs.value(0)
        self.spi.write(bytes([0x06]))
        self.cs.value(1)
        time.sleep_us(10)

    def _write_disable(self):
        self.cs.value(0)
        self.spi.write(bytes([0x04]))
        self.cs.value(1)
        time.sleep_us(10)

    def _wait_busy(self):
        while True:
            self.cs.value(0)
            self.spi.write(bytes([0x05]))
            status = self.spi.read(1)[0]
            self.cs.value(1)
            if (status & 0x01) == 0:
                break

    def read_id(self):
        self.cs.value(0)
        self.spi.write(bytes([0x9F]))
        data = self.spi.read(3)
        self.cs.value(1)
        return data

    def erase_chip(self):
        self._write_enable()
        self.cs.value(0)
        self.spi.write(bytes([0xC7]))
        self.cs.value(1)
        self._wait_busy()
        
    def _is_sector_erase_required(self, address, data_length):
        sector = address // 4096
        sector_address = sector * 4096
        sector_end = sector_address + 4095
        data_end = address + data_length
        return data_end > sector_end

    def erase_sector(self, sector):
        sector_address = sector * 4096
        self._write_enable()
        self.cs.value(0)
        self.spi.write(bytes([0x20, (sector_address >> 16) & 0xFF, (sector_address >> 8) & 0xFF, sector_address & 0xFF]))
        self.cs.value(1)
        self._wait_busy()   


    def write_data(self, address, data):
        sector = address // 4096 
        # 检查目标扇区是否需要擦除
        #if self._is_sector_erase_required(address, len(data)):
        self.erase_sector(sector)
        self._write_enable()
        self.cs.value(0)
        self.spi.write(bytes([0x02, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF]))
        self.spi.write(data)
        self.cs.value(1)
        self._wait_busy()

    def read_data(self, address, length):
        self.cs.value(0)
        self.spi.write(bytes([0x03, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF]))
        data = self.spi.read(length)
        self.cs.value(1)
        return data

    def write_string(self, address, string):
        data = bytearray(string, "utf-8")
        self.write_data(address, data)

    def read_string(self, address, length):
        data = self.read_data(address, length)
        string = data.decode()
        return string

mian.py

python 复制代码
from machine import Pin,SoftSPI
import time
from w25qxx import W25QXX
#mosi_pin=D1
#miso_pin=D0
w25q16 = W25QXX(sck_pin=18, mosi_pin=23, miso_pin=19, cs_pin=5, capacity=16)

id = w25q16.read_id()
print("Flash ID:", id)
w25q16.erase_chip()
w25q16.write_string(0x000000, "44444, World!")
read_string = w25q16.read_string(0x000000, 13)
print("Read String:", read_string)
相关推荐
金銀銅鐵2 小时前
[Python] 扩展欧几里得算法
python·数学·算法
Duckdblab2 小时前
DuckDB 性能调优终极指南:打造闪电般的分析体验
python
带派擂总3 小时前
Python全栈开发精华版最全合集(包含各种面试题) Day24_异常和错误
python
金銀銅鐵6 小时前
n^5 和 n 的个位数是否总相等?
python·数学
aqi009 小时前
15天学会AI应用开发(九)利用Chroma持久化向量数据
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵9 小时前
借助 Pygame 探索最大公约数的规律
python·数学·游戏
ServBay1 天前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户8356290780511 天前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户8356290780511 天前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python