Arduino Uno => bus SPI

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

Postez votre code

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

#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);
}

Euh... ça ça ne rentre pas sur 1 octet..

const byte READ = 0b0010000000000000;

Dois-je lire le code plus loin?

Sinon notez que dans la doc de SPISettings ils disent

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 SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE1)); /Best if all 3 settings are constants

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

Dans votre code vous faites SPI.transfer(0x2040);Si vous voulez envoyez 2 octets il faut utiliser SPI.transfer16()

Est ce un READ que vous envoyez?

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"

à la fin de votre documentation ils mentionnent de 0 à 5MHz

SPI.png

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

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 :slight_smile:

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…

#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);
}

Triv38:
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 :slight_smile:

Une inversion entre MISO et MOSI qui créerait un conflit par exemple?