Cette carte d'extension est le gros morceau électronique de l'Asservissement et du Positionnement. Il ne s'agit que d'une bête carte d'extension d'un bus processeur, cependant, le nombre de périphériques, et de signaux transportés, ainsi que les spécificités cumulées du DSP et du Starter Kit, rendent cette carte une belle usine à gaz ...

Documentations

Site web TI : www.ti.com
Ressource principale (datasheet complète de la famille TMS320VC3x) : TMS320C3x User guide.pdf
Spécificités du C31 : tms320c31.pdf
Carte d'évaluation : DSP Starter Kit User Guide.pdf
Documentation compilateur : Optimizing C Compiler User Guide.pdf

Datasheet RAM :
Datasheet FLASH : AM29F010A.pdf

Et tout le contenu de ce répertoire

Présentation générale

cf description générale

Mécaniquement la carte est un PCB double face de 10,5*25 cm environ. Elle comprend un nombre conséquent de via, a demandé un certain nombre (élevé) d'heures de routage, 4 heures de soudage initial. Une belle bête.

PCB double face de la carte d'extension. (La résolution n'est pas assez grande pour voir apparaitre les pistes ...)

Le fichier Orcad du routage est ici (par Polio).
Il comporte des ERREURS. La plus grosse est l'inversion de 2 connecteurs de 40 broches (où vient s'enficher la carte DSP Starter Kit). Cette inversion aurait pu être catastrophique, heureusement, il s'agissait des connecteurs ayant le moins de pistes arrivant dessus. Il y a quelques autres erreurs aussi. Ces erreurs ne viennent pas du routage, mais de la documentation indiquant les contraintes mécaniques et la connectique à utiliser (doc présentée ici, FAUSSE au niveau de la désignation des connecteurs d'extension). Les autres erreurs, sont des erreurs de conception sur le schéma.

 

Schéma électronique

Le schéma électronique (comportant toujours les même ERREURS) est donné ici. Il va être détaillé par la suite. (les erreurs aussi)
Le schéma comporte 8 pages A4. Les diverses fonctions sont regroupées par bloc.

Alimentation

Alimentation

Cette page ne comporte qu'un 7805. L'alimentation externe fait environ 7.2V. Le 7805 alimente la carte d'extension.

Connecteurs

Connecteurs

Là encore, peu de commentaires, ce sont les 4 connecteurs venant s'enficher sur la carte DSP Starter Kit. Il n'est pas exclus qu'il reste une/des erreurs ou une inversion au niveau des notations (JPx)

Ram

 

128 KMots de RAM ajoutés.

Le DSP a une architecture 32 bits (cf DSP). Il ne travaille que sur des données de 32 bits, et son bus externe est en 32 bits. Il faut donc que la mémoire soit en 32 bits. Ici, la mémoire est séparée en 4 mémoires de 8 bits. A chaque accès les 4 chips sont sélectionnés et assurent des données sur 4*8=32 bits. Chaque puce a une capacité de 128Ko. Donc au total 128KMots de 32 bits.

Les lignes d'adresses sont directement issues du DSP (A0-A16). Les lignes de données(D0-D31) aussi.
Ces RAM ont 4 signaux de validation :

  • 2 chips select (_CS1,CS2)
  • un signal de lecture (_OE)
  • un signal d'écriture(_WE).

La façon dont ils sont reliés aux signaux du DSP est FAUSSE.
Certes, le signal _SRAM est actif lorsque l'on accède à une plage de mémoire précise du DSP (_USER_RAM actif de 80A000h à BFFFFFh )(signal décodé à partir du bus d'@ par le Starter Kit).
Le signal _USERR sera actif lorsqu'il y aura une lecture et le signal _USERW sera actif lorsqu'il y aura une écriture. Mais _USERR et _USERW ne seront effectivement actifs QUE LORSQUE l'accès est sur la plage _USERIO (C00000h à DEFFFFh) ... (voilà ce que c'est de faire des architectures mémoire à des heures pas possibles de la nuit ...)

Il y a donc eu les modifications suivantes :

  • _OE mis à 0. La mémoire est en lecture permanente, du moins dès qu'elle est sélectionnée (_CS=0)
  • _WE relié à R/_W du DSP. En écriture, on aura donc _OE à 0 et _WE à 0. Dans cette condition la mémoire considère qu'il s'agit d'une écriture.

 

Flash

128Ko de Flash

