Analyser la documentation du composant: http://www.ti.com/lit/ds/symlink/tlv5637.pdf
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:
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:
/* * 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
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.
#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() { }
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
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
Utilisez vos propres fonctions pour:
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.
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.
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.
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
Dans les exercices suivants, vous utiliserez l'USART matériel via la librairie SPI.
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
Ecrire un sketch arduino permettant de tester vos fonctions.