SPI-Problem mit MCP2515 und ATmega16

Gast #178841
Lesenswert?

Hallo,

ich versuche gerade einen MCP2515 zum laufen zu bringen.
Dazu hab ich mir den CAN-SPI Adapter von www.avrcard.com
besorgt, den ich an einen ATmega16 angeschlossen habe (10 cm
Leitung).

Zum testen der Kommunikation vom MCP2515 und dem
ATmega16, wollte ich einfach ein Paar Register setzen,
und dann den gesetzten Wert einfach wieder auslesen,
allerdings bekomm ich nur 0xFF zurück.

Ich habe den relevanten Codeteil im Anhang mitgeschickt.
Könnte ihn bitte jemand durchschauen und auf Fehler
überprüfen?
Oder vielleicht andere Tipps zur Fehlereingrenzung geben.
Wär echt super!

Vielen Dank im Voraus.

Christian

hier noch die spi-Funktionen:

void spi_init(void)
{
  /* Datadirection setzen */
  DDRB = (1 << MOSI) | (1 << SCK) | (1 << CS);
  /* SPI Control-Register konfiguirieren */
  SPCR = ( 1 << SPE ) | (1 << MSTR) | ( 1 << SPR1) | ( 1 << SPR0);
}


void spi_write(byte_t data)
{

  SPDR = data;

  loop_until_bit_is_set(SPSR,SPIF);

}

void spi_cs(byte_t value)
{

  if ( value != 0) {
    PORTB |= 0x10;
  } else {
    PORTB &= ~(0x10);
  }

}


byte_t spi_read(void)
{
  return SPDR;
}
Angehängte Dateien:
Gast #178844
Lesenswert?

Wurde das Datenrichtungsregister richtig gesetzt?
Anbei meine Routine für den MCP2510 mit ATMega128:

void init_SPI (void)
{
  outp(0x70,HW_SPI);  //  PortB ist HW_SPI
  outp(0x07,DDR_SPI);  //Datenrichtungsregister setzen
  outp(0x5F,SPCR);  //  SPI Controll Register setzen
}

Gruß
Mike
Gast #178845
Lesenswert?

Hi,

mmh, da müsste ich mich jetzt schon schwer täuschen, aber mit der
Zeile:
DDRB = (1 << MOSI) | (1 << SCK) | (1 << CS);
sollte ich die notwendigen Pins auf Output geschaltet haben.
Auch das Control-Register dürfte IMHO richtig sein,
(1 << SPE ) /* SPI-Enable setzen */
( 1 << MSTR) /* Master Mode */
( 1 << SPR1) | ( 1 << SPR0); /* SCK mit fosc/128 */

In einer neueren Fassung des kleinen  Testprogramms warte ich jetzt
noch ein paar
Sekunden bis ich den ersten SPI-Operation sende, da ich gelesen habe,
dass der MCP2515 einige Taktzyklen braucht bis er überhaupt richtig
läuft, dass hat aber auch kein anderes Ergebnis zur Folge gehabt.

Was sagst du zu den anderen SPI-Funktionen? Hab ich da vielleicht noch
einen
Denkfehler drin? Muss ich vielleicht bei spi_read() noch das SPIF Flag
bearbeiten?


mfg
Christian
Gast #178852
Lesenswert?

hallo ihr.

ich habe auch ein problem mit dem mcp2510.
er antwortet nicht!
auf der out-leitung des mcp`s liegt nur ein phantomsignal der clock.
diese habe ich auf 50kHz gedrosselt, da ich den mcp mit 2MHz oszi
bestückt habe. cs liegt gegen masse, int ist high, reset liegt mit
einem widerstand (10k) gegen vcc.

auch nach einer initialisierung bekomme ich keine signale aus dem
chip.
auch nach einem tausch des chips gab es keinen erfolg
Gast #178854
Lesenswert?

hab den fehler grob schonmal lokalisiert.

cs muß den pegel wechseln. wenn er so, wie bei mir immer gegen masse
läuft geht es nicht. jetzt steuere ich es über einen extra pin meines
uc`s und siehe da, er antwortet :-)

aber deine quellen werde ich mir auch nochmal ansehen

mfg
KoF

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