Solution de TD SPI

Sujet sur tdethindus3distanciel

1.1: Le TLV5637 est un Convertisseur Numérique vers Analogique à 2 sorties analogiques synchronisées. Nous parlerons dans la suite d'un DAC (Digital Analog Converter)

1.2: Le composant supporte la communication à travers les interfaces TMS320, SPI, QSPI, and Microwire. Nous utilisons ici l'interface SPI pour communiquer avec.

1.3 Le bus SPI supporte le Full Duplex mais avec ce composant DAC il est utilisé en Simplex car le DAC ne fait que recevoir depuis le bus.

Connexion:

Broche du DAC Broche de l'Arduino
DIN MOSI
SCLK SCLK
/CS une GPIO libre
GND GND

Mode utilisable: d'après la documentation (Figure 1), le composant lit DIN lors des fronts descendants de SCLK et SCLK peut être à l'état haut ou bas (X) avant et après la transaction. Ceci indique que le composant supporte les modes SPI 1 et 2. En pratique, il faut utiliser le mode 2.

Vitesse maximum: La fréquence d'horloge maximale pour le signal d'horloge sur le bus SPI est de 20Mhz, ce qui correspond à 1.25 million d'échantillons par seconde en sortie du DAC.

Ordre des bits: Bit de poids fort d'abord (msb first), car D15 en premier sur Figure 1.

1.4: REF sert de référence de tension, elle permet de régler la plage de tension utilisable en sortie du DAC. Elle peut être soit en entrée si une référence de tension est utilisée soit en sortie si une des deux références de tension interne est utilisée.

1.5: résolution de 2mv: D'après la formule en haut de la page 10, la tension en sortie du DAC vaut $2*REF*CODE/0x1000$ (V) mais il est dit juste en dessous que les bits 0 et 1 du code 12 bits ne sont pas utilisé car le DAC est sur 10 bits seulement. La résolution correspond à la variation de tension la plus petite que l'on peut obtenir en sortie du DAC, elle correspond donc à un incrément de 4 de CODE.

Il faut donc $2*REF*4/0x1000=0.002$ (V) , donc $REF=0.002*0x1000/(2*4)=1.024$ (V). Cette tension est disponible en référence interne d'après la table en haut de la page 12, donc on choisi la combinaison REF10=01

1.6 On peut réutiliser la même formule en changeant la valeur numérique: $2*REF*4/0x1000=0.0032$ (V) implique $REF=0.0032*0x1000/(2*4)=1.6384$ (V). Cette tension n'est pas disponible en référence interne d'après la table en haut de la page 12, donc on choisi une référence externe en sélectionnant une combinaison REF10=00 ou 11 et en imposant 1.6384V sur la broche REF.


2.1

2.2

DAC183.ino
SPISettings mySettings(16000, MSBFIRST, SPI_MODE2);
 
void initSPIforTLV5637(){
  SPI.begin();
  pinMode(DAC_CS, OUTPUT);
  digitalWrite(DAC_CS, HIGH); 
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE2);
  SPI.setClockDivider(SPI_CLOCK_DIV2); 
  setIntRefTLV5637(0);
}

2.3

DAC183b.ino
void send16bitsTLV5637(unsigned short int value){
  digitalWrite(DAC_CS, LOW); 
  SPI.beginTransaction(mySettings); 
  SPI.transfer(value>>8); //Send register location
  SPI.transfer(value & 0xff);  //Send value to record into register
  digitalWrite(DAC_CS, HIGH); 
}

2.4 et 2.5

Les réponses seront vues en TP