Atmega168pb bleibt bei spi konfiguration hängen

Gast #6378183
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
}
Gast #6378231
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:)
Gast #6378239
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 :)
#6378313
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren