microSD插槽使得M5Stack的数据可以方便的存储在外部存储空间(SD卡)并且能够方便的同其他设备(比如PC)交换数据。 所以我打算在继续深入学习M5Stack的其他部分之前,先看看怎样挂载SD卡到系统中。
首先找到一个8G的microSD卡(先用Windows格式化为FAT32格式),插入到M5Stack中。(插入的时候注意点,microSD插座好像同外壳的插槽稍有错位,不小心会把卡插到塑料壳中,而不是插座内。)
官方资料说,M5Stack不支持超过16G的卡,这一点得到了日本友人的证实:
—— 使用谷歌翻译,翻译自如下链接
https://raspberrypi.mongonta.com/howto-start-m5stack-m5burner-lovyanlauncher/
一开始并不是很顺利,我在官方文档中并没有找到如何在MicroPython中挂载SD卡。Arduino倒是有,可是我暂时并不想跑Arduino。
后来在官网论坛上得到前辈指点,使用os.mountsd
>>> os.mountsd()
W (20141) sdspi_host: spi bus changed (1 -> 2)
E (20141) sdspi_host: spi bus 2 not available
E (20141) vfs_native: Failed to initialize SDcard (258).
Traceback (most recent call last):
File "", line 1, in
OSError: [Errno 5] EIO
却得到了报错。
然后在论坛中求助,又到处搜索,在mountsd命令之前也用os.sdconfig(...)尝试了各种模式,os.SDMODE_4LINE, os.SDMODE_1LINE and os.SDMODE_SPI ,都不行。
又按照LoBo的wiki上的指引,尝试如下指令,也不行。
uos.sdconfig(uos.SDMODE_SPI,clk=18,mosi=23,miso=19,cs=4)
难道是我的M5Stack坏了???
抱着试试看的心态,我尝试用M5Burner重新刷写了 UIFlow-v1.3.1-Beta和UIFlow-v1.2.3。然后竟然可以mountsd了。
如下各种尝试都可以。
UIFlow-v1.3.1-Beta下:
>>> import uos
>>> uos.sdconfig(uos.SDMODE_SPI,clk=18,mosi=23,miso=19,cs=4)
I (53596) gpio: GPIO[23]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pull down: 0| Intr:0
I (53596) gpio: GPIO[19]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pull down: 0| Intr:0
I (53604) gpio: GPIO[18]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pull down: 0| Intr:0
>>> uos.mountsd()
W (65959) sdspi_host: spi bus changed (1 -> 2)
I (65959) gpio: GPIO[4]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulld own: 0| Intr:0
---------------------
Mode: SPI
Name: SU08G
Type: SDHC/SDXC
Speed: default speed (25 MHz)
SPI speed: 40 MHz
Size: 7580 MB
CSD: ver=1, sector_size=512, capacity=15523840 read_bl_len=9
SCR: sd_spec=2, bus_width=5
>>>
UIFlow-v1.2.3下:
>>> import uos
>>> uos.sdconfig(uos.SDMODE_SPI,clk=18,mosi=23,miso=19,cs=4)
>>> uos.mountsd()
W (104277) sdspi_host: spi bus changed (1 -> 2)
---------------------
Mode: SPI
Name: SU08G
Type: SDHC/SDXC
Speed: default speed (25 MHz)
SPI speed: 20 MHz
Size: 7580 MB
CSD: ver=1, sector_size=512, capacity=15523840 read_bl_len=9
SCR: sd_spec=2, bus_width=5
>>>
或者:
>>> import uos
>>> uos.mountsd()
W (497494) sdspi_host: spi bus changed (1 -> 2)
---------------------
Mode: SPI
Name: SU08G
Type: SDHC/SDXC
Speed: default speed (25 MHz)
SPI speed: 20 MHz
Size: 7580 MB
CSD: ver=1, sector_size=512, capacity=15523840 read_bl_len=9
SCR: sd_spec=2, bus_width=5
或者干脆:
>>> os.mountsd()
W (121709) sdspi_host: spi bus changed (1 -> 2)
---------------------
Mode: SPI
Name: SU08G
Type: SDHC/SDXC
Speed: default speed (25 MHz)
SPI speed: 20 MHz
Size: 7580 MB
CSD: ver=1, sector_size=512, capacity=15523840 read_bl_len=9
SCR: sd_spec=2, bus_width=5
>>>
好吧,是不是可以说明原机自带的UIFlow系统是有问题的?……
然后列出SD卡中的目录,尝试改个文件名,证实挂载成功。
>>> os.listdir('/')
['flash', 'sd']
>>> os.listdir('/sd')
['System Volume Information', 'A.TXT']
>>> os.rename('/sd/A.TXT','/sd/B.TXT')
>>> os.listdir('/sd')
['System Volume Information', 'B.TXT']
>>>
那么,刚拿到的M5Stack,重新刷个机,是不是个好习惯?
不管怎样,用完了SD卡,unmount一下应该是个好习惯。
>>> os.umountsd()
[Update 20190609 19:39] 实验结果umountsd会影响lcd显示。
好啦,虽然有点波折,SD卡搞定了。
参考资料:
https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki/filesystems
https://forum.micropython.org/viewtopic.php?t=4551
https://loboris.eu/forum/showthread.php?tid=85
----
又买了一个M5StickC,下次把玩一下。