Go Down

Topic: Arduino Uno => bus SPI (Read 450 times) previous topic - next topic

Triv38

Bonjour à tous.
VOici ma problématique :
Je souhaite mettre en place un bus SPI pour dialoguer entre une carte Arduino Uno et un transceiver ELMOS. Ce transceiver Elmos va lire les valeurs d'un capteurs et les renvoyer directement sur le bus SPI. La particularité de ce transceiver est d'avoir une mémoire EEPROM contenant plusieurs paramètres.

Le but pour moi dans un premier temps et de pouvoir dialoguer avec ce transceiver en lisant la valeur d'un paramètre...

Après avoir fait le cablage (SDI, SDO, NCS, SCLK) entre la carte arduino et le transceiver, j'ai réalisé un petit programme permettant de récupérer la valeur d'un paramètre. Malheureusement, aucune valeur ne m'est retourné sur le moniteur série.

Si vous avez des pistes, je suis preneur.

merci bcp.

Ci-dessous, la datasheet du transceiver.
datasheet transceiver

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Triv38

Désolé, juste un oublie...  :)


Code: [Select]
#include "SPI.h"

const int slaveAPin = 10; // using digital pin 10 for SPI slave select   LOW=> UART / HIGH => SPI
int del = 200; // used for various delays

// set up the speed, data order and data mode
SPISettings settingsA(16000000, MSBFIRST, SPI_MODE1);

const byte READ = 0b0010000000000000;

void setup()
{
    //common
  Serial.begin(115200); // Initialize Serial communications with computer to use serial monitor
 
  // put your setup code here, to run once:
  pinMode(slaveAPin, OUTPUT); // we use this for SS pin
 
  SPI.begin(); // wake up the SPI bus.
  delay(100);
}

void readValue(int value)
{

}

uint8_t stat, val1, val2, result;

void loop()
{
  // read three bytes from device A
  SPI.beginTransaction(settingsA);
  digitalWrite(slaveAPin, LOW);

  // reading only, so data sent does not matter
  SPI.transfer(0x2040);
  stat = SPI.transfer(0x0);
  val1 = SPI.transfer(0x0);
  val2 = SPI.transfer(0x0);
 
  digitalWrite(slaveAPin, HIGH);
  SPI.endTransaction();
  Serial.print(stat);
  Serial.print(val1);
  Serial.print(val2);
 
  delay(2000);
}



J-M-L

#3
Jun 04, 2018, 09:05 am Last Edit: Jun 04, 2018, 09:10 am by J-M-L
Euh... ça ça ne rentre pas sur 1 octet..
Code: [Select]
const byte READ = 0b0010000000000000;

Dois-je lire le code plus loin?


Sinon notez que dans la doc de SPISettings ils disent
Quote
When all of your settings are constants, SPISettings should be used directly in SPI.beginTransaction(). See the syntax section below. For constants, this syntax results in smaller and faster code.
Utilisez
Code: [Select]
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1)); /Best if all 3 settings are constants
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Triv38

ok c'est noté pour le code.

par contre, pour la demande de lecture, voici ce que me dit la datasheet du transceiver ....
Donc je suis bien obligé d'envoyer plusieurs octets je pense



J-M-L

#5
Jun 04, 2018, 09:23 am Last Edit: Jun 04, 2018, 09:24 am by J-M-L
Dans votre code vous faites
Code: [Select]
SPI.transfer(0x2040);Si vous voulez envoyez 2 octets il faut utiliser SPI.transfer16()

Est ce un READ que vous envoyez?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Triv38

Oui c'est bien un "read" que je veux envoyer.

Par contre ce que je ne connais pas, c'est la fréquence du bus qu'utilise le transceiver (16MHz) ainsi que le "SPI_Mode1"

J-M-L

#7
Jun 04, 2018, 11:32 am Last Edit: Jun 04, 2018, 11:32 am by J-M-L
à la fin de votre documentation ils mentionnent de 0 à 5MHz

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Triv38

Ok merci J-M-L, effectivement, j'avais pas vu la plage de fréquence.
Bon malgré cette modif, le résultat reste toujours le même, pas de valeur retourné, la console m'affiche "255255255" à chaque requête

Triv38

En regardant sur la datasheet du transceiver, vous diriez que c'est qu'elle mode du SPI ?
SPI_mode0 ou SPI_mode1 ou SPI_mode2 ou SPI_mode3 ?

J'arrive pas à trouver l'info...

De plus, quand je regarde les différents signaux à l'oscilloscope, je vois bien ma clock (SCLK) qui bascule (front montant d'amplitude 5V), le Chip Select (NCS) qui bascule (front descendant d'amplitude 5V) mais je comprend pas car j'ai rien sur le signal MOSI et sur le signal MISO, j'ai un simple front montant d'amplitude 1V environ...

Si vous avez une explication..., je suis tout ouïe :-)

Triv38

#10
Jun 04, 2018, 02:07 pm Last Edit: Jun 04, 2018, 02:08 pm by Triv38
Voici ce que j'ai récupéré de la datasheet. J'ai donc modifié la partie du programme en conséquence :
Malheureusement, toujours rien en reception...

Code: [Select]
#include "SPI.h"

const int slaveAPin = 10; // using digital pin 10 for SPI slave select   LOW=> UART / HIGH => SPI

const byte READ = 0b0010000001000000;

void setup()
{
    //common
  Serial.begin(115200); // Initialize Serial communications with computer to use serial monitor
 
  // put your setup code here, to run once:
  pinMode(slaveAPin, OUTPUT); // we use this for SS pin
 
  SPI.begin(); // wake up the SPI bus.
  delay(100);
}

uint8_t stat, val1, val2, result;

void loop()
{
  // read three bytes from device A
  SPI.beginTransaction(SPISettings(3000000, MSBFIRST, SPI_MODE1)); //Best if all 3 settings are constants
  digitalWrite(slaveAPin, LOW);

  // reading only, so data sent does not matter
  //SPI.transfer(READ);
  SPI.transfer16(READ);
  SPI.transfer16(0x0);
  SPI.transfer16(0x0);
  stat = SPI.transfer(0x0);
  val1 = SPI.transfer(0x0);
  val2 = SPI.transfer(0x0);
 
  digitalWrite(slaveAPin, HIGH);
  SPI.endTransaction();
  Serial.print(stat);
  Serial.print(val1);
  Serial.print(val2);
 
  delay(2000);
}

fdufnews

mais je comprend pas car j'ai rien sur le signal MOSI et sur le signal MISO, j'ai un simple front montant d'amplitude 1V environ...

Si vous avez une explication..., je suis tout ouïe :-)
Une inversion entre MISO et MOSI qui créerait un conflit par exemple?

Go Up