[micropython k210] 在 MaixPy 上莫名其妙的读取不到 SD 卡文件的原因是因为 SPI1 被修改定义了。

2020年10月1日 目前通过接入软 SPI 模块解决问题。

所以在未来会使用传递 结构体 的方式作为抽象层恢复多端使用的 SPI 资源,或者引入 软 SPI 接口解决部分问题。

monkey patch 如下:


from machine import SPI
import utime
from Maix import GPIO
from fpioa_manager import fm

# MaixBit       W25QXX
# CS  (25)      CS
# MOSI(22)      D0 DI(MOSI)
# MISO(24)      D1 DO(MISO)
# SCK (23)      SCK

''' CUBE
07 |  V
15 | 21
20 | 08
 G | 06
'''

''' AMIGO
24 |  V
06 | 11
12 | 10
 G | 27
'''

print("Welcome to MicroPython!")
fm.register(20, fm.fpioa.GPIO5, force=True)
cs = GPIO(GPIO.GPIO5, GPIO.OUT)
#cs.value(0)
#utime.sleep_ms(2000)

print(os.listdir())
spi = SPI(SPI.SPI1, mode=SPI.MODE_MASTER, baudrate=400*1000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB,
    sck=21, mosi=8, miso=15)#使用程序配置了 cs0 则无法读取 W25QXX
print(os.listdir())
print(spi)

while True:
    fm.register(21, fm.fpioa.SPI1_SCLK, force=True)
    fm.register(8, fm.fpioa.SPI1_D0, force=True)
    fm.register(15, fm.fpioa.SPI1_D1, force=True)
    cs.value(0)
    write_data = bytearray([0x90, 0x00, 0x00, 0x00])
    spi.write(write_data)
    id_buf = bytearray(2)
    spi.readinto(id_buf, write=0xff)
    print(id_buf)
    print(time.ticks_ms())
    cs.value(1)
    #cs.value(0)
    utime.sleep_ms(200)
    #utime.sleep_ms(2200)
    fm.register(27, fm.fpioa.SPI1_SCLK, force=True)
    fm.register(28, fm.fpioa.SPI1_D0, force=True)
    fm.register(26, fm.fpioa.SPI1_D1, force=True)
    print(os.listdir())

spi.deinit()

这个问题实际上并没有什么好的解决方法,最好是统一到同一套 IO 接口,然后多个 SS (GPIO)片选完成多从机的通信,从而忽略这个重映射的问题。

posted @ 2020-08-28 23:57  Juwan  阅读(1443)  评论(0编辑  收藏  举报