La Flash utilisée est une flash 8 bits. L'architecture est en 32 bits, mais la Flash sert à un but précis : le boot (en autonome, sans PC pour charger le code). Le mécanisme employé pour le démarrage est le même que celui expliqué lors du chargement du code (cf présentation du DSP).

C'est à dire qu'après le reset, si _INT0 est mis à 0, le chargement va avoir lieu à partir de l'adresse 1000h qui est l'@ décodée par _USER_BOOT. Donc si _INT0 est activé, le premier Mot lu sera dans la Flash (en fait seuls les 8 bits de poids faible seront cohérents). Cet octet, va déterminer sur combien de bits (8,16,32) va se faire le téléchargement. Evidemment ici, il faudra que ce soit sur 8 bits.
Il est à noter que les 1000h premiers octets de la Flash ne sont pas utilisés (le chargement commencera en 1000h).

Les signaux _OE,_WE sont FAUX et seront détaillés plus loin, car ils nécessitent une attention particulière pour le flashage._CE par contre est juste et n'active la puce que lorqu'il y'a un accès sur sa plage d'adresse. Le flashage est effectué en envoyant des séquences de commandes particulières à la Flash. Ici, pour simplifier les opérations, le flashage sera réalisé par le PC. C'est à dire que le PC, va demander au Kernel de lire et écrire dans des zones mémoires qui correspondront à la Flash (1000h .à 400000h)

 

Logique de contrôle

Logique de contrôle ("glue logic")

