Go Down

Topic: SPI et les ADC (Read 2351 times) previous topic - next topic

Teslaboy

Feb 25, 2013, 10:06 pm Last Edit: Feb 25, 2013, 10:13 pm by Teslaboy Reason: 1
Bonjour bonsoir tout le monde,
Ce n'est pas de mon habitude de poster pour avoir de l'aide, mais quand on tourne en rond je pense qu'il vaut mieux demander et partir sur une bonne base.

Mon problème n'est pas bien compliqué, j'aimerai juste communiquer avec un ADS1243 de Texas Instrument. Ces ADC utilisent le bus SPI. J'ai regardé sur la référence, l'utilisation e ce bus ne semble pas compliqué. Cependant, je n'arrive même pas à lire le registre SETUP contenant un ID et les différents gains pour les entrées analogiques.

Voici la datasheet de la bête : http://www.ti.com/lit/ds/symlink/ads1243.pdf

Mon code est relativement simple, mais à l'exécution je récupère toujours 0. Ca m'étonnerai tout de même que le contrusteur ait fixé l'ID du chip à 0  :)
Code: [Select]
#include <SPI.h>

#define READ 0x01   // Permet de lire la dernière valeur convertie
#define RREAD 0x10   // Lire le registre
#define RWRITE 0X50   // Ecrire dans le registre

unsigned int adcValue;
byte result = 0;


void setup()
{
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  Serial.begin(9600);
 
  SPI.transfer(RREAD | 0x00);    // Demande du registre de config
  //SPI.transfer(0b00000000); 
 
  result = SPI.transfer(0);
  Serial.println(result,HEX);
 
}


void loop()
{
  // Ne fait pas encore grand chose pour le moment :)
 
}


J'ai testé en mettant l'instruction SPI.transfer(0b00000000);  en commentaire pour voir si un changement se passait, mais rien du tout.

Je vous remercie d'avance pour vos idées/pistes, cela m'aidera énormément. Je me débrouillerai pour la suite, il me manque juste ce petit coup de pouce :). L'objectif sera de me faire une petite librairie que j'appellerai dans mes différents projets.

Bonne soirée à tous.

EDIT :
J'ai oublié de préciser que j'étais connecté au bus SPI sur un arduino mega, et l'ADC possède un cristal externe de 4.9152MHz. Je pense avoir tout dit. S'il manque des trucs, n'hésitez pas à me le signaler.

B@tto

Normal, tu ne gères pas le chip select (pin /CS). Tu ne risqueras pas de communiquer avec ;)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

Bonjour B@tto, merci de ton intervention rapide.

En effet, je ne gère pas le CS, dans la datasheet (page 14), ils disent qu'il peut être connecté directement à la masse, ce qui j'ai fait (question de facilité/fainéantise?).

Ce n'était pas une bonne idée ?

B@tto

Oui ça peut se faire et c'est pas forcement une mauvaise idée ^^ disons que au lieu de le brancher à un pin GND tu le branches à un pin digital, éffectivement c'est de la grosse fainéantise :p

Bref côté hard sinon (je commence par les question bête) : tu as bien branché le quartz ? Quelle fréquence ? Tu n'as pas laissé le pin PDWN flottant ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

Ça va, tu me rassures.
Je n'ai pas la plaquette sous les yeux, le quartz est un 4.9152MHz avec 2 capa de 22pF. Par contre, l'histoire de la PDWN flottante, c'est une très bonne question. Je pense en effet qu'elle flotte, je vais vérifier ça dès que je rentre.

Hier en chipotant, j'ai réussi à recevoir des "choses". Par contre ça n'avait rien avoir et aucune répétabilité. Je suppose que c'était un essai foireux, et que je lisais donc du bruit :).

Le code semble correct pour la lecture de ce registre ?

B@tto

Apparement c'est bon. Après je crois que ça ait d'influence mais il vaut mieux mettre les parametres de config du SPI avant le SPI.begin(). De plus je viens de regarder la datasheet, il faut un SPI.setDataMode(1).
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

#6
Feb 26, 2013, 09:03 pm Last Edit: Feb 26, 2013, 09:23 pm by Teslaboy Reason: 1
Voilà, je viens de jeter un oeil,
La pin PWDWN etait bien mise à +5V. J'ai regardé en mettant setDataMode(1), mais pareil. Ennuyant cette petite bête...

J'ai modifié mon code pour avoir une sortie serie un peu plus verbeuse. J'ai des retours de données, mais que j'appuie sur RESET pour relancer le programme, le retour est différent :
Code: [Select]
Debut
59
Fin
Debut
Fin
Debut
AB
FF
FF
FF
FF
FF
FF
FF
FF
FF
FA
Fin
Debut
57
Fin


Le code pour cette exécution :
Code: [Select]
void setup()
{
 
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(1);
  SPI.begin();
  Serial.begin(9600);
  Serial.println("Debut");
 
  SPI.transfer(RREAD | 0x00);    // Demande du registre de config
  SPI.transfer(0b00000001); 
 
  result = SPI.transfer(0);
  while(result != 0)
  {
   
    Serial.println(result,HEX);
    result=SPI.transfer(0);
  }
  Serial.println("Fin");
 
}


Si j'ai le temps, demain je mettrai un schéma de câblage :).

Teslaboy

Bonjour,

Désolé du temps de réponse, beaucoup de choses à faire.

Voilà le montage que j'utilise actuellement. Je viens de relire la librairie SPI sur la référence, je n'ai pas mis la pin 53 en OUTPUT tel que conseillé. Je vais essayer, mais je suis assez perplexe quant au fait que ce soit ça.

B@tto

Attention : 53 c'est le SS pour l'arduino en Esclave SPI, prend n'importe quel autre pin
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

Bonjour B@tto,

Je n'utilise pas la pin 53, mais sur la ref ils disent qu'il faut la configurer en output car risque que la librairie déconne
Quote
Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.


Cordialement,

B@tto

Je l'ai jamais fait xD et jamais eu de problème ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

Bon, ben je pense que je vais laisser tomber, je vais me diriger vers un autre modèle, chez une autre marque.
C'est dommage, mais tant pis...

Par contre un ADC en I²C fonctionne très bien (mais plus complexe).

Le topic reste ouvert, si quelqu'un d'autre à une idée, je suis preneur :).

B@tto

J'ai fait une lib sur le MCP3424 (i2c, 4 channel 18 bits et amplificateur à gain programmable intégré). Il fonctionne remarquablement bien (je suis précis au µV).

Pour l'ADS comme ça je vois pas trop d'autres pistes, essaye d'inverser MOSI et MISO. Sinon je viens de regarder ton schéma : tu l'as pas laissé flottante l'entrée de l'ADC pour tes essais ? Sinon c'est normal que tu n'es pas la même chose à chaque fois ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Teslaboy

Bonjour B@tto,

Pour les essais je testais principalement pour avoir le registre SETUP, donc pas influencé par la mesure.
Et quand j'ai essayé des mesures, j'étais sur le GND :).

Ta bibliothèque est en ligne ? Elle pourrait en effet me servir, du moins en solution de rechange.

B@tto

http://arduino.cc/forum/index.php/topic,119618.0.html

Pas sûr que ça soit la dernière version, mais fonctionnelle quand même ;)
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Go Up