Table des matières

TD 1 Ethernet industriel : SPI, DAC et EEPROM

DAC

Etude du composant TLV5637

Analyser la documentation du composant: http://www.ti.com/lit/ds/symlink/tlv5637.pdf

  1. A quoi sert le TLV5637 ?
  2. Quelle interface de communication permet de connecter le TLV5637 à un micro-contrôleur
  3. Donner les attributs de cette communication : simplex/duplex, connections, mode (0,1,2 ou 3), vitesse maximum, ordre des bits (MSb ou LSb first)
  4. A quoi sert l'entrée/sortie REF du composant ?
  5. Proposer un montage intégrant le TLV5637 pour la génération d'un signal avec une résolution de 2mv
  6. Proposer un montage intégrant le TLV5637 pour la génération d'un signal avec une résolution de 3.2mv

Carte d'extension pour le TD

Schéma de la carte:

fichiers eagle: https://bvdp.inetdoc.net/files/iut/tp_dacspi/carte-arduino-tlv56-8.sch et https://bvdp.inetdoc.net/files/iut/tp_dacspi/carte-arduino-tlv56-8.brd

La carte d'extension utilisée pour ce TP permet de connecter le composant TLV5637 (ou TLV5626 ou autre) à l'Arduino. Elle dispose:

  1. du DAC deux voies.
  2. de 2 connecteurs BNC et de 2 sorties au pas de 2.54mm pour les sorties du DAC.
  3. de 2 potentiomètres rotatifs pour régler les tensions analogiques en entrée des entrées analogiques (ADC) de l'Arduino. Ces 2 potentiomètres peuvent être déconnectés des ADC en retirant les cavaliers correspondant.
  4. d'une led connectée à la sortie 8 de l'Arduino et active sur l'état haut.
  5. d'un bouton connecté à l'entrée 9 de l'Arduino, générant un état bas lorsqu'il est pressé.

Exercice 1: Utilisation d'une Librairie pour le TLV5637

Vous allez dans un premier temps utiliser une librairie objet pour piloter le DAC. Récupérer le fichier: https://bvdp.inetdoc.net/files/iut/tp_dacspi/Tlv5637.zip et l'installer de la manière suivante: Copiez-collez dans une console après l'avoir ouverte avec ALT+F2 lxterm :

mkdir -p ~/Arduino
cd ~/Arduino
mkdir -p libraries
cd libraries
wget https://bvdp.inetdoc.net/files/iut/tp_dacspi/Tlv5637.zip
unzip -o Tlv5637.zip
rm Tlv5637.zip
arduino

La librairie ainsi installée déclare la classe TLV5637:

Tlv5637.h
/*
 * Copyright (c) 2014 by Bertrand VANDEPORTAELE <bvdp@free.fr>
 * TLV5637 library for arduino.
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of either the GNU General Public License version 2
 * or the GNU Lesser General Public License version 2.1, both as
 * published by the Free Software Foundation.
 */
// For details on the sensor, see:
// www.ti.com/cn/lit/gpn/tlv5637
#ifndef _TLV5637_H_INCLUDED
#define _TLV5637_H_INCLUDED
#include <stdio.h>
#include <Arduino.h>
#include <avr/pgmspace.h>
// the sensor communicates using SPI, so include the library:
#include <SPI.h>
#define REF_EXTERNAL_TLV5637 0
#define REF_1024MV_TLV5637 1
#define REF_2048MV_TLV5637 2
class TLV5637  {
public:
    TLV5637(uint8_t PIN_CS_init,uint8_t REF_init);
    void powerOn(); //this method should be called before any other in order to initialize the SPI bus
    void powerOff();
    void speedFast();
    void speedSlow();
    void setRef(uint8_t REF_init);
    void writeDACA(uint16_t Value); //also update DACB with value in the buffer
    void writeDACB(uint16_t Value);  //also update buffer value
    void writeDACAB(uint16_t ValueA,uint16_t ValueB);
private:
    void writetlv5637(uint8_t R, uint16_t  Value);
    uint8_t SPD;
    uint8_t PWR;
    uint8_t REF;
    uint8_t PIN_CS;
};
#endif

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Compléter le sketch Arduino suivant dans lequel la librairie Tlv5637 est incluse. Implémentez la fonction setup pour activer le composant DAC (faire PowerOn) et le faire fonctionner en mode rapide. Dans la fonction loop, faire en sorte de générer des échantillons de la fonction sinus sur la voie A et cosinus sur la voie B en générant 100 échantillons pour les 2 $pi$ radians. Visualiser à l'oscilloscope les signaux générés.

DACSPI.ino
#include <SPI.h>
#include <Tlv5637.h> 
//Numéro de la broche Arduino connectée au Chip select du TLV5637
#define DAC_CS  3  
TLV5637 dac(DAC_CS,REF_2048MV_TLV5637);
// the setup routine runs once when you press reset:
void setup() {    
}
// the loop routine runs over and over again forever:
void loop() {
}

Exercice 2: Commande à bas niveau du DAC en utilisant l'USART de l'arduino et les fonctions de la librairie SPI

Vous allez maintenant devoir coder vous même les fonctions (sans approche objet) permettant de piloter le DAC. Vous utiliserez les fonctions présentées sur la documentation locale d'Arduino: https://www.arduino.cc/en/reference/SPI (copier le lien dans le navigateur)