Ici, sont regroupés plusieurs petits détails à ne pas négliger.

  • Le signal PWM issu du StarterKit est mis à 0. En regardant la documentation du StarterKit, on s'aperçoit qu'il existe une patte DEMO, qui contôle 2 multiplexeurs, qui vont envoyer sur _USER_BOOT et _USER_IO, soit les signaux _USER_BOOT et _USER_IO, soit les signaux issu d'un timer du DSP. Pourquoi faire ? Faire des zoli z'effets lumineux avec la led Bicolore connectée entre ces 2 signaux. Ayant besoin des signaux _USER_BOOT et _USER_IO, il est NECESSAIRE de désactiver ces effets (en mettant donc PWM=DEMO à 0). Cette LED, bicolore n'est pas complètement inutile non plus. Elle permet de connaitre l'état de la carte. Si aucun accès ne se produit ni sur IO ni sur BOOT, les 2 lignes seront à 1 et la led éteinte. Si il y'a un accès sur une des 2 lignes, la led va s'allumer (rouge pour BOOT et vert pour IO). En général un allumage permanent (rouge ou vert indique un plantage du DSP -- il essaye toujours d'accéder dans la même zone). On peut d'ailleurs remarquer que lorsque la carte boote en mode autonome, c'est à dire qu'elle boote en venant charger le code présent dans la flash situé sur _USER_BOOT on voit s'allumer la led en rouge le temps du chargement, qui dure très peu de temps.
  • Le jumper (situé en haut de la carte, à côté des autres connecteurs), permet de mettre _INT_0 à 0. Cela a pour conséquence, après le reset du DSP, de lui faire commencer son chargement depuis la flash (_USER_BOOT : 1000h à 400000h), et non d'attendre le chargement depuis le PC (FFF000h à FFFFFFh). Lorsqu'un chargement ne s'effectue pas (en autonome ou depuis le PC, il ne faut jamais oublier d'aller vérifier ce jumper ...)
  • Le circuit 74HC138 est un décodeur 3=>8, c'est à dire qu'en sortie (Y0-Y7), seule la patte correspondant au code binaire en entrée va être mise à 0. (et ceci uniquement si le circuit est sélectionné, sinon toutes les sorties sont à 1). Ici le circuit est sélectionné lorsqu'il y'a un accès _USERX, c'est à dire sur la plage (C00000h à DEFFFFh en lecture ou écriture). Sur cette plage il existe aussi les signaux _USERR et _USERW, qui ne sont actifs que pour la lecture pour l'un et l'ecriture pour l'autre. En résumé sur cette plage, quand on a :
    • une lecture : _USERR est actif et _USERX est actif
    • une écriture : _USERW est actif et _USERX est actif

    Les 7 signaux de sortie génèrent 7 chip select, (actifs chacun pour une adresse séparée). Il y'a cependant une astuce. Les 3 bits connectés en entrées sont les bits A1,A2,A3 (et non A0,A1,A2). Cela veut donc dire que pour l'adresse C00000h (première adresse de la plage _USERX), ce sera Y0 qui sera actif , pour l'adresse C00001h ce sera AUSSI, Y0. (Pour C00002h ce sera Y1). Cette astuce permet de commander plus facilement les LM629.

    • Y0 et Y1 servent à la commande des LM629.(CS_LM_D et CS_LM_G) @C00000,C00001 et @C00002,C00003
    • Y2 sert à la gestion des IT externes, et des 4 entrées et 4 sorties numériques. @C00004,C00005
    • Y3 sert au PIC @C00006,C00007
    • Y4 sert à l'initialisation du système (cf en dessous) @C00008,C00009
    • Y5 servira à passer la flash en écriture @C0000A,C0000B
    • Y6 servira à passer la flash en lecture @C0000C,C0000D
    • Y7 servira pour l'UART sur l'extension @C0000E,C0000F

  • Y2 (CS_EXT), va être séparé en un chip select actif en écriture et un chip select actif en lecture, via les 2 portes OU.
  • Il avait été indiqué que les signaux _OE,_WE de la flash étaient FAUX.
    Le signal _WE est relié à R/_W, il sélectionnera la flash en écriture lorsqu'il y aura un accès en écriture. Cependant il n'est pas possible comme pour les RAM de relier _WE à 0, car si les 2 signaux (_OE et _WE) sont à 0 la flash n'effectue pas une écriture (comme l'effectue la RAM dans ce cas). Il aurait été possible générer 2 signaux _OE et _WE actifs uniquement en lecture pour l'un et en écriture pour l'autre. Une autre solution a été réalisée. (demandant moins de modifs sur le PCB déjà tiré - voilà ce qu'arrive quand on fait des architectures mémoires tard dans la nuit (bis)).

Patch signal _CE Flash

Il a été utilisé une bascule qui restait non utilisée sur le circuit. Voilà le fonctionnement :

  • A l'allumage de la carte, le signal _RESET va passer un bref instant à 0 puis remonter à 1. Il va y avoir un front montant sur CLK. A ce moment le contenu de D est envoyé sur Q. Q passe donc à 0, et _CE de la Flash est à 0 La Flash peut être utilisée en lecture (mais pas en écriture). Il se passe la même chose si l'on effectue un reset manuel. Ce fonctionnement est nécessaire pour permettre le bootload à partir de la flash (donc accès en lecture à la flash).
  • Lorsque l'on effectue un accès sur Y5, le signal _PRE (preset) de la bascule est activé. Sa sortie passe donc à 1, il n'est plus possible de faire d'accès en lecture à la Flash, par contre les accès en écriture fonctionneront.
  • Lorsque l'on effectue un accès sur Y6, le signal _CLR (clear) de la bascule est activé. Sa sortie passe donc à 0, on revient dans le premier cas.
  • Il sera donc possible en accédant aux @C0000A (Y5) et @C0000C (Y6) (en lecture ou écriture, en lisant ou écrivant n'importe quoi, peu importe seul le fait d'y accéder et de générer un chip select compte), d'autoriser les accès en lecture ou en écriture sur la flash.
  • Sur la droite du schéma se trouve le circuit de reset, qui a été par la suite connecté au reset du DSP.
  • Etant donné le fonctionnement du DSP, il est impératif qu'au reset aucune des interruptions "utilisateur" ne soit activée. Ce qui impose un mécanisme permettant qu'au boot, il n'y ait pas d'interruptions de générées par la carte. Ceci est réalisé par la bascule U9A. Fonctionnement :
    • Au boot, le signal _RESET, active l'entrée_PRE (preset) et la sortie Q passe à 1. En sortie des portes OU (_INT1, _INT3), on aura toujours 1. Les interruptions ne sont donc pas activées au boot.
    • Lorsque l'on effectue un accès sur Y4, on passe la bascule à 0. La sortie des portes OU, recopie les entrées IT_EXT et IT_PIC.
  • Il faut encore noter sur ces quelques bascules, qu'il faut faire attention aux timings. C'est à dire que le décodeur 3=>8 (74HC138) et les portes OU sont de type HC (74HC), ce qui permet d'assurer un fonctionnement correct avec les timings des signaux de 40ns. Les bascules sont des 74LS, les réactions sur les bascules pouvant être décalées d'un cycle sans poser de problèmes (et surtout on avait pas autre chose)

Interuptions

Interruptions externes et capteur de ligne

La carte dispose de 4 lignes d'interruptions externes, de 4 bits d'entrée et de 4 bits de sortie. 2 latchs permettent de recupérer et d'envoyer 8 bits de données.

  • Lorsqu'un accès est fait en écriture sur l'@CS_EXT, le signal _CS_EXT_OUT, passe à 0 (cf au dessus). Le latch 74HC374(U6) va à ce moment mémoriser les données présentes sur le bus. De même en lecture, le buffer 74HC244(U3), mets les données sur le bus lorsqu'il est sélectionné (_CS_EXT_IN).
  • A partir de ce mécanisme, on rentre les 4 interruptions sur les 4 bits de poids faible de U3. Les 4 bits de poids fort seront 4 entrées numériques 'simples' (sans IT).
  • On sort les 4 bits de poids faible de U6, sur un comparateur. Les 4 bits de poids forts sont 4 sorties numériques 'simples'.
  • On ajoute donc un comparateur U5, qui va comparer les 4 entrées 'interruptions' avec les 4 bits de poids faible de U6. Si les 2 sont identiques sa sortie P=Q sera à 1 donc _IT_EXT ne sera pas actif. Si il y'a une différence entre les 2, la sortie passera à 0 et une interruption sera levée.
  • On suppose qu'il n'y a pas d'IT (les 4 bits de poids faible de U6 ont la même valeur que les entrées interruptions -- ceci est réalisé en lisant l'état des entrées interruption et en écrivant cette valeur sur les 4 bits de sortie de U6 -- ce qui revient à acquiter l'interruption).
  • Si une ligne d'interruption change d'état, la sortie du comparateur passe à 0 et une interruption est levée. L'interruption restera levée tant qu'elle ne sera pas acquitée comme au dessus.

En résumé, ce sytème permet de :

  • Générer une interruption lorsqu'un changement (front montant OU descendant) intervient sur une des 4 entrées IT.
  • Déterminer (dans la boucle d'IT par ex), quelle est(sont) la(les) ligne(s) d'interruption(s) qui ont provoqué l'IT.

3 des 4 IT sont laissées libres (reliées en pratique aux 2 moustaches devant le robot).

La dernière est utilisée par le capteur de ligne. Le capteur de ligne est un détecteur composé d'une diode et d'un phototransistor. La diode est polarisée par R4; Le phototransistor par R5/R6. Il est ensuite effectué une comparaison entre le signal sorti du phototransistor et une référence ajustable(R7). Ce qui permet de générer une information binaire : ligne-pas ligne (et donc de générer une IT à chaque entrée ET à chaque sortie d'une ligne).

LM629

2 LM629

Les 2 LM629 permettent de réaliser plusieurs fonctions dont l'asservissement. Au niveau électronique il s'agit de périphériques recevant un bus de données, un signal _RD, un signal _WR, un signal _CS.

Les 2 signaux _CS_LM_D et _CS_LM_G, viennent d'ici. Ils correspondent chacun à 2 adresses mémoires. Ceci permet de connecter la patte PS, (port select), qui permet de sélectionner l'écriture d'une donnée ou d'une commande, à la ligne d'adresse A0. Ainsi :

  • A l'@C00000, le LM droite sera sélectionné.(avec PS à 0 : commande)
  • A l'@C00001, le LM droite sera sélectionné.(avec PS à 1: donnée)
  • A l'@C00002, le LM gauche sera sélectionné.(avec PS à 0 : commande)
  • A l'@C00003, le LM gauche sera sélectionné.(avec PS à 1: donnée)

La patte HI (host interrupt), n'est pas utilisée (elle permet de générer une interruption, mais n'est pas utile dans le cadre de l'utilisation faite ici).
L'entrée _RST est reliée au _RESET de la carte. L'entrée CLK, est reliée à un oscillateur (en boitier DIP14) de 8 MHz. Le LM629 sort 2 informations, (sens de rotation, PWM), envoyées au moteur (via la carte puissance).

Les entrées A et B sont reliées aux entrées A et B des roues codeuses. Les roues codeuses doivent être alimentées (en 5V). L'alimentation est reportée sur les connecteurs(J7 et J8) allant vers les roues codeuses. L'entrée IN (servant pour une information d'index) ne doit pas être laisée en l'air. Elle est rapellée à +5V.

Les signaux A et B issus des roues codeuses doivent être traités avec soin, pour ne pas perdre d'information. Il faut minimiser la longueur des cables entre les roues codeuses et les LM,et si possible poser une résistance de rappel au +5V (environ 2,7ko) sur chacun des signaux, au plus prêt des roues (ex sur le connecteur situé sur les roues).

PIC

PIC

Le PIC permet de réaliser la communication I²C et la réception série de la liaison HF.(non représentée ici). Sa connection au bus se fait classiquement par _USERR,_USERW,_CS_PIC et les 8 bits de données. Le PIC présent sur la carte est un 20MHz, avec un quartz à 20MHz.Le flashage fait appel au flasheur présenté à côté. Le circuit de reset du PIC est un peu particulier. Il est nécessaire d'ajouter une diode, car lors du flashage du PIC, on apporte une tension de + de 13V sur la patte reset, tension qui ne serait pas appréciée par les autres circuits.

Le reste ....

A cette description plus ou moins exhaustive de la carte, il faut ajouter l'UART qui a été rajoutée après. Elle est connecté classiquement, elle aussi au bus. Elle utilise la même interuption que le PIC. Le fonctionnement du PIC n'a PAS été testé en présence de l'UART...(il *doit* marcher ...)(résultat : il ne marche pas correctement, il faudrait traiter en soft tous les cas d'interruption de l'UART)

Le schéma électrique de la carte rajoutée 'à la place' du PIC permettant de mettre le PIC et l'UART.

Schéma électrique de l'extension

ATTENTION ! le 74HC245 est inversé (port A et B). Il y aurait une résistance de pullup d' 1k en plus sur le signal Reset du PIC (de MCLR/VPP, broche 1 vers le +5V). La présence de cette résistence de pull-up peut empecher le flashage correct du PIC

 

La carte a cet aspect mécanique

Le nombre de problèmes pouvant survenir sur l'assemblage des différentes cartes est assez conséquent. Un élément qui bloque le bus, ou n'agit pas comme il devrait peut complètement bloquer le système.

 

Mapping mémoire du DSP + carte Starter Kit + carte d'extension

Pour un certain nombre des périphiques présentés au dessus, les adresses ne sont pas décodées complètement. C'est à dire que tous les bits d'adresse ne sont pas vérifiés. Il y'a alors plusieurs adresses qui correspondent à la même case mémoire physique. Dans le tableau qui suit; les adresses désignant un élément déjà atteint par une autre adresse sont appelés alias.

Adresse
Contenu
0 - FFFh ROM du DSP
1000h - 1FFFFh Flash externe(la partie 0h - 1000h, n'est pas accessible en utilisant cette plage d'adresse)
20000h - 3FFFFh Flash externe (alias)
...  
7E0000h - 7FFFFFh Flash externe (alias)
800000h - 807FFFh Réservé par le DSP
808000h - 8097FFh Périphériques du DSP (timer,DMA,etc)
809800h - 809BFFh 1ère partie de la RAM interne du DSP (1024 Kmots)
809C00h - 809EFFh début de la 2ème partie de la RAM interne du DSP
809F00h - 809FC0h suite de la 2ème partie de la RAM interne du DSP (utilisée par le Kernel assurant la communication)
809FC1h - 809FFFh fin de la 2ème partie de la RAM interne du DSP (zone où sont situés les pseudo-vecteurs d'interruption)
80A000h - 81FFFFh RAM externe (128 KMots) (la partie 800000h - 80A000h, n'est pas acessible en utilisant cette plage d'adresse)
820000h - 83FFFFh RAM externe (alias)
...  
900000h - 91FFFFh RAM externe (alias)
... - BFFFFFh  
C00000h LM Droite commande
C00001h LM Droite donnée
C00002h LM Gauche commande
C00003h LM Gauche donnée
C00004h 4 entrées, 4 sorties + 4 IT
C00005h 4 entrées, 4 sorties + 4 IT (alias)
C00006h Parallel Slave Port (Registre) du PIC
C00007h Parallel Slave Port (Registre) du PIC (alias)
C00008h Un accès à cette adresse autorise les IT venant de la carte externe
C00009h Un accès à cette adresse autorise les IT venant de la carte externe (alias)
C0000Ah Un accès à cette adresse passe la flash en écriture
C0000Bh Un accès à cette adresse passe la flash en écriture (alias)
C0000Ch Un accès à cette adresse passe la flash en lecture
C0000Dh Un accès à cette adresse passe la flash en lecture (alias)
C0000Eh UART
C0000Fh UART (alias)
C00010h - DEFFFFh alias de C00000h - C0000Fh
E00000h - EFFFFFh utilisé par la carte StarterKit
FFF000h - FFFFFFh utilisé par la carte StarterKit (communication PC <-> DSP), bloque tant que le PC n'a pas répondu