{"id":4119,"date":"2014-08-12T06:06:49","date_gmt":"2014-08-12T05:06:49","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=4119"},"modified":"2014-08-12T17:21:52","modified_gmt":"2014-08-12T16:21:52","slug":"projet-spi-tools","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2014\/08\/12\/projet-spi-tools\/","title":{"rendered":"Projet spi-tools"},"content":{"rendered":"<p style=\"text-align: justify;\">Je viens de publier sur GitHub un petit projet nomm\u00e9 <strong>Spi-tools<\/strong>, regroupant deux utilitaires pour communiquer sous Linux en utilisant le <a title=\"SPI sur Wikipedia francophone\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Serial_Peripheral_Interface\" target=\"_blank\">protocole SPI<\/a>. Ce projet a \u00e9t\u00e9 \u00e9crit pour illustrer le fonctionnement d&rsquo;un lien SPI entre un microprocesseur sous Linux (Raspberry Pi en l&rsquo;occurrence) et un microcontr\u00f4leur (T.I. MSP430), mais il doit pouvoir s&rsquo;appliquer \u00e0 la plupart des besoins de configuration et communication en SPI sous Linux.<br \/>\n<!--more-->\n<\/p>\n<h1 style=\"text-align: justify;\">Interface Spidev<\/h1>\n<p style=\"text-align: justify;\">Ces deux outils fonctionnent en utilisant l&rsquo;interface <em>Spidev<\/em> du noyau Linux. Pour la charger il est donc n\u00e9cessaire de charger dans le kernel le module <code>spidev.ko<\/code>, g\u00e9n\u00e9ralement pr\u00e9c\u00e9d\u00e9 du module permettant de piloter le contr\u00f4leur SPI du syst\u00e8me.<\/p>\n<p style=\"text-align: justify;\">Par exemple, sur un Raspberry Pi, on fera:<\/p>\n<pre>$ <strong>sudo modprobe spi-bcm2708<\/strong>\n$ <strong>sudo modprobe spidev<\/strong><\/pre>\n<p style=\"text-align: justify;\">\u00c0 partir de ce moment, des fichiers sp\u00e9ciaux apparaissent dans <code>\/dev<\/code> pour repr\u00e9senter les interfaces SPI disponibles. Voici le r\u00e9sultat sur un Raspberry Pi.<\/p>\n<pre>$ <strong>ls -l \/dev\/spi*<\/strong>\ncrw-rw---T 1 root spi 153, 0 Aug 11 20:26 \/dev\/spidev0.0\ncrw-rw---T 1 root spi 153, 1 Aug 11 20:26 \/dev\/spidev0.1\n$<\/pre>\n<h1>Compilation du projet<\/h1>\n<p style=\"text-align: justify;\">La compilation de ces petits outils ne n\u00e9cessite aucune biblioth\u00e8que ou utilitaire particuliers.<\/p>\n<pre>$ <strong>git clone <a title=\"https:\/\/github.com\/cpb-\/spi-tools.git\" href=\"https:\/\/github.com\/cpb-\/spi-tools.git\" target=\"_blank\">https:\/\/github.com\/cpb-\/spi-tools.git<\/a><\/strong>\nCloning into 'spi-tools'...\nremote: Counting objects: 43, done.\nremote: Compressing objects: 100% (29\/29), done.\nremote: Total 43 (delta 20), reused 34 (delta 13)\nUnpacking objects: 100% (43\/43), done.\n$ <strong>cd ..\/spi-tools\/<\/strong>\n$ <strong>make <\/strong>\ncc -Wall -DVERSION=\\\"0.1-3-g0408c9d\\\"    spi-config.c   -o spi-config\ncc -Wall -DVERSION=\\\"0.1-3-g0408c9d\\\"    spi-pipe.c   -o spi-pipe\n$<\/pre>\n<h1>Configuration<\/h1>\n<p style=\"text-align: justify;\">Le premier outil permet de configurer en ligne de commande les param\u00e8tres d&rsquo;une liaison SPI. Si nous l&rsquo;invoquons sans argument, il nous indique comment obtenir de l&rsquo;aide.<\/p>\n<pre>$ <strong>.\/spi-config<\/strong> \n.\/spi-config: no device specified (use option -h for help).\n$ <strong>.\/spi-config -h<\/strong>\nusage: .\/spi-config options...\n  options:\n    -d --device=  use the given spi-dev character device.\n    -q --query         print the current configuration.\n    -m --mode=[0-3]    use the selected spi mode.\n             0: low iddle level, sample on leading edge\n             1: low iddle level, sample on trailing edge\n             2: high iddle level, sample on leading edge\n             3: high iddle level, sample on trailing edge\n    -l --lsb={0,1}     LSB first (1) or MSB first (0)\n    -b --bits=[7...]   bits per word\n    -s --speed=   set the speed in Hz\n    -h --help          this screen\n    -v --version       display the version number\n$<\/pre>\n<p style=\"text-align: justify;\">On utilisera donc l&rsquo;option <code>-d<\/code> pour pr\u00e9ciser l&rsquo;interface SPI concern\u00e9e. L&rsquo;option <code>-q<\/code> nous permet de voir la configuration courante.<\/p>\n<pre>$ <strong>.\/spi-config -d \/dev\/spidev0.0 -q<\/strong>\n\/dev\/spidev0.0: mode=0, lsb=0, bits=8, speed=500000\n$<\/pre>\n<p style=\"text-align: justify;\">Nous pourrons donc fixer le mode SPI pour s&rsquo;adapter \u00e0 un composant externe, le sens et la taille des mots \u00e9chang\u00e9s, ainsi que la vitesse de communication en Hz.<\/p>\n<pre>$ <strong>.\/spi-config -d \/dev\/spidev0.0 -s 10000000<\/strong>\n$ <strong>.\/spi-config -d \/dev\/spidev0.0 -q<\/strong>\n\/dev\/spidev0.0: mode=0, lsb=0, bits=8, speed=10000000\n$<\/pre>\n<h1>Communication<\/h1>\n<p style=\"text-align: justify;\">Un avantage du SPI est la possibilit\u00e9 de dialoguer en mode <em>full-duplex<\/em>, le ma\u00eetre recevant dans un registre de r\u00e9ception les donn\u00e9es \u00e9mises par l&rsquo;esclave alors que lui-m\u00eame transmet son message. Ce syst\u00e8me est donc tr\u00e8s rapide. Associ\u00e9 au d\u00e9bit \u00e9lev\u00e9 (habituellement plusieurs MHz) que l&rsquo;on peut employer, il permet des communications tr\u00e8s efficaces.<\/p>\n<p style=\"text-align: justify;\">Il est n\u00e9anmoins difficile \u00e0 utiliser depuis l&rsquo;espace utilisateur en employant les appels syst\u00e8me <code>read()<\/code> et <code>write()<\/code> classiques. Le noyau met donc \u00e0 notre disposition une commande <code>ioctl()<\/code> \u00e0 laquelle on fournit deux buffers, l&rsquo;un contenant les donn\u00e9es \u00e0 envoyer, l&rsquo;autre destin\u00e9 \u00e0 la r\u00e9ception.<\/p>\n<p style=\"text-align: justify;\">Le programme <code>spi-pipe<\/code> offre une interface pour cet appel syst\u00e8me <code>ioctl()<\/code> en prenant en charge la gestion des buffers. Comme son nom l&rsquo;indique, on l&#8217;emploie depuis la ligne de commande en lui fournissant les donn\u00e9es \u00e0 envoyer sur son entr\u00e9e standard et en r\u00e9cup\u00e9rant simultan\u00e9ment sur sa sortie standard les donn\u00e9es re\u00e7ues.<\/p>\n<p style=\"text-align: justify;\">Comme le programme pr\u00e9c\u00e9dent, il pr\u00e9sente une aide en ligne sur les quelques options propos\u00e9es.<\/p>\n<pre>$ <strong>.\/spi-pipe<\/strong>\n.\/spi-pipe: no device specified (use option -h for help).\n$ <strong>.\/spi-pipe -h<\/strong>\nusage: .\/spi-pipe options...\n  options:\n    -d --device=    use the given spi-dev character device.\n    -b --blocksize= transfer blocks size in byte\n    -h --help            this screen\n    -v --version         display the version number\n$<\/pre>\n<p style=\"text-align: justify;\">Si on veut simplement envoyer octet par octet des donn\u00e9es produites par la <em>commande-1<\/em> vers un esclave SPI, on pourra utiliser une syntaxe comme<\/p>\n<pre>$ <em>commande-1<\/em><strong> | .\/spi-dev -d \/dev\/spidev0.0 &gt; \/dev\/null<\/strong><\/pre>\n<p style=\"text-align: justify;\">Pour lire des donn\u00e9es envoy\u00e9es par un esclave et les traiter avec la <em>commande-2<\/em>:<\/p>\n<pre>$ <strong>.\/spi-dev -d \/dev\/spidev0.0 &lt;\/dev\/zero  |<\/strong> <em>commande-2<\/em><\/pre>\n<p style=\"text-align: justify;\">Enfin, on peut intercaler la commande dans un pipeline ainsi&nbsp;:<\/p>\n<pre>$ <em>commande-1<\/em><strong> | .\/spi-pipe -d \/dev\/spidev0.0 | <\/strong><em>commande-2<\/em><\/pre>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Ce petit projet simple me sert \u00e0 mettre au point et v\u00e9rifier le comportement d&rsquo;une biblioth\u00e8que de communication plus \u00e9volu\u00e9e dont je reparlerai ici. Tous les retours (bugs, suggestions, etc.) sont les bienvenus.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Je viens de publier sur GitHub un petit projet nomm&eacute; Spi-tools, regroupant deux utilitaires pour communiquer sous Linux en utilisant le protocole SPI. Ce projet a &eacute;t&eacute; &eacute;crit pour illustrer le fonctionnement d&rsquo;un lien SPI entre un microprocesseur sous Linux (Raspberry Pi en l&rsquo;occurrence) et un microcontr&ocirc;leur (T.I. MSP430), mais il doit pouvoir s&rsquo;appliquer &agrave; [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,16,10],"tags":[],"class_list":["post-4119","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microcontroleur","category-microprocesseur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4119","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=4119"}],"version-history":[{"count":13,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4119\/revisions"}],"predecessor-version":[{"id":4132,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4119\/revisions\/4132"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=4119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=4119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=4119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}