mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ronald H. (do7rh)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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... zur 
Hilfe genommen.

Ronald

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.