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)
相关推荐
寻星探路41 分钟前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024062 小时前
Bootstrap 警告框
开发语言
2601_949146533 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX3 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01033 小时前
C++课后习题训练记录Day98
开发语言·c++
ValhallaCoder3 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE4 小时前
PHP纹路验证码
开发语言·php
仟濹4 小时前
【Java基础】多态 | 打卡day2
java·开发语言