这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 树莓派RP2040测试W25Q128

共1条 1/1 1 跳转至

树莓派RP2040测试W25Q128

专家
2026-05-16 20:02:44     打赏

测试使用MicroPython语言,在Thonny下测试,测试对象为W25Q128。开始使用的是W25Q64模块,使用的硬件SPI外设,结果失败。根本无法完成读写操作。以为是模块有问题,于是改用芯片+转换座的形式,手里没有W25Q64芯片,只有W25Q128的。结果依旧失败。

电路连接:

W25Q64.png

RP2040-W25Q64.png

同样电路没变,换成软件模拟的方式,使用SoftSPI库,结果就没有问题。

代码如下:

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
w25q128 = W25QXX(sck_pin=18, mosi_pin=19, miso_pin=16, cs_pin=17, capacity=128)
id = w25q128.read_id()
print("Flash ID:", id)
w25q128.erase_chip()
w25q128.write_string(0x000000, "Hello World!")
read_string = w25q128.read_string(0x000000, 12)
print("Read String:", read_string)

接下来准备依旧使用这个电路,使用逻辑分析仪,对比读取芯片ID的形式,看看问题出在哪里。




关键词: 大懒猫的试用笔记     RP2040     W25Q128    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]