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