Interface logicielle (API) - Driver SSP / SPI

De Wiki Techno-Innov
< Technique‎ | Logiciel‎ | API‎ | Use‎ | Drivers
Révision datée du 2 septembre 2020 à 04:49 par Nathael (discussion | contributions) (Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Driver SSP / SPI}} == Présentation == #include "drivers/ssp.h" #include "drivers/gpio.h" Les micro-contrôleurs LPC peuven... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche


Présentation

#include "drivers/ssp.h"
#include "drivers/gpio.h"

Les micro-contrôleurs LPC peuvent avoir un ou plusieurs Bus SPI (SSP).
La numérotation des Bus SPI présents commence à 0.

Gestion des signaux "Chip-Select" et partage des ressources

Lorsque le micro-contrôleur est configuré en maître la gestion des signaux d'activation des esclaves ("Slave Select" ou "Chip Select") est faite à l'aide de GPIO dédiées.
Ces GPIO sont normalement "actives Bas" (0). Il est donc nécessaire avant la première utilisation du Bus SPI d'avoir mis à l'état "Haut" (1) toutes les GPIO correspondant à des signaux d'activation de composants présents sur ce Bus.
N'importe quelle GPIO peut être utilisée pour réaliser cette fonction.

La gestion du signal d'activation lors de l'accès à un périphérique est faite "manuellement" par le driver du périphérique et non pas par le driver SSP car chaque périphérique a une gestion particulière de ce signal d'activation, pouvant inclure des délais, un maintient du signal pendant une série d'accès consécutifs, ou l'attente d'un signal "ready" venant du périphérique avant le début de la communication SPI.

Afin de permettre la cohabitation de plusieurs drivers dans un environnement multi-tâche le driver SSP fournit un mutex par Bus SPI qui doit être utilisé pour protéger chaque accès au Bus SPI

int spi_get_mutex(uint8_t ssp_num);
void spi_release_mutex(uint8_t ssp_num);

Configuration : Maître (Master)

int ssp_master_on(uint8_t ssp_num, uint8_t frame_type, uint8_t data_width, uint32_t rate);
void ssp_off(uint8_t ssp_num);

Revoie 0 si la configuration se déroule correctement, ou -EINVAL si 'ssp_num' ne correspond pas à un numéro de Bus SPI présent sur le microcontrôleur (la numérotation commence à 0).
Le paramètre 'frame_type' correspond à l'un des types suivants et dépends des périphériques présents sur le Bus :

  • LPC_SSP_FRAME_SPI
  • LPC_SSP_FRAME_TI
  • LPC_SSP_FRAME_MICROWIRE

Le paramètre 'data_width' correspond au nombre de bits composant un mot sur le Bus. Le protocole SPI supporte des valeurs entre 4 et 16, bien que la majorité des périphériques utilisent les valeurs 8 ou 16.
Le paramètre 'rate' correspond à la vitesse du Bus, en Hertz (Hz).

En mode maître la gestion du signal chip-select est à la charge des drivers de périphériques.

Cohabitation des périphériques sur le Bus SPI

Il est conseillé de regrouper les périphériques utilisant une configuration identique sur un même Bus SPI (et donc de séparer les composants utilisant une configuration différente), bien que plusieurs périphériques utilisant des configurations différentes puissent être présents sur un unique Bus.
Dans ce dernier cas, il sera nécessaire de faire appel à la fonction ssp_master_on() avant chaque accès au Bus pour s'assurer qu'il est toujours dans la configuration requise. Cette configuration devra être réalisée au niveau applicatif et non pas au niveau driver.

Configuration : Esclave (Slave)

int ssp_slave_on(uint8_t ssp_num, uint8_t frame_type, uint8_t data_width, uint8_t out_en, uint32_t max_rate);
void ssp_off(uint8_t ssp_num);
TODO

Transferts sur le Bus

Le Bus SPI est un bus bi-directionnel (full duplex) synchrone très particulier.
Il y a toujours à la fois émission et réception de données.

L'activation de l'horloge permettant la communication est faite par le maître et se fait uniquement lors de l'envoi de données sur le Bus, ce qui oblige le maître à envoyer des données même invalides ou toujours nulles pour pouvoir recevoir des données depuis un esclave.

Attention, les fonctions spi_transfer_single_frame() et spi_transfer_multiple_frames() ne vérifient pas la validité du paramètre 'ssp_num' qui a normalement déjà été utilisé et vérifié lors de l'appel à la fonction ssp_master_on() ou ssp_slave_on().

Ces fonctions ne gèrent pas les signaux Chip-Select ni le mutex protégeant les accès au Bus SPI, qui doivent être gérés par chaque driver de périphérique.

Transfert d'une donnée unique (un seul mot)

La fonction spi_transfer_single_frame() permet l'émission et la réception (simultanées) d'un mot (4 à 16 bits) sur le Bus SPI.

uint16_t spi_transfer_single_frame(uint8_t ssp_num, uint16_t data);

Envoie la donnée 'data' sur le Bus SPI (en fonction de la largeur de bus définie lors de l'appel à ssp_master_on()) et retourne la valeur lue pendant cet envoi.
Le paramètre 'ssp_num' correspond au numéro du Bus SPI (la numérotation commence à 0).

Transfert d'une suite de données (plusieurs mots)

La fonction spi_transfer_multiple_frames() permet l'émission et la réception (simultanées) d'une suite de mots (4 à 16 bits par mot) sur le Bus SPI.
Cette fonction utilise le buffer interne du contrôleur SPI pour limiter au maximum le délai entre deux mots successifs.

int spi_transfer_multiple_frames(uint8_t ssp_num, void* data_out, void* data_in, int size, int width);

Le paramètre 'ssp_num' correspond au numéro du Bus SPI (la numérotation commence à 0).
Les paramètres 'data_out' et 'data_in' sont des buffers alloués par l'utilisateur dont le type dépends de la largeur du bus (paramètre 'width') :

  • Si 'width' est inférieur ou égal à 8, 'data_out' et 'data_in' doivent être de type uint8_t*
  • Si 'width' est supérieur à 8, 'data_out' et 'data_in' doivent être de type uint16_t*

Le paramètre 'data_out' contient les données qui seront envoyées sur le Bus. Les données doivent être placées dans les bits de poids faible si la largeur du bus (4 à 16 bits) ne correspond pas à la taille des mots du buffer (8 ou 16 bits). Si il est NULL, alors le contenu initial du buffer 'data_in' sera utilisé.
Si il n'est pas NULL, le paramètre 'data_in' représente un buffer dans lequel seront placées les données reçues.
Les paramètres 'data_out' et 'data_in' ne doivent jamais être NULL en même temps.
Le paramètre 'size' représente le nombre de mots (4 à 16 bits) à transférer sur le Bus. Le paramètre 'size' est identique pour la lecture et l'écriture, le nombre de mots lus et écris étant toujours identique de part le fonctionnement du Bus.
La fonction spi_transfer_multiple_frames() renvoie le nombre de mots transférés sur le Bus ou une valeur négative en cas d'erreur :

  • -EINVAL si 'data_out' et 'data_in' sont tous les deux NULL.