{"id":3043,"date":"2012-11-02T09:30:22","date_gmt":"2012-11-02T08:30:22","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=3043"},"modified":"2017-02-01T19:40:51","modified_gmt":"2017-02-01T18:40:51","slug":"spi-sur-raspberry-pi-1","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2012\/11\/02\/spi-sur-raspberry-pi-1\/","title":{"rendered":"SPI sur Raspberry Pi &#8211; 1"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/11\/02\/spi-sur-raspberry-pi-1\/\" rel=\"attachment wp-att-3073\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-3073\" title=\"SPI sur Raspberry Pi\" alt=\"SPI sur Raspberry Pi\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Raspberry-PI-et-SPI.png\" width=\"250\" height=\"154\" \/><\/a>La communication par lien SPI (<a title=\"SPI sur Wikipedia\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Serial_Peripheral_Interface\" target=\"_blank\"><em>Serial Peripheral Interface<\/em><\/a>) est un \u00e9l\u00e9ment important pour les syst\u00e8mes embarqu\u00e9s. Ceci concerne les micro-contr\u00f4leurs (syst\u00e8mes industriels par exemple), mais \u00e9galement les cartes \u00e0 micro-processeurs que l&rsquo;on emploie de plus en plus pour les piloter. Le <em>system-on-chip<\/em> qui \u00e9quipe le Raspberry Pi ne fait pas exception, nous pouvons le v\u00e9rifier.<\/p>\n<p>\n<!--more-->\n<\/p>\n<h1>Pr\u00e9sentation<\/h1>\n<p style=\"text-align: justify;\">Le SPI permet une communication entre un ma\u00eetre et un ou plusieurs esclaves. Le ma\u00eetre impose la fr\u00e9quence d&rsquo;horloge et s\u00e9lectionne l&rsquo;esclave auquel les donn\u00e9es sont envoy\u00e9es. La ligne MOSI permet d&rsquo;envoyer des donn\u00e9es depuis le ma\u00eetre vers l&rsquo;esclave. La ligne MISO est en haute-imp\u00e9dance jusqu&rsquo;au moment o\u00f9 l&rsquo;esclave est s\u00e9lectionn\u00e9 et o\u00f9 il doit envoyer des donn\u00e9es.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/11\/02\/spi-sur-raspberry-pi-1\/connexion-spi\/\" rel=\"attachment wp-att-3044\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3044\" title=\"Connexion SPI Ma\u00eetre-Esclave\" alt=\"Connexion SPI Ma\u00eetre-Esclave\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Connexion-SPI.png\" width=\"470\" height=\"145\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Lorsqu&rsquo;on dispose de plusieurs esclaves, ils peuvent \u00eatre connect\u00e9s sur un principe de bus (le ma\u00eetre s\u00e9lectionne parmi ses multiples sorties <span style=\"text-decoration: overline;\">SS0<\/span>, <span style=\"text-decoration: overline;\">SS1<\/span>, etc. l&rsquo;esclave auquel il s&rsquo;adresse) ou en <em>daisy-chain<\/em> (les lignes MISO et MOSI sont connect\u00e9es en cascade, le nombre de coups d&rsquo;horloge permettant de s\u00e9lectionner le p\u00e9riph\u00e9rique parmi l&rsquo;ensemble qui se comporte alors comme une sorte de registre \u00e0 d\u00e9calage).<\/p>\n<h1 style=\"text-align: justify;\">Connexion du Raspberry Pi<\/h1>\n<p style=\"text-align: justify;\">Le Raspberry Pi ne fonctionne (pour le moment) qu&rsquo;en mode <em>master<\/em>. Il dispose de deux sorties <span style=\"text-decoration: overline;\">SS0<\/span> et <span style=\"text-decoration: overline;\">SS1<\/span> pour la s\u00e9lection du p\u00e9riph\u00e9rique esclave auquel il s&rsquo;adresse. Les connexions se font sur les bornes suivantes du <a title=\"D\u00e9tail du port P1\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-10-27\/Connecteur-P1.pdf\" target=\"_blank\">port d&rsquo;extension P1<\/a>.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/10\/31\/spi-sur-raspberry-pi\/spi-raspberry-pi-2\/\" rel=\"attachment wp-att-3061\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3061\" title=\"Port SPI du RaspberryPI\" alt=\"Port SPI du RaspberryPI\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/SPI-Raspberry-PI1.png\" width=\"375\" height=\"659\" \/><\/a><\/p>\n<h1>\u00a0Configuration du noyau<\/h1>\n<p style=\"text-align: justify;\">Lors de la compilation du kernel, il faut activer l&rsquo;option \u00ab\u00a0<em>BCM2708 SPI controller driver<\/em>\u00a0\u00bb dans le sous-menu \u00ab\u00a0<em>SPI support<\/em>\u00a0\u00bb du menu \u00ab\u00a0<em>Device Drivers<\/em>\u00a0\u00bb comme indiqu\u00e9 sur la figure ci-dessous. L&rsquo;option \u00ab\u00a0<em>User mode SPI device driver support<\/em>\u00a0\u00bb permet de disposer d&rsquo;entr\u00e9es <code>\/dev\/spi0.0<\/code> (pour communiquer avec le premier esclave) et <code>\/dev\/spi0.1<\/code> pour communiquer avec le second. Ceci offre alors la possibilit\u00e9 d&rsquo;utiliser facilement l&rsquo;interface SPI depuis l&rsquo;espace utilisateur.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/10\/31\/spi-sur-raspberry-pi\/capture-du-2012-10-31-113327\/\" rel=\"attachment wp-att-3052\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3052\" title=\"Kernel  SPI Driver Raspberry-Pi\" alt=\"Kernel  SPI Driver Raspberry-Pi\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Capture-du-2012-10-31-113327.png\" width=\"664\" height=\"533\" \/><\/a><\/p>\n<h1>\u00c9criture vers un esclave<\/h1>\n<p style=\"text-align: justify;\">Apr\u00e8s compilation et installation du noyau et de ses modules, nous d\u00e9marrons le Raspberry Pi et chargeons les modules n\u00e9cessaires.<\/p>\n<pre>root@R-Pi# <strong>modprobe spi_bcm2708<\/strong>\n[   49.245907] bcm2708_spi bcm2708_spi.0: SPI Controller at 0x20204000 (irq 80)\nroot@R-Pi# <strong>modprobe spidev<\/strong>\nroot@R-Pi# <strong>ls -l \/dev\/spi*<\/strong>\ncrw-------    1 root     root      153,   0 Jan  1 00:00 \/dev\/spidev0.0\ncrw-------    1 root     root      153,   1 Jan  1 00:00 \/dev\/spidev0.1\nroot@R-Pi#<\/pre>\n<h2>Micro-contr\u00f4leur en lecture<\/h2>\n<p style=\"text-align: justify;\">J&rsquo;ai reli\u00e9 le Raspberry Pi avec un micro-contr\u00f4leur ATmega32 (en mode <em>Slave<\/em>) se trouvant sur un carte de d\u00e9veloppement STK500. Dans un premier temps, le micro-contr\u00f4leur lit les donn\u00e9es arrivant sur le port SPI et configure ses sorties num\u00e9riques en cons\u00e9quence. J&rsquo;ai modifi\u00e9 l&rsquo;\u00e9tat des fusibles de l&rsquo;ATmega32 afin qu&rsquo;il utilise une horloge interne \u00e0 8MHz plut\u00f4t que l&rsquo;horloge \u00e0 1MHz par d\u00e9faut. Pour cela je lis d&rsquo;abord l&rsquo;\u00e9tat initial du fusible <em>Low<\/em>.<\/p>\n<pre>[STK500]$ <strong>sudo avrdude -P \/dev\/ttyUSB0 -c stk500 -p m32 -U lfuse:r:-:h<\/strong>\n[...]\navrdude: writing output file \"\"\n0xe1\n[...]\n[STK500]$<\/pre>\n<p style=\"text-align: justify;\">Je dois modifier les trois bits de poids faibles en suivant <a title=\"Documentation ATmega32L\" href=\"http:\/\/www.atmel.com\/Images\/doc2503.pdf\" target=\"_blank\">la documentation de l&rsquo;ATmega32<\/a> (pages 29, 257 et 258).<\/p>\n<pre>[STK500]$ <strong>sudo avrdude -P \/dev\/ttyUSB0 -c stk500 -p m32 -U lfuse:w:0xe4:m<\/strong>\n[...]\navrdude: input file 0xe4 contains 1 bytes\navrdude: reading on-chip lfuse data:\n[...]\navrdude: 1 bytes of lfuse verified\n[STK500]$<\/pre>\n<p style=\"text-align: justify;\">Ensuite je flashe dans l&rsquo;ATmega32 le petit programme suivant.<\/p>\n<pre><strong>\/* test-spi-01.c - ATmega32 *\/<\/strong>\n#include &lt;avr\/io.h&gt;\n#include &lt;avr\/interrupt.h&gt;\n\nISR(SPI_STC_vect)\n{\n    PORTD = ~ SPDR;            \/\/ Write on leds the byte received\n    unsigned char sreg = SPSR; \/\/ Clear Interrupt Flag\n}\n\nint main (void)\n{\n    DDRB = (1&lt;&lt;PB6);           \/\/ Only MISO on output\n    SPCR = (1&lt;&lt;SPE | 1&lt;&lt;SPIE); \/\/ SPI Enable  with Interrupt\n\n    DDRD = 0xFF;               \/\/ PORTD for output (LEDs)\n\n    sei();                     \/\/ Enable global interrupts\n\n    while (1)\n        ;\n    return 0;\n}<\/pre>\n<p style=\"text-align: justify;\">Ce programme configure le port SPI en mode <em>Slave<\/em>, puis il effectue une boucle active (vide dans ce cas). Tout le travail est r\u00e9alis\u00e9 dans le handler d&rsquo;interruption qui copie sur le port D le caract\u00e8re re\u00e7u sur le port SPI. Programmons le micro-contr\u00f4leur.<\/p>\n<pre>[STK500]$ <strong>make<\/strong>\navr-gcc -Os -g -mmcu=atmega32   -c -o test-spi-01.o test-spi-01.c\navr-gcc -Os -g -mmcu=atmega32 -o test-spi-01.out  test-spi-01.o\navr-objcopy -j .text -O ihex test-spi-01.out test-spi-01.hex\nrm test-spi-01.out test-spi-01.o\n[STK500]$ <strong>sudo avrdude -P \/dev\/ttyUSB0 -c stk500 -p m32 -e -U flash:w:test-spi-01.hex<\/strong> \n\navrdude: AVR device initialized and ready to accept instructions\n[...]\nWriting | ################################################## | 100% 0.24s\n[...]\nReading | ################################################## | 100% 0.21s\n[...]\navrdude done.  Thank you.\n[STK500]$<\/pre>\n<p style=\"text-align: justify;\">Notez que pendant la programmation de l&rsquo;ATmega32 il est n\u00e9cessaire de d\u00e9brancher la ligne <em>SPI Clock<\/em> du Raspberry Pi (du moins avec mon programmateur STK500).<\/p>\n<h2>Rasberry Pi en \u00e9criture<\/h2>\n<p style=\"text-align: justify;\">Puis j&rsquo;installe sur la Raspberry Pi le programme suivant qui lit son entr\u00e9e standard et \u00e9crit la valeur indiqu\u00e9e sur le port SPI fourni sur sa ligne de commande.<\/p>\n<pre><strong>\/* test-spi-rpi-01.c - Programme pour Raspberry Pi *\/<\/strong>\n#include &lt;fcntl.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;unistd.h&gt;\n\n#include &lt;linux\/types.h&gt;\n#include &lt;linux\/spi\/spidev.h&gt;\n\n#include &lt;sys\/ioctl.h&gt;\n\nint main(int argc, char *argv[])\n{\n        int fd_spi;\n        char ligne[80];\n        int value;\n        unsigned char byte;\n\n        unsigned int speed = 250000;\n\n        if (argc != 3) {\n                fprintf(stderr, \"usage: %s &lt;spi-port&gt; &lt;spi-speed&gt;\\n\", argv[0]);\n                exit(EXIT_FAILURE);\n        }\n        fd_spi = open(argv[1], O_RDWR);\n        if (fd_spi &lt; 0) {\n                perror(argv[1]);\n                exit(EXIT_FAILURE);\n        }\n\n        if (sscanf(argv[2], \"%d\", &amp; speed) != 1) {\n                fprintf(stderr, \"Wrong value for speed: %s\\n\", argv[2]);\n                exit(EXIT_FAILURE);\n        }\n        if (ioctl(fd_spi, SPI_IOC_WR_MAX_SPEED_HZ, &amp; speed) != 0) {\n                perror(\"ioctl\");\n                exit(EXIT_FAILURE);\n        }\n\n        while (fgets(ligne, 80, stdin) != NULL) {\n                if (sscanf(ligne, \"%d\", &amp; value) != 1) {\n                        fprintf(stderr, \"integer value expected\\n\");\n                        continue;\n                }\n                byte = (unsigned char) (value &amp; 0xFF);\n                if (write(fd_spi, &amp; byte, 1) != 1) {\n                        perror(\"write\");\n                        exit(EXIT_FAILURE);\n                }\n        }\n        close(fd_spi);\n        return EXIT_SUCCESS;\n}<\/pre>\n<p style=\"text-align: justify;\">Nous lan\u00e7ons le programme sur le Raspberry Pi en lui indiquant une fr\u00e9quence d&rsquo;horloge de 2MHz (le maximum acceptable par l&rsquo;ATmega32 lorsqu&rsquo;il fonctionne avec une horloge \u00e0 8MHz).<\/p>\n<pre>root@R-Pi# <strong>.\/test-rpi-spi-01 \/dev\/spidev0.0 2000000<\/strong>\n<strong>1<\/strong>\n<strong>2<\/strong>\n<strong>4<\/strong>\n<strong>8<\/strong>\n<strong>16<\/strong>\n<strong>32<\/strong>\n<strong>64<\/strong>\n<strong>128<\/strong>\n<strong>85<\/strong>\n<strong>170<\/strong>\n<strong>237<\/strong><\/pre>\n<p style=\"text-align: justify;\">Les motifs binaires correspondant aux valeurs envoy\u00e9es sont visibles sur les leds de la carte de d\u00e9veloppement. Par exemple la valeur 237 (0xED ou 11101101b) est affich\u00e9e sur la figure ci-dessous.<br \/>\n<a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/10\/31\/spi-sur-raspberry-pi\/motif-leds\/\" rel=\"attachment wp-att-3068\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3068\" title=\"Leds sur STK500\" alt=\"Leds sur STK500\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Motif-Leds.png\" width=\"300\" height=\"131\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">De m\u00eame un analyseur logique connect\u00e9 entre le Raspberry Pi et l&rsquo;ATmega32 nous permet de voir l&rsquo;horloge SPI (ligne 1) et la ligne MOSI (ligne 2). Nous pouvons v\u00e9rifier que la fr\u00e9quence de l&rsquo;horloge (mesur\u00e9e entre les deux rep\u00e8res verticaux <code>O<\/code> et <code>M<\/code> et affich\u00e9e en bas de l&rsquo;\u00e9cran) est bien de 2MHz.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Analyseur-Logique-SPI-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-3069\" title=\"Analyseur Logique SPI\" alt=\"Analyseur Logique SPI\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Analyseur-Logique-SPI-01.png\" width=\"560\" height=\"411\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">L&rsquo;\u00e9tat de la ligne MOSI est lu par l&rsquo;esclave sur les fronts montants de l&rsquo;horloge (SPI mode 0). Nous pouvons retrouver la valeur binaire pr\u00e9c\u00e9dente (inscrite manuellement ici).<\/p>\n<h1>\u00a0Lecture depuis un esclave<\/h1>\n<h2>\u00a0Micro-contr\u00f4leur en \u00e9criture<\/h2>\n<p style=\"text-align: justify;\">Cette fois l&rsquo;ATmega32 va transmettre en permanence l&rsquo;\u00e9tat de son entr\u00e9e analogique (huit bits de poids forts) vers le Raspberry Pi. Le convertisseur analogique-num\u00e9rique est programm\u00e9 en mode <em>Free Running<\/em>, une interruption est d\u00e9clench\u00e9e \u00e0 la fin de chaque conversion qui enregistre dans une variable globale la valeur \u00e0 envoyer au Raspberry Pi.<\/p>\n<p style=\"text-align: justify;\">Le programme est le suivant.<\/p>\n<pre><strong>\/* test-spi-02.c - ATmega32 *\/<\/strong>\n\n#include &lt;avr\/io.h&gt;\n#include &lt;avr\/interrupt.h&gt;\n\nstatic unsigned char byte_to_write = 0;\n\nISR(SPI_STC_vect)\n{\n        PORTD = ~ SPDR;\n        unsigned char sreg = SPSR;\n        SPDR = byte_to_write;\n}\n\nISR(ADC_vect)\n{\n        unsigned char l = ADCL;\n        unsigned char h = ADCH;\n\n        unsigned int  v = (h &lt;&lt; 8) | l;\n        byte_to_write = (v &gt;&gt; 2) &amp; 0xFF;\n}\n\nint main (void)\n{\n        \/\/ Configure SPI Slave\n        DDRB = (1&lt;&lt;PB6);   \/\/ Only MISO on output\n        SPCR = (1&lt;&lt;SPE | 1&lt;&lt;SPIE);  \/\/ SPI Enable  with Interrupt\n\n        \/\/ Configure ADC on PA0\n        DDRA   = 0x00;      \/\/ PORTA for input (PA0 for ADC)\n        ADCSRA = 0x80;      \/\/ ADC Enable\n        ADMUX  = 0;         \/\/ Single Ended Input Channel 0\n        ADCSRA = 0xE8;      \/\/ ADC Enable + Start + Interrupt Enable + Auto Trigger\n\n        \/\/ Configure digital outputs\n        DDRD = 0xFF;        \/\/ PORTD for output (LEDs)\n\n        sei();\n        while (1)\n                ;\n\n        return 0;\n}<\/pre>\n<p style=\"text-align: justify;\">Encore une fois, le micro-contr\u00f4leur fonctionne en bouclant \u00ab\u00a0\u00e0 vide\u00a0\u00bb et tout le travail est r\u00e9alis\u00e9 dans les gestionnaires d&rsquo;interruption.<\/p>\n<h2>Raspberry Pi en lecture<\/h2>\n<p style=\"text-align: justify;\">Le programme de lecture sur le Raspberry Pi est identique au pr\u00e9c\u00e9dent, seule la boucle centrale de la fonction <code>main()<\/code> change.<\/p>\n<pre><strong>\/* test-spi-rpi-02.c - Programme pour Raspberry Pi *\/<\/strong>\n[...]\n  while (read(fd_spi, &amp; byte, 1) == 1)\n    fprintf(stdout, \"r%d (%02X)    \", byte);\n[...]<\/pre>\n<p style=\"text-align: justify;\">En lan\u00e7ant le programme sur le Raspberry Pi, nous voyons en continu l&rsquo;\u00e9tat de l&rsquo;entr\u00e9e analogique (reli\u00e9e ici \u00e0 un potentiom\u00e8tre).<\/p>\n<pre>root@R-Pi# <strong>.\/test-rpi-spi-02 \/dev\/spidev0.0 2000000<\/strong>\n163(A3)<\/pre>\n<p style=\"text-align: justify;\">L&rsquo;analyseur logique nous pr\u00e9sente sur la figure suivante la ligne MISO sur son canal 3, o\u00f9 l&rsquo;on reconna\u00eet la valeur 0xA3 (10100011b).<\/p>\n<p style=\"text-align: left;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Analyseur-Logique-SPI-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-3078\" title=\"Raspberry Pi - SPI\" alt=\"Raspberry Pi - SPI\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/10\/Analyseur-Logique-SPI-02.png\" width=\"560\" height=\"420\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h1>\u00a0Conclusion<\/h1>\n<p style=\"text-align: justify;\">Nous avons abord\u00e9 la mise en oeuvre simple du lien SPI sur le Raspberry Pi. Nous avons utilis\u00e9 simplement des op\u00e9rations <code>read()<\/code> et <code>write()<\/code> depuis l&rsquo;espace utilisateur. Nous pouvons \u00e9galement r\u00e9aliser des op\u00e9rations plus complexes comme une communication <em>full-duplex<\/em> &#8211; toujours depuis l&rsquo;espace utilisateur &#8211; ou le transfert de donn\u00e9es depuis l&rsquo;espace kernel. Ceci fera l&rsquo;objet de prochains articles.<\/p>\n<p style=\"text-align: justify;\"><strong>PS&nbsp;:<\/strong> Les sources des programmes pr\u00e9sent\u00e9s plus haut sont disponibles <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-11-02\/rpi-spi-01.tar.bz2\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-11-02\/rpi-spi-01.tar.bz2\">ici<\/a>.<\/p>\n<p style=\"text-align: justify;\">","protected":false},"excerpt":{"rendered":"<p>La communication par lien SPI (Serial Peripheral Interface) est un &eacute;l&eacute;ment important pour les syst&egrave;mes embarqu&eacute;s. Ceci concerne les micro-contr&ocirc;leurs (syst&egrave;mes industriels par exemple), mais &eacute;galement les cartes &agrave; micro-processeurs que l&rsquo;on emploie de plus en plus pour les piloter. Le system-on-chip qui &eacute;quipe le Raspberry Pi ne fait pas exception, nous pouvons le v&eacute;rifier.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,10,11],"tags":[],"class_list":["post-3043","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microprocesseur","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=3043"}],"version-history":[{"count":6,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3043\/revisions"}],"predecessor-version":[{"id":4623,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3043\/revisions\/4623"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=3043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=3043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=3043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}