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 :
- http://docs.micropython.org/en/latest/library/pyb.SPI.html
- https://docs.micropython.org/en/latest/library/machine.SPI.html
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".