Schieberegister mit SPI

Gast #4146285
Lesenswert?

Hallo ihr,

ich versuche gerade die ersten Schritte in Richtung LED-Matrix zu 
machen. Jedoch scheitere ich schon bei den Grundlagen.

Ich will lediglich ein Bitmuster per Hardware SPI-Modul meines Atmega 
328P an ein 74HC595 Schieberegister senden.

Was passiert ist jedoch, dass ich an keinem Ausgang des Schieberegisters 
einen High Pegel feststellen kann. Lediglich der MOSI Pin des AVR hat 
ständig 5V(Was ja eigentlich auch nicht sein sollte). Gemessen mit 
meinem Multimeter, da ich nur ein analoges Oszi habe.

Bin total ratlos wo der Fehler liegt. Ich habe die Schaltung schon auf 
zwei verschiedenen Breadboards und mit zwei Verschiedenen Registern 
getestet, jedoch mit dem gleichen Ergebnis.

Ich häng hier mal meinen Code an, wäre toll wenn jemandem ein Fehler 
auffällt.


Danke schonmal!! :)

1
 
2
#include <avr/io.h>
3

4
#define F_CPU 16000000UL
5

6
#define output_DDR DDRB
7
#define output_port PORTB
8

9
#define data_pin PB3
10
#define clock PB5
11
#define latch PB2
12

13
void output_init(void){
14
  output_DDR |= ((1<<data_pin) | (1<<clock) | (1<<latch));
15
  //Pins als Ausgang und Low schalten  
16
  output_port &= ~((1<<data_pin) | (1<<clock) | (1<<latch));
17
}
18

19
void SPI_init(void){
20
  SPCR = (1<<SPE) | (1<<MSTR);
21
  //SPI in Master Mode aktivieren
22
}
23

24
int main(void)
25
{
26
  output_init();
27
  SPI_init();
28
  //output_port &= ~(1<<latch); //Latch low ziehen um SPI Kommunikation zu starten
29
  SPDR=0b10101010;      //Daten an Schiebereister senden
30
  while(!(SPSR & (1<<SPIF)));  //Warten bis Übertragung beendet ist
31
  
32
  output_port |= (1<<latch);
33
  output_port &= ~(1<<latch);  //Latch togglen um Daten auf Ausgänge zu übernehmen
34
  
35
    while(1)
36
    {
37
    }
38
}
Gast #4146411
Lesenswert?

uwe schrieb:
> Du mußt noch den richtigen SPI modus einstellen mit CPHA und CPOL
> im
> SPCR Register.

Hallo,
danke schonmal. Aber von Haus aus müsste CPHA, sowie CPOL auf 0 sein, 
das bedeutet Clock ist 0 im Ruhezustand und es wird auf die steigende 
Flanke gesampelt. Also genau so wie ich es möchte. Oder hab ich da jetzt 
einen Denkfehler?

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