Module carte SD SPI¶
Description¶
Module SPI permettant d'utiliser une carte SD, ici au format standard.
Le module¶
Le brochage¶
Typique d'un dispositif SPI :
- broche MOSI
- broche MISO
- broche CLK
- broche CS (Chip Select)
- le V+ qui peut être 3.3V ou 5V (régulateur vers 3.3V sur la carte)
- le 0V
Pour mémoire : les broches SPI du Pi Pico¶
Sur le Pi Pico, on a 2 ports SPI. Les broches sont indiquées au format suivant :
- _SCK : CLK
- _TX : MOSI à priori *_RX : MISO à priori
- _CSn : CS
On a plusieurs possibilités. Il semble intéressant d'utiliser un groupe de 4 broches contiguües pour faciliter la connexion.
Montage type¶
On connecte :
- broche MOSI
- broche MISO
- broche CLK
- broche CS (Chip Select)
- 0V sur 0V
- V+ sur 3.3V
Librairie Micropython¶
Librairie officielle ici : https://github.com/micropython/micropython/blob/master/drivers/sdcard/sdcard.py
Copier le fichier sdcard.py sur la carte MicroPython
Débrouillage dans l'interpréteur¶
>>> import os
>>> import sdcard
>>> from machine import Pin, SPI
>>> dir(SPI)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'SPI' isn't defined
>>> dir(machine.SPI)
['__class__', '__name__', 'read', 'readinto', 'write', '__bases__', '__dict__', 'LSB', 'MSB', 'deinit', 'init', 'write_readinto']
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sdcard.py", line 54, in __init__
File "sdcard.py", line 82, in init_card
OSError: no SD card
>>> machine.SPI(0)
SPI(0, baudrate=122070, polarity=0, phase=0, bits=8, sck=6, mosi=7, miso=4)
>>> machine.SPI(0, sck=18, mosi=19,miso=16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: expecting a Pin
>>> from machine import Pin
>>> machine.SPI(0, sck=Pin(18), mosi=Pin(19),miso=Pin(16))
SPI(0, baudrate=992063, polarity=0, phase=0, bits=8, sck=18, mosi=19, miso=16)
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sdcard.py", line 54, in __init__
File "sdcard.py", line 87, in init_card
File "sdcard.py", line 135, in init_card_v2
OSError: timeout waiting for v2 card
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
>>> os.mount(sd,'/sd')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: 19
>>> dir(os)
['__class__', '__name__', 'remove', 'VfsLfs2', 'chdir', 'getcwd', 'ilistdir', 'listdir', 'mkdir', 'mount', 'rename', 'rmdir', 'stat', 'statvfs', 'umount', 'uname']
>>> help(os.mount)
object <function> is of type function
>>> help(os.mount())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: function missing 2 required positional arguments
>>> os.mount(sd,'/sd2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: 19
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
>>> sd
<SDCard object at 2000cc00>
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sdcard.py", line 54, in __init__
File "sdcard.py", line 82, in init_card
OSError: no SD card
>>> sd=sdcard.SDCard(machine.SPI(0), machine.Pin(17))
>>> os.mount(sd,'/sd')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: 19
>>> import port_diag
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: no module named 'port_diag'
Version propre
>>> import os, sdcard
>>> from machine import Pin, SPI
>>> spi=machine.SPI(0, sck=Pin(18), mosi=Pin(19),miso=Pin(16))
>>> sd=sdcard.SDCard(spi, machine.Pin(17))
>>> os.mount(sd,'/sd')
>>> os.listdir('/sd')
[]
>>> f=open("/sd/test.txt","w")
>>> f.write("""Ceci est un fichier de test""")
27
>>> f.close()
>>> os.listdir('/sd')
['test.txt']
Note
J'ai eu un erreur à mes premières tentatives de mointage de la carte SD. 2 choses ont permis de résoudre le problème :
- que la carte SD soit bien formatée en FAT 32 (enfin, j'ai fait çà, au cas où)
- et utiliser la dernière version de Micropython pour le port rp2, disponible ici : https://micropython.org/download/rp2-pico/
Code d'exemple¶
Liens utiles¶
-
A noter qu'il existe aussi un format micro SD : https://www.keyestudio.com/products/keyestudio-mini-micro-sd-tf-card-memory-shield-module-with-pins-for-arduino Par contre plus cher.