Skip to content

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 :

Code d'exemple


Liens utiles