Il est demandé d'utiliser le mode SPI 2 même si l'analyse de la documentation du composant nous dit que les modes 1 et 2 conviennent, sinon la commande simultanée des 2 voies du DAC ne fonctionne pas!

La documentation de la dernière version des librairies est consultable sur: http://arduino.cc/en/Reference/SPI

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Implémentez les fonctions suivantes:

void initSPIforTLV5637();

Fonction qui initialise l'interface SPI pour pouvoir communiquer avec le TLV5637

void send16bitsTLV5637(unsigned short int value);

Fonction qui  envoie la valeur value au  TLV5637. La fonction gère la sélection et la desélection du composant sur le bus SPI.

Pour les questions suivantes, le TLV5637 sera toujours en mode fast et power-on. Les fonctions suivantes devront appeler la fonction send16bitsTLV5637.

void setIntRefTLV5637(unsigned char val);

Fonction de sélection et configuration de la référence interne du TLV5637
val : 0 pour 1.024v, 1 pour 2.048v

void setExtRefTLV5637(void);

Fonction de sélection de la référence externe du TLV5637

void writeTLV5637DACA(unsigned int value);

Fonction d'écriture d'une valeur sur le canal A du TLV5637
value : valeur à écrire sur 10 bits

void writeTLV5637DACB(unsigned int value);

Fonction d'écriture d'une valeur sur le canal B du TLV5637
value : valeur à écrire sur 10 bits

void writeTLV5637DACA_B(unsigned int a_value, unsigned int b_value);

Fonction d'écriture synchrone sur le canal A et B du TLV5637
a_value : valeur à écrire sur le canal A
b_value : valeur à écrire sur le canal B

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Utilisez vos propres fonctions pour:

  1. Configurer l'horloge SPI à 125Khz
  2. Générer un signal carré de période 200ms et d'amplitude 1V

Une fois ce signal validé, réutiliser le programme que vous aviez écrit lors le l'exercice précédent (sinus et cosinus sur les 2 voies) en appelant vos propres fonctions.

En cas de problème, pour debugger, vous pourrez utiliser l'oscilloscope pour visualiser les signaux des transactions SPI. Afin de rendre les signaux 'observables', vous pourrez ralentir la fréquence d'horloge SPI.

Exercice 3: Emulation de l'interface SPI avec des GPIOs

Vous allez maintenant devoir coder vous même les fonctions (sans approche objet) permettant de piloter le DAC sans utiliser l'interface matérielle USART. Vous devrez donc vous passer de toutes les fonctions de la librairie SPI. Les broches MOSI, SCK et CSTLV/ seront désormais configurées en sorties et pilotés comme des GPIOs par logiciel.

Pour rappel: Il est demandé d'utiliser le mode SPI 2 même si l'analyse de la documentation du composant nous dit que les modes 1 et 2 conviennent, sinon la commande simultanée des 2 voies du DAC ne fonctionne pas! En déduire les valeurs de repos pour le signal d'horloge.

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Implémentez les fonctions suivantes:

void initSPISoftforTLV5637();

Fonction qui initialise l'interface SPI Emulée pour pouvoir communiquer avec le TLV5637 (configuration de la direction des broches)

void send16bitsSoftTLV5637(unsigned short int value);

Fonction qui  envoie la valeur value au  TLV5637 par l'interface SPI Emulée. Vous prendrez les précautions nécessaires pour que les signaux générés respectent les timings imposés par la documentation du TLV5637.

Vous pourrez tester ces fonctions en substituant les appels des fonctions SPI dans le programme de test de l'exercice précédent.

Exercice 4: EEPROM SPI

Vous allez maintenant utiliser la carte présentée en tdcom2 pour piloter une mémoire EEPROM via un bus SPI. La documentation du composant est disponible sur: http://ww1.microchip.com/downloads/en/DeviceDoc/21204E.pdf

Etude du composant 25C040

  1. Proposer un schéma pour connecter deux eeprom 25C040 à la plateforme Arduino
  2. Déterminer la fréquence maximale de l'horloge spi utilisable pour ce composant
  3. Indiquer le rôle de la broche /WP
  4. Indiquer le rôle de la broche /HOLD
  5. Indiquer le nombre de bits d'adresse utilisés pour sélectionner une case de la mémoire
  6. Indiquer la suite d'opérations nécessaires pour effectuer une lecture
  7. Indiquer la suite d'opérations nécessaires pour effectuer une écriture
  8. que faut il faire pour s'assurer que l'eeprom est prête à recevoir un ordre d'écriture?
  9. quel est le nombre maximum de données que l'on peut écrire en une fois?

Codage des accès à la mémoire

Dans les exercices suivants, vous utiliserez l'USART matériel via la librairie SPI.

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Décrire et implémenter les fonctions suivantes:

void readEEPROM(unsigned int addr, unsigned char * buffer, unsigned char nb_bytes):

addr : l'adresse de la première case à écrire sur l'EEPROM
buffer : le pointeur sur une zone mémoire pour le résultat de la lecture
nb_bytes : la taille de la zone à lire

void writeEEPROM(unsigned int addr, unsigned char * buffer, unsigned char nb_bytes)

addr : l'adresse de la première case à lire sur l'EEPROM
buffer : le pointeur sur une zone mémoire contenant les valeurs à écrire
nb_bytes : la taille de la zone à écrire

bvdp.inetdoc.net_files_iut_tp_tns_todo.jpg Ecrire un sketch arduino permettant de tester vos fonctions.