Hallo zusammen,
ich habe derzeit ein Projekt, bei dem ein Attin1616 über SPI mit einem SX1276 LoRa Modul reden soll. Leider bekomme ich die SPI Kommunikation nicht wirklich hin. Ich habe mir 3 Methoden geschrieben:
1
voidinit_spi(){
2
PORTA_DIRSET=0x02|0x04|0x10;//set clock, MOSI and NSS as output
//; while (!SPI0_INTFLAGS & 0x80) ; // wait for transmission to be over
11
_delay_ms(5);
12
send_char(SPI0_DATA);
13
}
14
PORTA_OUTSET=0x10;
15
}
Die Methode send_char() macht über UART eine Ausgabe zum debuggen. Leider bekomme ich immer nur 0x00 zurück. Sieht jemand auf Anhieb etwas das Falsch läuft? Falls nein, hat jemand evtl ein paar Code Fetzen, die ich mir anschauen kann? Microchip hat zwar ein Guide zu SPI an Attiny 0 und 1 serie, allerdings habe ich da nicht wirklich etwas finden können, was erklärt, warum das ganze hier nicht funktioniert. Ich habe leider kein Oszilloskop um mir die Leitungen anzuschauen. Die Pinbelegung ist MOSI PA1, MISO PA2, SPI_CLK PA3, CS PA4, also die Standartbelegung des Attiny1616, wenn ich das richtig aus dem Datenblatt gelesen habe.
Danke schon mal für Eure Hilfe und noch einen schönen Abend.
Bei solchen Magic Numbers weiss natürlich gleich jeder ob
du alles richtig gemacht hast. Nicht wahr? Wozu gibt
es Header-Files vom Hersteller wo alles vordefiniert ist?
Das wären meine Magic Numbers ..... wenn man den Clock auch als
Output definieren müsste. MISO natürlich nicht ...
Ah da ist mir wohl ein Fehler unterlaufen. Geht aber leider immer noch nicht.
Die Einstellungen zu SPI sollten denke ich passen, Das sollte SPI Master Mode sein mit clockdiv 16 und SPI enable. Das zweite ist Nur Slave Select Disable, da ich kein multi Master mache.
Hast du was gesehen, was ich falsch gemacht habe oder ist das mehr ein "hier sollte alles drin stehen"? Ich habe eigentlich beides gelesen, aber scheinbar dann wohl nicht richtig.
Meine übliche Vorgehensweise wäre jetzt, ein/en Oszi/Logicanalyzer zu nehmen, und zu kontrollieren, ob sich auf dem SPI das tut, was ich erwarte. Und wenn nicht das passiert, was ich erwarte, dann sehe ich, wo ich noch korrigieren muss.
Da muss man dann gar nichts Denken, sondern einfach nur kontrollieren. Alles andere ist wie "Blindflug im Nebel" oder "Autofahren nach Gehör". Es ist mir ein völliges Rätsel, wie man serielle Busse ohne Speicheroszi bzw. LA in Betrieb nehmen kann.
Nur ein ATtiny (1616) vorhanden?
Ansonsten: den zweiten als SPI-Slave nehmen und (per Einfachstprogrammen) Buchstaben hin&her schicken. Solche Programme lassen sich hier dann auch vollständig vorstellen (und der Sonntag wäre gerettet).
Hast du was gesehen, was ich falsch gemacht habe oder ist das mehr ein
"hier sollte alles drin stehen"? Ich habe eigentlich beides gelesen,
aber scheinbar dann wohl nicht richtig.
Eher da steht in Beiden alles drin. Dein Code Ausschnitt ist leider schwer bis kaum lesbar. Niemand übersetzt Hexcode in Binär und zurück nur zum vergleichen.
Bekommst du eine Led zum blinken?
Ansonsten, halte dich an die App Note und es wird funktionieren.
Tue dir selbst auch einen Gefallen. Verwende Bitnummern oder noch besser Bitnamen bzw. Bitmasken (die mit _bm am Ende).
Deine:
1
PORTA_DIRSET=0x02|0x04|0x10;//set clock, MOSI and NSS as output
übersetzt:
1
PORTA_DIRSET=_BV(1)|_BV(2)|_BV(4);//set clock, MOSI and NSS as output
Stellst du schon etwas fest?
Wenn nicht, an welchen Portpins verwendest du SPI?
Wie heißen die Portpins?
Was sind deren Bitnummern?
Gehe alles nochmal durch.
Wenn ich einen zweiten Attiny1616 als Slave setze und etwas nicht geht, habe ich ja nichts gewonnen. Ich weiß dann ja nicht, ob es an der Master- oder Slave Seite liegt. Eine zweite Platine müsste ich erst bestücken; dafür, dass das Resultat nicht. Aber kann ich Testweise einfach MISO und MOSI verbinden?
Dann sollte doch zumindest immer das ankommen, was ich sende, um zu schauen, ob das SPI an sich überhaupt funktioniert.
Ich verstehe nicht warum man immer mit Magic Numbers herumeiern
muss wenn doch alle Register und Bits mit Namen in einer Datei
bereitgestellt werden und für jeden verfügbar sind.
Nein, ich verstehe es nicht. Es lassen sich so viele Fehler
vermeiden und die Community versteht weitaus besser was im
Programm los ist.
Ich habe den Fehler gefunden. Es war tatsächlich was ganz anderes und unglaublich dämliches. Anstatt in der main() spi_init(); aufzurufen, hatte ich stattdessen void spi_init(); da stehen, also eine lokale Redefinition(?) der Methode? Ohne das setzen aller PINS und Register geht natürlich gar nichts...
Ich habe den Fehler gefunden. Es war tatsächlich was ganz anderes und
unglaublich dämliches
Also 2 Fehler. Ohne Korrektur der Bits hätte es immer noch nicht funktioniert. Beim nächsten Mal kompletten reduzierten Code zeigen, der das noch Problem zeigt. Dann gibt es kein Rätselraten.