Forum: Compiler & IDEs CAN-Controller MCP2515 per SPI an ATM128


von Matthias (Gast)


Lesenswert?

Hallo,


ich versuche vergeblich den CAN-SPI-Adapter zum Laufen zu bringen.:
(Code komplett im Anhang)


int main(void)
{
  SW_DDR &= ~(1 << SW0);
  SW_DDR &= ~(1 << SW1);
  SW_PORT |= (1 << SW0);
  SW_PORT |= (1 << SW1);

  LED_DDR |= (1 << LED);   // LED auf Ausgang
  LED_PORT &= ~(1 << LED); // LED EIN


  initLCD();      // LCD-Display initialisieren
  init_SPI_Master();    // SPI initialisieren

  LCD_TextOut(" Init ");

  initMCP2515();

  LED_PORT |= (1 << LED); // LED AUS
}



int8_t initMCP2515(void)
{
  uint8_t test;
  char testtext[]= " .: ";

  // Software-Reset durchführen
  SPI_PORT &= ~(1<<SPI_SS);
  asm("nop");
  SPI_TX(MCP2515_RESET);
  asm("nop");
  SPI_PORT |= (1<<SPI_SS);

  MCP2515_WRREG(MCP2515_CNF1,5);
  asm("nop");
  test = MCP2515_RDREG(MCP2515_CNF1);

  testtext[1]=test+48;
  LCD_TextOut(testtext);

  if (test == 5)
  {
    LCD_TextOut("match");
  }
  else
  {
    LCD_TextOut("fail");
  }

  test = MCP2515_READ_STATUS();
  testtext[1]=test+48;
  LCD_TextOut(testtext);

  return 0;
}

uint8_t MCP2515_WRREG(uint8_t Adresse, uint8_t Daten)
{
  SPI_PORT &= ~(1<<SPI_SS);
  asm("nop");
  SPI_TX(MCP2515_WRITE);
  asm("nop");
  SPI_TX(Adresse);
  asm("nop");
  SPI_TX(Daten);
  asm("nop");
  SPI_PORT |= (1<<SPI_SS);

  return 0;
}

uint8_t MCP2515_RDREG(uint8_t Adresse)
{
  uint8_t Daten;
  SPI_PORT &= ~(1<<SPI_SS);
  asm("nop");
  SPI_TX(MCP2515_READ);
  asm("nop");
  SPI_TX(Adresse);
  asm("nop");
  Daten= SPI_PUT(0xff);

  SPI_PORT |= (1<<SPI_SS);

  return Daten;
}

uint8_t MCP2515_READ_STATUS()
{
  uint8_t Daten;
  SPI_PORT &= ~(1<<SPI_SS);
  asm("nop");
  SPI_TX(MCP2515_READ_STAT);
  asm("nop");
  Daten= SPI_PUT(0xff);
  SPI_PORT |= (1<<SPI_SS);
}

int8_t init_SPI_Master(void)
{
  /* Set MOSI and SCK output, all others input */
  SPI_DDR |= ((1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS));
  SPI_PORT &= ~((1<<SPI_SCK)|(1<<SPI_MOSI)|(1<<SPI_MISO));
  SPI_PORT |= (1<<SPI_SS);

  /* Enable SPI, Master, set clock rate fck/16 */
  SPCR = ((1<<SPE)|(1<<MSTR)|(1<<SPR0));//|(1<<SPR1));
  //SPSR = (1<<SPI2X);
  return 0;
}

int8_t SPI_TX(int8_t cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
  ;
  return 0;
}

int8_t SPI_RX(void)
{
  return SPDR;
}

uint8_t SPI_PUT(uint8_t cData)
{
  /* Start transmission */
  SPDR = cData;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
  ;
  return SPDR;
}

hat da vielleicht jemand einen Tipp, woran es liegen könnte? Ausgabe ist 
immer "0"!

MFG
Matthias

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hab jetzt mal ein Oszi ausgeliehen und die Leitungen angeschaut (Bild im 
Anhang). Dabei war mir zuerst der Fehlende PULL-UP am MISO aufgefallen, 
sieht jetzt nach Aktivierung aber gut aus. Der SCK allerdings hat einen 
sehr niedrigen Pegel, ca. 1V.

Wisst ihr woran das liegen kann, und was ich am Besten dagegen tue?

MFG
Matthias

von Ronald H. (do7rh)


Angehängte Dateien:

Lesenswert?

Hallo Matthias,

ich habe meinen SCK nach einmal nachgemessen. Anbei die Messung. Ich 
hatte ein ähnliches Problem, was an einem noch angeschlossenen ISP 
Programmer gelegen hat. Wenn den aber wen nehme ist alles ok. Schau mal 
nach, ob nicht ggf. irgenwas noch mit an dem Port vom µC liegt.
Bei meinem Mega128 ging es nur ohne den Programmer(Parallel). Meinen 
Mega8 programmiere ich über seriell und den kann ich dran lassen.
Für die Initialisierung habe ich mir die Anleitung bei 
http://www.kreatives-chaos.com/artikel/ansteuerung-eines-mcp2515 zur 
Hilfe genommen.

Ronald

von Matthias (Gast)


Lesenswert?

Hallo,

danke für den Hinweis, darüber bin ich am Anfang auch gestolpert. Das 
Problem mit dem SCK lag an der Messung (falsche Masse), es sieht jetzt 
sauber aus! Der Contoller sendet auch, was ich erwarte, allerdings kommt 
vom MCP2515 nicht der gleiche Wert zurück, sondern 0, wenn ich CNF1 
beschriebe und auslese!

Habe ich da einen Denkfehler?

MFG
Matthias

von Matthias (Gast)


Lesenswert?

Hallo Allerseits,

jetzt habe ich mal probiert das CANSTAT Register auszulesen, nachdem am 
Oszi alles gut aussah, und siehe da: es kommt tatsächlich der nach dem 
Reset erwartete Wert (0x80)!
Allerdings wenn ich ein Register (CNF1) beschreibe (siehe Quelltext 
oben) und wieder auslese, kommt nicht das erwartete Ergebnis.

Hat jemand das auch schon mal so probiert? Unterliege ich einem 
Denkfehler, oder wo kann hier der Fehler liegen?

MFG Matthias

von Philipp D. (phili)


Lesenswert?

Die letzte Antwort ist zwar schon eine Weile her, aber ich hatte gerade 
das Problem, dass ich nach dem Reset nicht ausreichend lange gewartet 
hatte. Deshalb wurden die Daten nicht sauber in das CNF1 (und andere 
Register) übernommen. Jetzt warte ich 10ms.


lG
Phili

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.