PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : spi mit avr



11udo11
05.08.2013, 11:38
Hallo,

wenn ein Byte in das Register SPDR geschrieben wird, dann beginnt automatisch die Übertragung an den Slave. Der SHIFT-Takt wird vom AVR selber generiert.

MEGA8

Meine Frage:


void spi_shift(uint8_t data1)
{
SPDR = data1; //=== Start transmission

while(!(SPSR & (1<<SPIF))); // warten, bis Übertragung zu Ende ist

PORTB=1<<PB2; // Store
}

Generiert der AVR den /SS PIN ebenfalls eigenständig? Auf dem Oszilloskope kann ich kein LOW am PIN /SS sehen.

In meinem Programm, welches funktioniert, ist der PIN /SS nicht auf LOW gesetzt, sondern hat permanent HIGH-Pegel laut Oszilloskop.

markusj
05.08.2013, 12:41
Generiert der AVR den /SS PIN ebenfalls eigenständig?

Nein. Das macht auch relativ wenig Sinn, da am AVR ja mehrere verschiedene Slaves angeschlossen sein können. Du musst die entsprechende Leitung schon selbst ansteuern. Wenn du ihn als Ausgang benutzt, ist das in Ordnung, aber wenn du ihn als Eingang benutzt und das Eingangssignal Low ist, bricht die SPI-Übertragung ab (Bus-Kollision!)

Grüße,
Markus

11udo11
05.08.2013, 13:50
Danke Markus für Deine Antwort.

Aber es bleibt dennoch eine Unklarheit im Raum:

Ich habe nirgendwo den /SS auf LOW gesetzt. Warum funktioniert mein Programm? Alle Werte, die ich vom MEGA8 auf die beiden 74HCT595 schicke, werden bitgenau angezeigt. Immer!

Jemand muss doch den /SS auf LOW setzen, damit der 74HCT595 die Ausgänge freigeben, oder?

Hier mein kleiners Testprogramm, OHNE LOW für /SS!!




// SPI mit 74HCT595 2 Bytes an 2 ICs 74HCT595

#define F_CPU 12000000UL
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t data1=3, data2=3, count;


//################################################## ##########################
void spi_shift(uint8_t data1, uint8_t data2)
{

SPDR = data1; //=== Start transmission

while(!(SPSR & (1<<SPIF))); // warten, bis Übertragung zuende ist

SPDR=data2;

while(!(SPSR & (1<<SPIF))); // warten, bis Übertragung zuende ist

PORTB=1<<PB2;// Store


}
//################################################## ##########################

void HC595Init()
{
DDRB = (1<<DDB2)|(1<<DDB3)|(1<<DDB5); // DDB2 ist SS DDB3 ist MOSI, DDB5 ist SCK

SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR0);// enable | master | CPHA | 1/16clk

}
//################################################## ##########################

int main(void)
{
HC595Init();
while(1)
{
spi_shift(data1,data2);
}
}

Klebwax
05.08.2013, 14:06
Jemand muss doch den /SS auf LOW setzen, damit der 74HCT595 die Ausgänge freigeben, oder?

Ein 595 hat keinen Pin mit Namen /SS

MfG Klebwax

11udo11
05.08.2013, 14:16
Natürlich ist der PIN am Mega8 gemeint, der mit dem RLCK (12) verbunden ist!

Klebwax
05.08.2013, 14:31
Was zeigt denn das Scope an Pin 12 vom 595?

MfG Klebwax

11udo11
05.08.2013, 15:03
Das Oszilloskop zeigt an PB2(/SS) und RLCK das gleiche Signal.

Der /SS ist ein Slave Select und der RLCK ist ein Store. Der RLCK entspricht doch in seiner Funktion einem Chipselect. Oder liege ich daneben?

Klebwax
05.08.2013, 15:24
Das Oszilloskop zeigt an PB2(/SS) und RLCK das gleiche Signal.

Und wie sieht es aus?

MfG Klebwax

11udo11
05.08.2013, 15:41
Es zeigt ein Dauer-HIGH.

Habe allerdings erfahren, dass der Pegel an PIN /CSS vollkommen egal ist, wenn der MEGA als Master definiert ist. Verstehe ich nicht ganz, wer dann den Chip selektiert. Wird wohl dann doch vom Mega erledigt. Ich weiss es einfach nicht. Habe nicht so viel Erfahrung, dass ich die Vorgänge im System nachvollziehen kann.

Klebwax
05.08.2013, 16:07
Es zeigt ein Dauer-HIGH

Das ist merkwürdig. Nach meinem Datenblatt (bei dem das Signal an Pin 12 STCP heißt) wird dort eine Flanke von Low nach High benötigt, damit sich die Ausgänge ändern.
26163
Da du aber wechselnde Bitmuster an den Ausgängen des 595 erhälst, stimmt da etwas mit dem Chip nicht.

MfG Klebwax

markusj
06.08.2013, 08:34
Wird wohl dann doch vom Mega erledigt.Definitiv nicht. Was der Mega tut steht im Datenblatt. Und das beschränkt sich auf SCK, SDI und SDO. CS wird nicht angesteuert, nur ausgewertet.

Grüße,
Markus