SPI

Ce que l'on va faire ici

Nous allons voir ici comment réaliser une communication SPI en Python.

La communication SPI (SCK, MOSI, MISO) est disponible en natif et est gérée par la classe SPI :

Warning

La communication SPI est le protocole de communication utilisé par certains modules : une librairie dédiée est nécessaire le cas échéant pour implémenter la communication.

A noter que la communication SPI avec Arduino est utilisé avec certains modules tel que module RTC, module SD card, etc. Ces différentes fonctionnalités étant implémentées de façon natives ici, le recours à la communication SPI se réduit d'autant.

Un exemple est l'utilisation d'un module RTC basé sur le DS3231 par exemple : https://www.keyestudio.com/products/free-shipping-keyestudio-ds3231-high-precision-i2c-real-time-clock-module-for-arduino Ici une discussion sur l'utilisation d'un tel module : https://forum.micropython.org/viewtopic.php?t=1285

Et ici la librairie qui va bien en Micropython : https://github.com/peterhinch/micropython-samples/tree/master/DS3231

Déclaration d'un objet SPI

Si on appelle le constructeur de la classe, on obtient :

>>> machine.SPI(0)
SPI(0, baudrate=992063, polarity=0, phase=0, bits=8, sck=6, mosi=7, miso=4)

Le constructeur prend au minimum l'index du port utilisé, 0 ou 1. On voit donc ici que l'objet SPI créé a un certain nombre de valeurs par défaut notamment les broches sck, mosi et miso.

Pour mémoire, le brochage de la carte Pi Pico est :

2 ports SPI, 0 et 1

Comme on peut le constater ici, sur le Pi Pico on 2 ports SPI 0 et 1

Les broches SPI

Pour chaque port, les broches s'appellent :

  • _SCK : = CLK
  • _TX : = MOSI *_RX : = MISO
  • _CSn : = CS

Pour chacun des ports, ces broches sont en "copie" à plusieurs endroit, mais une seule solution pourra être utilisée à la fois.

On voit que par défaut, pour le port SPI 0, les broches par défaut sont :

Sur le Pi Pico, on a 2 ports SPI. Les broches sont indiquées au format suivant :

  • SCK = GP6
  • MOSI = GP7
  • MISO = GP8
  • _CSn : non déterminée

Si on souhaite utiliser des broches différentes, on fera :

>>> from machine import Pin, SPI
>>> spi=SPI(0, sck=Pin(18), mosi=Pin(19),miso=Pin(16))
>>> spi
SPI(0, baudrate=992063, polarity=0, phase=0, bits=8, sck=18, mosi=19, miso=16)

Comme on le voit ici, l'objet créé utilise bien les broches indiquées.

La broche CS est paramétrée séparément.

Exemple d'utilisation

Un exemple d'utilisation est celle d'un module carte SD avec le Pi Pico. Pour cela on fera :

>>> import os, sdcard
>>> from machine import Pin, SPI
>>> spi=machine.SPI(0, sck=Pin(18), mosi=Pin(19),miso=Pin(16)) # déclaration objet SPI avec broches voulues
>>> sd=sdcard.SDCard(spi, machine.Pin(17)) # déclaration objet SDCard basé sur objet SPI et broche CS voulue
>>> 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']

Remarquer ici que l'on passe l'objet SPI créé au constructeur de la classe SDCard d'une part, ainsi qu'une broche qui correspond à la broche CS à utiliser.

Pour plus de détails, voir le "module center", section "spi".