Une nouvelle interface Client FTP avec Microchip ENC28J60

C’est la version mise à jour avec un nouveau microcontrôleur Ethernet de la platine Client FTP publiée dans les numéros 86, 87 et 88 d’ELM. La nouvelle puce ENC28J6O de Microchip remplace la RTL8O19 de Realtek et introduit de nouvelles fonctions tout en permettant une appréciable simplification du programme résident. D’un point de vue pratique, l’utilisation d’un circuit intégré Dli (en lieu et place de l’ancien CMS) rend les opérations de montage accessibles à tous.
A la suite de la commercialisation par Microchip de la A nouvelle puce ENC28J6O, nous avons voulu reprendre le montage Client FTP EN612-616 d’il y a un an
afin de donner à tous nos lecteurs la possibilité d’apprécier les potentialités introduite par ce nouveau circuit intégré. Grâce à l’interface SPI et aux fonctions de calcul matérielles, le programme résident du PIC utilisé est devenu plus léger et encore plus simple à comprendre ... même pour ceux qui sont depuis peu initiés à l’expérimentation sur Ethernet. Nous avons, dans la limite du possible, maintenu la même structure de circuit et de développement afin de ne pas avoir à reprendre les concepts introduits dans les articles précédents. Dans les paragraphes suivants nous nous consacrerons principalement à la description de la nouvelle puce et au développement du programme résident nécessaire pour faire dialoguer correctement notre P1C18F458 avec la nouvelle interface réseau.
Cette dernière remplace complètement la RTL8O19: la construction de l’interface n’en sera que plus facile car le nouveau composant est traversant alors que l’ancien était un CMS. Nous ferons référence essentiellement au nouveau “stack” TCP/IP disponible en version 3.02 sur le site Microchip (www.microchip.com). Nous avons prévu de l’intégrer en implémentant le protocole de niveau “Application” nécessaire au transfert des données vers un serveur FTP. Dans ce cas aussi nous utilisons la même sonde thermométrique (D518B20) pour vous présenter un exemple d’application:
aucune modification de ce côté-là par rapport au projet précédent! En fait, pour la mise en fonctionnement on se sert du même logiciel de configuration que celui déjà utilisé, avec le même fichier binaire (eepftp.bin) à insérer dans I’EEPROM (24LC256). Il ne nous reste qu’à commencer l’analyse détaillée des caractéristiques de la nouvelle puce ENC28J6O.
Tableau 1: Récapitulation des lignes de contrôle fondamentales pour dialoguer avec la nouvelle puce.
l’interface physique ENC28J6O:
Le circuit de Microchip consiste en une interface de réseau avec un bus de contrôle et de communication appelé SPI (“Serial Peripheral Interface”). Ce SPI est un standard industriel désormais reconnu: il est vrai que bien des PIC de la classe 18 incluent un module MSSP (“Master Synchronous Serial Port”) permettant de mettre à profit ce mode de communication en offrant une série de registres dédiés. Le bus en question est de type “master/slave” (maître/esclave) et peut être utilisé aussi en mode “multi-slave”, ce qui permet, par exemple, de commander plusieurs dispositifs différents partageant les mêmes lignes de communication.
Dans la “demoboard” (platine d’expérimentation) de Microchip, en effet, on utilise le même module MSSP pour dialoguer d’abord avec le ENC28J6O puis avec une EEPROM série. La sélection du dispositif avec lequel on veut communiquer se fait à travers une ligne appelée CS (“Chip Select”). Quant à nous, en revanche, nous avons voulu maintenir la structure de mémorisation originale (24LC256) en implémentant côté programme résident les sous programmes d’écriture et de lecture sur le 12C. Le module MSSP est donc réservé à la communication avec le ENC28J6O lequel devient esclave.
Vous avez compris que le premier point positif du choix de la nouvelle puce tient au nombre inférieur de lignes nécessaires pour le commander Avec le RTL8O19 (voir ELM numéros 86-87- 88) nous devions utiliser au moins 16 broches de notre PIC (souvenez-vous:
le bus d’interfaçage arrivait à 20 broches mais nous avions forcé à GND les quatre premières lignes); alors qu’ici, dans la pire des hypothèses, nous ne devons en réserver que six, soit moins de la moitié. La différence est surtout dans l’utilisation d’un bus série à haute vitesse à la place d’un bus parallèle.
Le Tableau I récapitule les lignes de contrôle fondamentales pour dialoguer avec la nouvelle puce. Nous avons déjà rencontré le mode de communication SPI en décrivant l’interfaçage avec les SD-Cards et donc nous vous rappelons seulement que le transfert des informations est contrôlé à travers les impulsions d’horloge de la part du maître (pour nous c’est le P1C18F458). En fait, dans les deux dispositifs se trouve un “buffer” (tampon) relié à un registre “shift” (registre de décalage). Ce dernier ne fait que déplacer un bit de la ligne des données à chaque impulsion d’horloge et recueillir l’information finale à l’intérieur du “buffer”. La logique de contrôle interne utilise ce “buffer” pour lire le paquet en entrée et l’élaborer ensuite. Le diagramme de la Figure I permet d’éclairer ce concept.
LENC28J6O contient sept importants blocs fonctionnels, comme le montre la Figure 2:
1) Une interface SPI servant à communiquer avec le microcontrôleur externe.
2) Une série de registres permettant de contrôler et de surveiller le fonctionnement général de la puce.
3) Une mémoire RAM de 8 ko à double porte pour la mémorisation temporaire des paquets en entrée et en sortie.
4) Un circuit d’arbitrage pour l’accès à la mémoire RAM; il est nécessaire car une des portes est partagée entre trois acteurs: la logique de réception, la logique d’émission et le contrôleur DMA (“Direct Memory Access”). Ce dernier permet d’accéder rapidement aux paquets enregistrés par la RAM pour les changer d’adresse ou en calculer la somme de contrôle (checksum”). Nous verrons que cette possibilité constitue le second point positif du changement de puce.
5) Une interface pour le bus SPI interprétant les données et les commandes reçues à travers le SPI.
Chaque opération est effectuée par la puce en fonction des commandes qui suivent une syntaxe bien précise. Linterface en question lit les champs de la commande et active les modules correspondants.
6) Un module MAC implémentant la logique du niveau “Medium Access Control” selon les spécifications Ethernet 802.3. Rappelons qu’il s’agit d’un sous niveau du Data Link selon le modèle fonctionnel ISO/OSI, nécessaire au partage du canal de communication.
7) Un module PHY implémentant la logique du niveau physique, c’est- à-dire du plus bas niveau prévu dans le modèle ISO/OSI. Il s’occupe de traduire convenablement les signaux analogiques provenant du câble de réseau en fonction de la codification utilisée (Manchester).
La puce comporte à l’intérieur un régulateur de tension et un oscillateur dont le coeur est un quartz externe cadencé
25 MHz. Le régulateur de tension est utilisé pour stabiliser la tension de certains modules à 2,5 V afin d’économiser l’énergie. Il faut toutefois ajouter un condensateur de filtrage de 10 pF sur la broche Vcap.
De même, les sections analogiques de la puce ont besoin d’une résistance extérieure de 2 k (1%) sur la broche VBias. Les deux broches sont ensuite mises à la masse. Le ENC28J6O s’alimente “officiellement” (!) en 3,3 V; aussi, si l’on veut l’interfacer avec un PIC18 à 5 V, il est nécessaire d’introduire une logique intermédiaire pour l’adaptation des niveaux.
Comme les tables de caractéristiques (“datasheet”) Microchip décrivent toutes les lignes d’entrée de l’interface SPI comme “5V tolerant”, nous avons prévu d’utiliser les broches restantes du 74CT125 que nous utilisons comme translateur pour la ligne de sortie provenant de la SD-Card. Ces trois lignes sont en quelque sorte gratuites
Figure 1: La logique de contrôle interne utilise le “buffer” pour lire le paquet en entrée et l’élaborer ensuite. Le diagramme présenté ici permet d’éclairer ce concept.
Figure 2: L’ENC28J6O contient sept importants blocs fonctionnels.
Figure 3: Circuit minimal nécessaire pour l’utilisation du ENC28J6O.
et permettent de connecter la sortie SO et les deux lignes d’interrupt provenant du ENC28J6O.
L interface comporte, enfin, deux lignes de signalisation programmables reliées à deux LED de manière à permettre la surveillance du fonctionnement de la puce ainsi que des quatre lignes différentielles d’entrée reliées au
module PHY provenant du transforma
teur réseau. Ce dernier doit avoir une
isolation en mesure de protéger le dis
positif des décharges électrostatiques
(2 kV ou supérieur) et posséder des
“terminators” (bouchons) adéquats faits de résistances de 50 ohms et d’un condensateur de 0,01 pF
Notre platine, pour simplifier, comporte un port RJ45 avec un transformateur réseau intégré aux caractéristiques compatibles qui fonctionne très bien. Dans la réalisation, il importe de monter sur le point central du transformateur relié à la paire TPOUT+/TPOUT- un petit bobinage à noyau de ferrite relié à la tension de 3,3 V et pouvant supporter un courant de 100 mA au moins.
Le schéma électrique
Le circuit minimal nécessaire pour l’utilisation du ENC28J6O est visible Figure 3, la structure est semblable à celle présentée dans le numéro 86 d’ELM pages 42 et 43 (il s’agissait de la première version du Client FTP).
Nous avons éliminé les lignes non nécessaires et envoyé certaines sur un connecteur pour des extensions futures.
Figure 4: Schéma électrique de l’interface Client FTP avec ENC28J6O Microchip ET634,
Figure 5a: Schéma d’implantation des composants de l’interface Client FTP avec ENC28J6O Microchip ET634.
En particulier les trois broches RD5, RD6, RD7, naguère utilisées pour le bus de données du RTL8O19, ont été réservées pour un port que nous utiliserons ultérieurement pour intégrer un lecteur de Smart-card. Pour le reste nous pouvons voir que les broches 12, 9, 5 du HCT125 sont utilisées pour effectuer la conversion des niveaux des lignes INT, WOL, 50 provenant du ENC28J6O.
La différence principale touche les broches utilisées pour I’EEPROM 24LC256. Contrairement à ce qui a été fait pour la platine d’expérimentation (demoboard”) de Microchip qui a remplacé la puce précédente par une mémoire à interface SPI, nous avons voulu maintenir le bus 12C et réserver le module MSSP du PIC pour l’interface de réseau. Nous avons envoyé les lignes de données (SDA) et d’horloge (SCL) respectivement sur les broches RB4 et RB2.
Il a alors suffi de développer les instructions côté programme résident, nécessaires à la lecture et à l’écriture séquentielle sur EEPROM 12C, avec la librairie XEEPROM déjà utilisée dans le précédent article ET612-616 il y a un an.
Quand on analyse les “listings”, on se rend compte qu’au niveau des appels rien ne change; les seules différences restent à l’intérieur des fonctions réclamées. Le C18 se prête bien à ce type développement en permettant la réutilisation du code et donc une productivité optimale dans les projets complexes. La possibilité de regrouper des fonctions générales dans des librairies commutables et intégrables
dans d’autres projets est fort intéressante. Nous pensons au cas des fonctions de communication pour dispositifs à un seul fil (“OneWire”) décrit dans le précédent FTP Client.
De même, le remplacement du RTL8O19 comporte des modifications importantes dans le “stack” TCP/IP mais non pas une récriture complète. En ce qui concerne le schéma électrique de la Figure 4, on voit que pour la partie interface on a suivi la configuration de base préconisée par Microchip.
ENC28J6O: l’implémentation
Comme toutes les logiques numériques, cette puce comporte une série de registres et suit une syntaxe d’envoi des commandes précise. Disons tout de suite que nous n’allons pas décrire chaque bit des registres présents (il y faudrait le numéro entier de la revue) mais nous nous contenterons d’un panoramique des plus importants, dont on résumera la fonction et l’utilisation. Pour davantage de détails, nous vous renvoyons donc à l’analyse du “listing” du programme résident.
Registres
Il faut dire avant tout que les registres se divisent en trois groupes fondamentaux:
1) Registres de contrôle;
2) Buffers de réception et d’émis sion;
3) Registres du module PHY.
Liste des composants
ET634
Ri 4,7 k
R2 10k
R3 10k
R4 4,7 k
R5 4,7 k
R6 4,7 k
R7 470
R8 470
R9 1,8k
Ri0....47
Rii....47
R12 .. .47
R13....47
R14....4,7 k
RiS.... 10 k
R16....10 k
Ci 100 nF multicouche
C2 470 pF 25V électrolytique
C3 100 nF multicouche
C4 470 pF 16V électrolytique
C5 100 nF multicouche
C6 220 pF 16V électrolytique
C7 lspFcéramique
C8 lspFcéramique
C9 lopFcéramique
Ci0....10 pF céramique
Cii.... 100 nF multicouche
C12.... 100 nF multicouche
C13.... 100 nF multicouche
C14.... 100 nF multicouche
Di 1N4007
D2 BAT85
D3 BAT85
D4 BAT85
LD1....LED 3 mm rouge
LD2....LED 3 mm verte
Qi quartz2oMHz
Q2 quartz2sMHz
Li self 47 pH
Ui 7805
U2 P1C18F458-EF634 déjà
programmé en usine
U3 LM1O86-3.3
U4 74HC125B
US 24LC256
U6 ENC28J6O
Pi micropoussoir
SDi ... lecteur de SD-Card
Divers:
support 2x4
support 2 x 7
support 2 x 14
support 2 x 20 double pas
prise d’alimentation
barrette mâle verticale pour POD 10
connecteur RJ45 avec filtre LF1S
connecteurs barrettes mâles verticaux 3 broches
------------------------------------------------
Analysons-les séparément:
1) Registres de contrôle
Il s’agit de registres permettant de configurer la puce et d’en contrôler l’état:
ils sont organisés selon quatre bancs de 32 octets et directement accessibles à travers le bus SPI. En particulier, ils sont nommés par le préfixe ET s’ils on trait à l’interface Ethernet, MA s’ils ont trait au module MAC et Ml s’ils ont trait à la couche d’interface entre MAC et PHY (couche MII Media Independent Interface).
Les registres ECON1 et ECON2, contenant les bits de configuration des divers modules, sont fondamentaux. Dans le groupe MA nous trouvons, par exemple, les registres MAADDRO.. MAADDR5 contenant les six octets que nous valoriserons avec l’adresse MAC qui identifie univoquement notre interface. De même, MAAXML et MAAXMH déterminent la longueur maximale des trames acceptées par notre contrôleur.
2) Buffers de réception et d’émission
Une mémoire de 8 ko a été réservée à la conservation des paquets en entrée et en sortie. Elle est accessible à travers l’envoi de deux commandes spécifiques (Read Buffer Memory” et “Write Buffer Memory”). Les extrémités sont configurables au moyen de registres spéciaux et donc l’espace de mémorisation peut être optimisé en fonction de l’utilisation que l’on entend faire de l’interface. Par exemple, la paire ERXSTH:ERXSTL met le pointeur à l’adresse initiale de réception et la paire ERXNDH:ERXNDL à l’adresse finale. Le programmateur peut donc gérer à volonté la longueur des “buffers” et leur emplacement. De même un pointeur est utilisé pour chaque “buffer” de manière à établir quelle sera l’adresse de destination ou source d’une opération de lecture ou d’écriture. Voyez la Figure 7 pour éclaircir tout cela : on y a représenté la transmission d’une valeur AAh et la réception d’une valeur 55h avec indication de tous les registres associés.
À travers la commande “Write Buffer Memory” on insère à l’adresse pointée par EWRPTH:EWRPTL la valeur hexadécimale AAh ensuite acheminée vers la sortie; de même on utilise la commande “Read Buffer Memory” pour lire l’adresse pointée par ERDPTH:ERDPTL contenant la valeur reçue en entrée.
Dans le ENC28J6O nous trouvons aussi un contrôleur DMA (Direct Memory Address”) qui nous permet
Figure 5b-1: Dessin, à l’échelle 1, du circuit imprimé double face à trous métallisés de l’interface Client FTP avec ENC28J6O Microchip ET634, côté soudures.
Figure 5b-2: Dessin, à l’échelle 1, du circuit imprimé double face à trous métallisés de l’interface Client FTP avec ENC28J6O Microchip ET634, côté composants.
d’accélérer l’accès à la mémoire pour le calcul de la somme de contrôle des paquets. Nous verrons plus loin que cette fonction a été insérée dans le nouveau programme résident pour nous permettre d’éliminer un sous programme qui occupait dans la version précédente des ressources précieuses du système.
3) Registres du module PHY
Il s’agit de 9 registres de contrôle et d’état relatifs au module qui implémente le niveau physique, c’est-à-dire celui qui est nécessaire pour interpréter les signaux analogiques provenant du câble réseau.
Les registres ne sont pas directement accessibles par l’interface SPI; ils doivent être paramétrés avec la couche MII (Media Independent Interface”) implémentée dans le module MAC. En fait, la couche MII est représentée par le groupe de registres de suffixe Ml. Les opérations de lecture/écriture doivent se faire indirectement à travers ces registres.
Par exemple, si nous voulons lire une valeur contenue dans un registre PHY, nous devons d’abord écrire son adresse dans le MIREGADR et valoriser à 1 le bit MICMD.MIIRD. On lance l’opération de lecture durant laquelle est maintenu à 1 le bit MISTAT.BUSY.
Figure 6: Photo d’un des prototypes de la platine de l’interface Client FTP avec ENC28J6O Microchip ET634. En médaillon la SD-Card de 64 Mo introduite dans son lecteur.
Dès que ce dernier bit passe à zéro, il est nécessaire de mettre à zéro le MICMD.MIIRD (l’opération de lecture dure environ 10 jjs). On peut alors lire la valeur à 16 bits dans MIRDH:MIRDL. Une opération similaire se produit lorsqu’il est nécessaire d’écrire une valeur dans un registre PHY. Une application intéressante permettant le contrôle périodique d’un registre PHY peut être activée en valorisant MIREGADR avec son adresse. On met ensuite à 1 le bit MICMD.MIISCAN. A partir de ce moment là, la paire MIRSH:MIRDL est automatiquement mise à jour toutes les 10 jJs. Cela permet certainement d’éviter une complexification du programme résident quand il est nécessaire de contrôler l’état d’un registre déterminé du niveau physique. L’un des registres les plus intéressants du module PHY est sans doute le PHSTAT2 (“Physical Layer Status Register 2”) qui permet de savoir si le lien de l’interface de réseau est actif, si cette dernière émet ou reçoit et s’il y a des collisions.
Instructions
Toutes les commandes nécessaires pour faire fonctionner le ENC28J6O sont envoyées par le P1C18F458 à travers l’interface SPI. En particulier le PIC utilise sa ligne SI pour transférer les séquences et les synchroniser avec le signal d’horloge SCK. En fait chaque bit est transmis en partant du
moins significatif correspondant au front de montée de chaque impulsion d’horloge. Les réponses de l’interface sont en revanche transmises sur la ligne SO en correspondance du front de descente. La ligne pour la sélection du dispositif doit être maintenue au niveau logique bas pendant chaque opération et remise au niveau logique haut à la fin. Le fonctionnement de la puce est toujours sous le contrôle du microcontrâleur externe lequel use d’une syntaxe bien particulière pour la commander. Sur la puce, sept instructions ont été implémentées: elles sont identifiées par un OPCODE initial formé de trois bits. Les cinq bits suivants correspondent à l’argument transmis, qui peut être l’adresse d’un registre ou une valeur. Dans les opérations d’écriture et de modification des bits de configuration, ce premier octet peut être suivi d’un ou plus octets correspondant aux valeurs que l’on veut transférer vers la puce. Le Tableau 2 résume le jeu complet des instructions.
Analysons donc une section de notre programme résident afin de voir de près comment ces instructions ont été implémentées. La plus évidente modification du “stack” tient au remplacement du module MAC.c par le enc28j6O.c. Les fonctions correspondantes ont été complètement récrites en maintenant dans les limites leurs déclarations. Ainsi il n’est pas nécessaire de récrire les autres modules qui les réclament.
La structure à niveaux du modèle ISO/ OSI permet d’effectuer facilement ce type d’opération. Chaque niveau offre, en effet, une série de services au niveau supérieur en en dissimulant les détails implémentatifs. De même, quand nous avons développé le protocole FTP nous nous sommes contentés d’intervenir au niveau “Application” en insérant nos instructions au sommet de la pile sans aller modifier le reste de la structure. Pour éclaircir la situation, on peut imaginer une sorte de gratte- ciel virtuel dans lequel il est possible d’ajouter des étages ou agir sur ceux qui existent. Les instructions vues dans le tableau précédent ont été rédigées en déclarant des fonctions statiques et en définissant des constantes en ce qui concerne les OPCODE.
Par exemple, pour implémenter la lecture d’un registre Ethernet (une spécialisation de la RCR), on définit la fonction:
static REG ReadETHReg (BYTE Address);
où le paramètre de sortie REG est défini à travers une union à l’intérieur du fichier enc28j6O.h. Dans cette définition on précise les différentes structures composant chaque registre. Par exemple, si nous considérons les registres de contrôle ECON1 et ECON2, nous trouvons la représentation du “Listing” 1. Grâce à la définition de ces structures, chaque fois que nous réclamons la fonction de lecture et également si nous utilisons des registres différents, nous aurons la valorisation exacte des divers bits qui les composent et nous pourrons les référencer directement à travers le nom correspondant.
Figure 7: Transmission d’une valeur AAh et réception d’une valeur 55h avec indication de tous les registres associés.
Si nous prenons, par exemple, la fonction “MACIsTXReady” utilisée chaque fois qu’il est nécessaire d’envoyer une trame sur le réseau, nous trouverons l’implémentation décrite dans le “Listing” 2. En fait, la fonction renvoie “false” (faux) quand la précédente transmission n’est pas encore terminée; par conséquent il n’est pas possible de modifier les pointeurs au “buffer” d’émission. On ne fait que vérifier le bit 7 (TXRST) du registre ECON1 dont la fonction estjustement de signaler si le “buffer” de sortie est libre ou pas. Ce bit est modifié directement par la “MACFIush” qui active la transmission proprement dite.
A part les modifications nécessaires pour dialoguer avec une structure différente de celle présente dans la puce Realtek, il nous faut souligner la possibilité de mettre à profit à des fonctions intégrées qui, dans la puce précédente, devaient être développées en grevant les ressources du système. Une des caractéristiques que nous avons mise à contribution est celle permettant le calcul de la somme de contrôle à 16 bits telle que décrite dans la RFC 793. On utilise le contrôleur DMA pour accéder directement aux aires de mémoire contenant les paquets à vérifier. Cela permet d’effectuer l’opération de manière plus rapide et en grevant moins les ressources. Les nouvelles instructions ont été insérées principalement dans la fonction suivante, laquelle prend en entrée le nombre d’octets sur lesquels il est nécessaire d’effectuer le calcul:
WORD CalclPButterChecksum(WORD len)
Elle remplace et remplit exactement la même fonction que dans le précédent projet celle incluse dans le fichier Helpers.c. En fait, pour effectuer le calcul, on valorise les registres EDMAST, EDMAND pour qu’ils pointent le premier et le dernier octet du paquet à contrôler conservé dans le “buffer” en RAM. On lance le calcul en mettant à 1 les bits CSUMEN et DMAST du registre ECON1 et on attend. Lélaboration terminée, le contrôleur met à O le bit DMAST et il est alors possible de lire la valeur calculée dans les registres EDMACSH et EDMACSL. A ce moment le PIC peut utiliser cette valeur pour l’insérer dans un paquet ou pour le comparer avec la somme de contrôle d’un paquet reçu, ce qui permet d’en valider l’exactitude. Regardons de plus près le “Listing” 3 correspondant.







Publié dans Electronique-Magazine N°_98 _2007

Enregistrer un commentaire

0 Commentaires