CAN-Controller MCP2515 per SPI an ATM128

Gast #510866
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
Gast #525999
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
Angehängte Dateien:
#526212
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
Angehängte Dateien:
Gast #526290
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
Gast #530656
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren