Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

SPI per impostare un CAN controller

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] SPI per impostare un CAN controller

Messaggioda Foto Utentelorenrus » 26 mag 2020, 21:05

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

Codice: Seleziona tutto

/******* 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();
    }
}
}

Avatar utente
Foto Utentelorenrus
5 2
New entry
New entry
 
Messaggi: 74
Iscritto il: 30 ott 2018, 18:30

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti