Introduction: Activer SPI Sur BeagleBone Black
Pour mon premier Instructable, je vais vous expliquer comment activer le SPI (Serial Peripherial Interface) sur la carte de développement Beaglbone Black. L'activation de cette fonctionnalité permet une communication fiable avec plusieurs équipements placés en parallèle tels que des mémoires, écran LCD ou encore des modules RF.
Prérequis:
La distribution Angstrom s'étant révélée dans mon cas instable sur le long terme avec des problèmes de connexion en SSH il faut lui préférer Debian pour BeagleBone Black installé sur micro SD (non pas sur l'EMMC car il entre directement en conflit avec le SPI !)
Step 1: Désactivation De L'HDMI Et De L'EMMC
Il faut premier lieu désactiver le HDMI et EMMC car ils entrent en conflit avec les pins du SPI il faut donc les désactiver avec la procédure suivante :
Entrez la commande : $ cat /sys/devices/bone_capemgr.*/slots
Cela permet de consulter la liste de capes présents sur la carte Vous obtenez :
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-L Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
Le « L » comme Loaded signifie que les capes sont activés, il faut donc les désactiver.
Entrer les commandes :
$ mkdir /mnt/boot
$ mount /dev/mmcblk0p1 /mnt/card
$ nano /mnt/card/uEnv.txt
Puis dé-commenter cette ligne en enlevant le dièse :
#cape_disable=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN,BB- BONE-EMMC-2G
Attention: la modification du fichier uEnv est très délicate, si elle est mal réalisée la Beaglebone ne bootera plus sur la carte SD vous obligeant à la réinstaller, pensez donc à sauvegarder votre travail avant cette opération !
Une fois modifié Ctrl-X, Y pour sauvegarder.
Puis redémarrez la carte :
$ reboot
Après le redémarrage vous obtiendrez :
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-- Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
Le « L » est enlevé, les capes sont désactivés.
Step 2: Mettre En Place Le DTO (Device Tree Overlay)
Avant d’activer le cape il faut le créer en déclarant son device tree overlay, cela équivaut à attribuer les pins au cape.
Nous activons ici le SPI0 (voir Image pour la disposition des Pins)
Entez les commandes : $ nano BB-SPI0-01-00A0.dts
Dans le fichier coller le texte suivant :
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "spi0pinmux";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
spi0_pins_s0: spi0_pins_s0 {
pinctrl-single,pins = <
0x150 0x30 /* spi0_sclk, OUTPUT_PULLUP | MODE0 */
0x154 0x30 /* spi0_d0, INPUT_PULLUP | MODE0 */
0x158 0x10 /* spi0_d1, OUTPUT_PULLUP | MODE0 */
0x15c 0x10 /* spi0_cs0, OUTPUT_PULLUP | MODE0 */
>;
};
};
};
fragment@1 {
target = <&spi0>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins_s0>;
spidev@0 {
spi-max-frequency = <24000000>;
reg = <0>;
compatible = "linux,spidev";
};
};
};
};
Puis Ctrl-X, Y.
Compiler avec : $ dtc -O dtb -o BB-SPI0-01-00A0.dtbo -b 0 -@ BB-SPI0-01-00A0.dts
Copier dans le répertoire: $ cp BB-SPI0-01-00A0.dtbo /lib/firmware/
Activer dans la liste des capes : $ echo BB-SPI0-01 > /sys/devices/bone_capemgr.*/slots
Vous obtenez :
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-- Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-SPI0-01
Step 3: Activer Le Cape
Au prochain redémarrage le cape nouvellement ajouté disparaitra si il n’est pas chargé au
boot !
Il faut donc l’activer dans le ficher suivant avant de redémarrer la carte: $ nano /etc/default/capemgr
Ecrire la ligne suivante dans le fichier : CAPE=BB-SPI0-01
Astuce : si l’on a plusieurs cape à activer rédiger la ligne comme ceci : CAPE=cape1, cape2
Pour finir redémarrez la carte : $ reboot
Afin de savoir si l’opération s’est bien passée entrez la commande suivante au redémarrage : $ ls -al /dev/spidev
Cette ligne devrait apparaitre : crw-rw---T 1 root spi 153, 0 MAY 19 21:07 /dev/spidev1.0
Step 4: Exemple De Cycle
Attention : cet exemple de signal n’est pas issu de la Beaglebone. Au cours de nos mesures
avec l’oscilloscope nous nous sommes rendu compte que la forme des signaux MOSI n’étaient pas réguliers cela étant dû à une trop faible résistance de tirage intégrés aux GPIO de la Beaglebone (Voir résultats attendus et réels)
Step 5: Programme De Test
Afin de tester si le SPI fonctionne correctement sur la BeagleBone téléchargez le programme en langage C disponible à l’adresse ci-dessous : https://www.kernel.org/doc/Documentation/spi/spid...
en remplaçant la ligne de code : static const char *device = "/dev/spidev1.1";
par: static const char *device = "/dev/spidev1.0";
car le SPI activé est le SPI 0 et non le SPI 1 Puis compiler avec la commande: $ gcc spidev_test.c
Pour tester le programme il faut relier MOSI et MISO par un câble et exécuter la commande suivante :
$ ./spidev_test -D /dev/spidev1.0
Si le programme fonctionne vous obtiendrez ceci :
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
(S’il ne fonctionne pas vous n’obtiendrez que des FF)
En espérant vous avoir aidé, si vous avez des questions n'hésitez pas ! (ça m'a pris près de 20h à trouver la solution la première fois :) )