SPI Atmega16M1

Gast #4641315
Lesenswert?
• ▲
▼
Hallo,

ich habe Problem mit SPI. Es hat vor ein paar Tagen noch funktioniert, 
nun geht aber nichts mehr. Wenn ich 8Bit senden will, wird nichts 
gesendet (Mit LogicAna und Oszi getestet) und der MCU bleibt in der 
while schleife.

Hier der Code:
1
void SPI_INIT(void) {
2
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);      // SPI ENABLE, Master
3
  DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB7);     // CLK, MOSI und MISO als Ausgang
4
}
5

6

7

8
uint8_t SPI_Transfer(uint8_t sByte)
9
{
10
   SPDR = sByte;
11
   while(!(SPSR & (1<<SPIF)));
12
   return SPDR;
13
}


Zuerst habe ich versucht es wieder mit gesamtem Code zum laufen zu 
bekommen. Dann hab ich alles außer der SPI_INIT() und einem aufruf in 
der while(1) von SPI_Transfer(0x01); versucht. (Aktueller Stand)

1
#include ....
2

3

4
int main(void) {
5

6
SPI_INIT();
7

8
while(1) {
9
  PORTC &= ~(1 << PC5);
10
  SPI_Transfer(0b00000101);
11
  PORTC |=  1 << PC5;
12
}
13
  return(0);
14
}

Erkennt jemand einen Fehler in der SPI_INIT? die Transfer Funktion 
sollte so auf jeden fall in Ordnung sein... (ist kopiert)

Kann es sein, dass beim compilieren irgendwas weg optimiert wird? 
Aktuell nutze ich als Parameter -Os (gcc version 5.3.0 (GCC)) unter Arch 
Linux und als IDE CodeBlocks die aktuelle Version.

Hab das ganze auch auf einem andern Atmega64M1 laufen lassen, selbe 
Ergebnis.
(Firma: Vescomp) #4641330
Lesenswert?
• ▲
▼
AVRe schrieb:
> PORTC &= ~(1 << PC5);

 Als Ausgang gesetzt ?
 DDRC |= (1<<PC5);

 Normal ist doch PortB.4, also:
 DDRB |= (1<<PB4);
 und dann:
 PORTB &= ~(1 << PB4);

 Auch:
1
   DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB7);     // CLK, MOSI und MISO als Ausgang

Sollte sein:
1
   DDRB = (1<<DDB4) | (1 << DDB5) | (1 << DDB7);     // SS, CLK, MOSI als Ausgang
Gast #4641358
Lesenswert?
• ▲
▼
Marc V. schrieb:
>> PORTC &= ~(1 << PC5);
>
>  Als Ausgang gesetzt ?
>  DDRC |= (1<<PC5);
>
>  Normal ist doch PortB.4, also:
>  DDRB |= (1<<PB4);
>  und dann:
>  PORTB &= ~(1 << PB4);

Normal vielleicht nicht in dem Sinne, dass man den SS Pin auch wirklich 
als Chip-Select benutzen muss.
Aber der sollte schon tunlichst auf Ausgang stehen, egal welchen Pin man 
für das Chip-Select benutzt.

MISO und SCK werden sowieso automatisch konfiguriert wenn man den SPI 
als Master benutzt.
MOSI kann man als Ausgang setzen, muss man aber nicht.
Gast #4641380
Lesenswert?
• ▲
▼
Marc V. schrieb:
> Auch:   DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB7);     // CLK,
> MOSI und MISO als Ausgang
>
> Sollte sein:   DDRB = (1<<DDB4) | (1 << DDB5) | (1 << DDB7);     // SS,
> CLK, MOSI als Ausgang

Ich glaube du bist beim falschen MCU. Es geht um den M1 und nicht den 
ohne :)


Ich habe nun:
1
                // SCK          MOSI        MISO
2
  DDRB = (1 << DDB7) | (1 << DDB1) | (1 << PB0);
3
  DDRD = (1 << DDD3); // SS

Funktioniert aber weiterhin nicht...
#4641413
Lesenswert?
• ▲
▼
Wenn PC5 als Chip-Select verwendet werden soll fehlt da auch noch:
DDRC |= (1 << PC5);

Boah, und beim drüber schauen über die Pins fällt mir wieder mal die 
unsägliche Belegung von dem Mega16M1 auf.
Ich mag das Ding ja als kleinen Controller für CAN und/oder LIN und da 
stecken auch unheimlich viele Neuerungen in dem kleinen Gehäuse.

Aber das Pinout? Ich frage mich echt, warum der Kunde der die Dinger 
haben wollte denen das nicht um die Ohren gehauen hat.
Gast #4641434
Lesenswert?
• ▲
▼
>void SPI_INIT(void) {
>  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);      // SPI ENABLE, Master
>  DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB7);     // CLK, MOSI und >MISO als 
Ausgang
>}

Vertausche die beiden Zeilen mal:
1
void SPI_INIT(void) {
2
  DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB7);     // CLK, MOSI und MISO als Ausgang
3
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);      // SPI ENABLE, Master
4
}
Gast #4642192
Lesenswert?
• ▲
▼
Du meinst so:
1
void SPI_INIT(void) {
2

3
  DDRD = (1 << DDD3); // SS
4

5
                // SCK          MOSI        MISO
6
  DDRB = (1 << DDB7) | (1 << DDB1) | (1 << PB0);
7

8
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);      // SPI ENABLE, Master
9
}

Funktioniert leider weiterhin nicht...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.