Forum: Compiler & IDEs SPI-Problem mit MCP2515 und ATmega16


von ElMachel (Gast)


Angehängte Dateien:

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

von Dirk (Gast)


Lesenswert?

Hi,

ich bin mir nicht 100 % sicher , aber muss der AVR nicht erst als
SPI_slave im SPCR geschaltet werden?

Mfg
Dirk

von ElMachel (Gast)


Lesenswert?

Hi

glaub ich ehrlich gesagt nicht, jedenfalls steht nichts davon im
Datenblatt.

mfg
Christian

von Mike Schaub (Gast)


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

von ElMachel (Gast)


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

von Mike Schaub (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hänge Dir einfach mal mein Programm für den ATMega128 und den
MCP2510 an. Jedenfalls hatte ich anfangs das gleiche Problem, es kam
immer nur 255 zurück.

Gruß
Mike

von Mike Schaub (Gast)


Angehängte Dateien:

Lesenswert?

Und das Hauptprogramm

von ElMachel (Gast)


Lesenswert?

Hi,

super jetzt gehts!!  Dein Quellcode hat mich auf meinen Fehler
gebracht. Habe immer CS auf High anstatt auf Low gesetzt (schäm).

Vielen Dank nochmal
Christian

von tüdel (Gast)


Lesenswert?

hat schon mal jemand den mcp2515/2510 unter einem msp430 angesteuert?
würde mich brennend für den code interessieren :-)

mfg tüdel

von wehrs (Gast)


Angehängte Dateien:

Lesenswert?

Ja, bin gerade am testen und ausprobieren. (Mit MSP430F149 über SPI
Schnittstelle zum MCP2515). Komischerweise sende ich immer 4x das selbe
Signal. Hatte da auch schon mal jemand Probleme damit?

Grüessli wehrs

von tüddel (Gast)


Lesenswert?

was macht dein prog?
lauft es jetzt?
schreibe jetzt seit einer wo routinen für dem mcp...
konnte diese jedoch noch nicht testen :-(
denke mal, bei meinem glück läuft wieder nix :-(

von KoF (Gast)


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

von Stefan Kleinwort (Gast)


Lesenswert?

Hi KoF,

ich habe hier:
http://www.mikrocontroller.net/forum/read-1-66019.html#167959

schonmal Routinen für den MCP2515 mit mega16 gepostet. Funktioniert
soweit ganz gut, musst Dir die relevanten Stellen halt etwas
raussuchen.

Viele Grüße, Stefan

von KoF (Gast)


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

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.