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)
相关推荐
l1t9 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程39-40
开发语言·python
曾阿伦10 小时前
Python 搭建简易HTTP服务
开发语言·python·http
YG亲测源码屋10 小时前
java配置环境变量、jdk环境变量配置、java环境变量设置方法
java·开发语言
MIUMIUKK10 小时前
从语法层面,看懂 Python 的特殊处
java·开发语言·python
FlyWIHTSKY10 小时前
TS、TSX、JS、JSX 文件扩展名详解
开发语言·javascript·ecmascript
着迷不白10 小时前
第一部分:认识python
开发语言·python
hujinyuan2016010 小时前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法
开开心心就好10 小时前
支持多显示器的Windows高效分屏工具
运维·python·科技·游戏·计算机外设·ocr·powerpoint
basketball61610 小时前
C++ 高级编程:2. 基本线程池实现
java·开发语言·c++