CAN Controller with Integrated Transceiver comandato con Arduino

Salve a tutti e buon venerdi

sto controllando il dispositivo MCP25625 con Arduino M0 Pro ed in particolare con la sua SPI.

Io devo attivare la modalità di loopback attraverso la manipolazione di tre bit del registro CANCTRL. per manipolarli bisogna prima inviare l'istruzione, address, poi una maschera e poi il dato.

Quello che mi accade è che appena accendo eseguo il reset e quindi mi aspetto di vedere, nei punti 44 e 45, il valore di quei registri al reset.

Se premo ad esempio 44 io ho effettivamente il suo valore di reset ma se poi premo subito 45 mi esce un valore che non corrisponde al valore di reset; poi se resetto nuovamente e faccio il viceversa vedo il valore corretto di reset del punto 45 ma se poi spingo 44 non lo vedo più.

Ed ovviamente questo non mi permette di capire se scrivo o no e se scrivo correttamente o no il bit per l'attivazione della funzione di loopback.

Qualcuno sa dirmi dove sbaglio.

Grazie davvero

/******* TEST CAN ***************/
 
  #define RESET_CAN_NEG  1
  #define CS_CAN_NEG     2
  #define CAN_INT_NEG    3
  #define FPGA_RX_CAN    8
  #define FPGA_TX_CAN    9

  #define CAN_STAND_BY   A3 


  SPISettings SPI_Settings(20000000, MSBFIRST, SPI_MODE0);

  unsigned int SPI_Received_Value = 0;

  unsigned int SPI_Received_Value_1 = 0;

void setup() {

  // put your setup code here, to run once:

  Serial.begin(9600);

  delay(2000);
  

  SPI.begin();
  
  pinMode(CS_CAN_NEG, OUTPUT);

  pinMode(RESET_CAN_NEG, OUTPUT);

  pinMode(CAN_STAND_BY, OUTPUT);

  digitalWrite(CS_CAN_NEG, HIGH);

  digitalWrite(RESET_CAN_NEG, HIGH);

  digitalWrite(CAN_STAND_BY, LOW);
}

void loop() {

  if(Serial.available()) {

    String Stringa = Serial.readString();

    int Dato = atoi(Stringa.c_str());
    
    delay(500);

/**** SPI ****/
    
    if(Dato == 42) {
        
        digitalWrite(CAN_STAND_BY, HIGH);

        Serial.println("Chip Reset");
        
        digitalWrite(RESET_CAN_NEG, LOW);

        delay(50);

        digitalWrite(RESET_CAN_NEG, HIGH);
        
        digitalWrite(CAN_STAND_BY, LOW);

        //digitalWrite(CS_CAN_NEG, LOW);

        //SPI.transfer(0b11000000);

        //digitalWrite(CS_CAN_NEG, HIGH);
    }

    if(Dato == 43) {
        
        Serial.println("Active LoopBack Mode");
        
        //digitalWrite(CAN_STAND_BY, HIGH);

        SPI.beginTransaction(SPI_Settings);

        digitalWrite(CS_CAN_NEG, LOW);
  
        SPI.transfer(0b00000101); // Istruzione 0000 0101

        SPI.transfer(0xF); // Address

        SPI.transfer(0b11111111); // Maschera

        SPI.transfer(0b01000000); // Data

        digitalWrite(CS_CAN_NEG, HIGH);

        SPI.endTransaction();

        //digitalWrite(CAN_STAND_BY, LOW);
        
        //SPI.end();
    }

    if(Dato == 44) {
        
        //SPI.begin();

        Serial.println("Read Register CAN Control Register");
        
        //digitalWrite(CAN_STAND_BY, HIGH);

        SPI.beginTransaction(SPI_Settings);
        
        digitalWrite(CS_CAN_NEG, LOW);


        SPI.transfer(0b00000011); // Istruzione

        SPI.transfer(0xF); // Indirizzo registro

        SPI_Received_Value = SPI.transfer(0);


        digitalWrite(CS_CAN_NEG, HIGH);

        SPI.endTransaction();

        //digitalWrite(CAN_STAND_BY, LOW);

        Serial.println(SPI_Received_Value);



        //SPI.end();
    }

    if(Dato == 45) {
        
        //SPI.begin();

        Serial.println("Read Register CAN Status Register");
        
        //digitalWrite(CAN_STAND_BY, HIGH);

        SPI.beginTransaction(SPI_Settings);
        
        digitalWrite(CS_CAN_NEG, LOW);

        SPI.transfer(0b00000011); // Istruzione

        SPI.transfer(0xE); // Indirizzo registro

        SPI_Received_Value_1 = SPI.transfer(0);

        digitalWrite(CS_CAN_NEG, HIGH);

        SPI.endTransaction();

        //digitalWrite(CAN_STAND_BY, LOW);

        Serial.println(SPI_Received_Value_1);

        //SPI.end();
    }
 }
}

MCP25625-CAN-Controller-Data-Sheet-20005282C-708896.pdf (1.05 MB)

>lorenrus: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48/72 ore dall'ultimo post. Grazie.

Guglielmo

gpb01:
>lorenrus: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48/72 ore dall'ultimo post. Grazie.

Guglielmo

Ciao Guglielmo

scusami.

Grazie

Ciao a tutti e buona domenica

qualcuno può aiutarmi ?

Grazie

gpb01:
>lorenrus: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48/72 ore dall'ultimo post. Grazie.

Guglielmo

Ma non mi risponde nessuno perchè per caso non ho fatto la presentazione ?? Non ricordo quando e se l'ho fatta.

Grazie

Ciao...la presentazione l'hai fatta...però, purtroppo, io non so aiutarti.

ORSO2001:
Ciao...la presentazione l'hai fatta...però, purtroppo, io non so aiutarti.

Ciao

Grazie lo stesso per il feedback :slight_smile: