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


同样电路没变,换成软件模拟的方式,使用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的形式,看看问题出在哪里。
我要赚赏金
