Forum: Mikrocontroller und Digitale Elektronik Atmega168pb bleibt bei spi konfiguration hängen


von spi (Gast)


Lesenswert?

Hallo,
Ich bin am zweifeln :(
Ich habe einen AtMega168pb und wollte einen SPI Master initialisieren.
Scheint eigentlich keine große sache zu sein ..

Das Datenblatt sagt:
- Konfiguriere als Output MOSI, SCK und SS (SS wird nicht automatisch 
gesetzt)
- Setze SS auf High
- MISO -> Input

Sobald ich SPE in SPCR auf 1 setze bleibt der Controller hängen?!
Was läuft flasch?
1
#define F_CPU 16000000UL
2
3
#define BAUD 9600
4
#define MYUBRR F_CPU/16/BAUD-1
5
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <util/delay.h>
9
10
//#include "uart.h"
11
#include "spi.h"
12
13
#define PIN_LED PB5 
14
#define PIN_BTN PB7 
15
16
17
18
int main (void) {
19
  ui8 pb7 = 0;
20
  
21
  DDRB |= (1 << PIN_LED);
22
  DDRB &= ~(1 << PIN_BTN);
23
24
  //uart_init(MYUBRR);
25
  
26
  cli();
27
  spi_ma_init();
28
29
30
  while(1) {
31
    PORTB |= (1 << PIN_LED);
32
    _delay_ms(250);
33
    PORTB &= ~(1 << PIN_LED);
34
    _delay_ms(250);
35
    //spi_ma_tx((ui8*)"H",1);
36
    
37
  }
38
39
  return 0;
40
}
1
#include "spi.h"
2
3
#include <avr/io.h>
4
5
#define PIN_MOSI   PB4
6
#define PIN_MISO   PB3
7
#define PIN_SS     PB2
8
#define PIN_SCK   PB5
9
10
11
void spi_ma_init() {  
12
  DDRB |= (1<<PIN_MOSI)|(1<<PIN_SCK)|(1<<PIN_SS);
13
  DDRB &= ~(1<<PIN_MISO);
14
  PORTB |= (1<<PIN_SS);
15
  SPCR = (1<<MSTR)|(1<<SPE);
16
}

von H.Joachim S. (crazyhorse)


Lesenswert?

spi schrieb:
> #define PIN_MOSI   PB4
> #define PIN_MISO   PB3

das ist schon mal vertauscht

von spi (Gast)


Lesenswert?

Hallo Holger ja stimmt, die sind sogar noch verdreht.
Aber das eigentliche problem weshalb es hing war der pin SS.
- SS muss input sein aber pull-up an!
und ich hatte SS zu output und high.. klingt zwar logisch ist aber 
nichtdas was im datenblatt steht:)

von S. Landolt (Gast)


Lesenswert?

> ... bleibt ... hängen

Wie wird das festgestellt, wenn in der Hauptschleife nur die LED blinken 
soll, bei

> #define PIN_LED PB5
> #define PIN_SCK   PB5

?

von spi (Gast)


Lesenswert?

Ja das ist nicht eindeutig aber ich habe vorher herum probiert und der 
Controller ist eben bei der stelle "SPCR = (1<<MSTR)|(1<<SPE);" hängen 
geblieben. Als ich das Flag SPE entfernt hatte blinke die leds :)

von spi (Gast)


Lesenswert?

Ich nehme an das das SPI dann "ohne das man es möchte" in den slave mode 
übergeht.

von holger (Gast)


Lesenswert?

#define PIN_LED PB5
#define PIN_SCK   PB5

Wenn du das SPI einschaltest übernimmt es den Pin PB5 und die LED blinkt 
nicht mehr.

von Christian S. (roehrenvorheizer)


Lesenswert?

Immer wieder das selbe Spiel:


https://www.mikrocontroller.net/articles/Serial_Peripheral_Interface

Falle bei AVR Prozessoren[Bearbeiten]

Bei den AVR-Prozessoren, welche eine SPI Einheit besitzen, ist es 
zwingend nötig, den SS-Pin der SPI Einheit auf Ausgang zu setzen, wenn 
man den Prozessor als Master benutzen möchte. Dies geschieht nicht 
automatisch, da ein auf Eingang geschalteter Pin im Multimaster Modus 
benötigt wird. Da dieser Fall aber recht selten vorkommt, wird er hier 
ignoriert. Schaltet man den Pin nicht auf Ausgang, dann hängt es vom 
extern angelegten Pegel ab, ob die Master-SPI Einheit arbeitet oder 
nicht. Daher muss man den Pin immer vorher auf Ausgang schalten. In 
diesem Fall ist der Pegel der SS Leitung dann irrelevant, die SPI 
Einheit arbeitet immer, sobald sie als Master konfiguriert wurde.

Mfg

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.