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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.