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

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
