Problem bei SPI Datenübertragung

OP #3928658
Hallo,
Ich versuche ein paar Daten per SPI zu übertragen und kann leider kein 
Signal am MOSI messen. Ich verwende einen AT90PWM316 als Controler!

Kann mir bitte jemand weiter helfen?

Hier mein Code:
1
/********************************************************
2
* SPI-Master - Datenübertragung                      *
3
* Übertragung zweier 8-Bit Daten (11010010 und 10000001)*
4
* Prozessor:     AT90PWM316                          *
5
* Clock:      Osz. 8MHz intern                    *
6
********************************************************/
7

8
#include <avr/io.h>
9
#include <util/delay.h>
10

11
void SPI_Master_Init(void)
12
{
13
  SPCR &=    ~(1<<DORD);   // Send MSB first
14
  SPCR |=    (1<<MSTR);    // Controller = Master
15
  SPCR &=    ~(1<<CPOL);  // CLK positiv phase
16
  SPCR |=    (1<<CPHA);    // Sampling data @ rising edge
17
  SPCR |=    (1<<SPR1);    // CLK / 64 = 125kHz
18

19
  DDRB |=    (1<<PB1);    // Set MOSI output
20
  DDRB &=    ~(1<<PB0);    // Set MISO input
21
  DDRB |=    (1<<PB7);    // Set SCK output
22
  DDRD |=    (1<<PD3);    // Set SS output
23

24
  SPCR |=    (1<<SPE);    // SPI enable
25
}
26

27
void SPI_Master_Transmit(char cData)
28
{
29
  PORTD &=   ~(1<<PD3);        // SS = low (Slave = enabled)
30
  SPDR = cData;              // Start transmission
31
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
32
  PORTD |= (1<<PD3);          // SS = high (Slave = disabled)
33
}
34

35

36
int main(void)
37
{
38
  SPI_Master_Init();
39

40
  while(1)
41
  {
42
    SPI_Master_Transmit(0b11010010);
43
    _delay_ms(500);           // delaytime between next transmission
44
    SPI_Master_Transmit(0b10000001);
45
    _delay_ms(500);          // delaytime between next transmission
46
  }
47
}
Gast
>Dann guck dir im Datenblatt die Funktion des SPIPS-Bits im
>MCUCR-Register an. Dieses Bit muss in der 24-Pin-Version bei deiner
>Konfiguration gesetzt werden.

Das sehe ich anders;)
holger schrieb:
> Das sehe ich anders

Und?

"On 24 pins package, SPIPS has the following action:
– When the SPIPS bit is written to zero, the SPI signals are directed on 
alternate SPI
pins, MISO_A, MOSI_A, SCK_A and SS_A.
Bit 7 6 5 4 3 2 1 0
SPIPS – – PUD – – IVSEL IVCE MCUCR
Read/Write R/W R R R/W R R R/W R/W
Initial Value 0 0 0 0 0 0 0 0
178
7710A–AVR–03/07
AT90PWM216/316
– When the SPIPS bit is written to one,the SPI signals are directed on 
pins
MISO,MOSI, SCK and SS."

mfg.
m. g. schrieb:
> void SPI_Master_Transmit(char cData)
> {
>   PORTD &=   ~(1<<PD3);        // SS = low (Slave = enabled)
>   SPDR = cData;              // Start transmission
>   while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
>   PORTD |= (1<<PD3);          // SS = high (Slave = disabled)
> }

Wieso schaltest du auf Slave bevor du sendest?

mfg.
OP
Thomas Eckmann schrieb:
> m. g. schrieb:
>> void SPI_Master_Transmit(char cData)
>> {
>>   PORTD &=   ~(1<<PD3);        // SS = low (Slave = enabled)
>>   SPDR = cData;              // Start transmission
>>   while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
>>   PORTD |= (1<<PD3);          // SS = high (Slave = disabled)
>> }
>
> Wieso schaltest du auf Slave bevor du sendest?
>
> mfg.

Ist für einen angedachten SPI-Baustein. Hier muss ich zuerst SS auf low 
setzen. Wobei das in diesem Fall für die Übertragung egal ist!
Gast
m. g. schrieb:
> Wobei das in diesem Fall für die Übertragung egal ist!

Wenn ein Controller auf Slave gesetzt ist wird er keinen
Clock generieren da dieser vom Master ausgehen muss.
Im Slave Modus wartet er darauf dass Clock Flanken daherkommen
und er seine einzelnen DatenBits dazu generieren/ausgeben kann.

Das Schreiben

SPDR = cData;

lädt also nur das Datenregister, und sonst nichts.
OP
Ich habe mit dem Oszi (Tektronix 100MHz) eine Vergleichsmessung an einem 
anderen UC gemacht. Hier kann ich den Datenverkehr am MOSI gut messen. 
Also am Oszi liegt es nicht!

Anbei die Registereinstellungen unmittelbar nach der SPI 
Initialisierung.

Der UC arbeitet sonst ganz normal. Ich glaube hier nicht an einen 
hardwareseitigen Fehler der SPI-Schnittstelle.
Angehängte Dateien:
Gast
Muss ich also selbst nachsehen, welcher PIN PORTD3 ist.
Nochmal: ist das der SS-Pin deines SPI Interfaces? wenn ja, dann ist das 
falsch. Das darfst Du nicht auf LOW ziehen, weil sonst dein Atmel als 
Slave geschaltet wird. Nimm einen anderen PIN und sieh zu, dass der 
SS-PIN deines SPI interfaces immer auf H-Pegel steht. SONST GEHT DAS 
NICHT!. Dein Atmel erwartet sonst von aussen auf der CLK-leitung einene 
Takt und taktet synchron zudiesem takt seine Daten raus.
Am MOSI kommt nichts raus, sagst Du.
KOmmt am SCK was raus?
Wenn am SCK nichts raus kommt, lege dort mal 100Khz oder so an.
Dann müsstest Du deine Daten aus dem Datenregister sehen.

Axel
Axel R. schrieb:
> Muss ich also selbst nachsehen, welcher PIN PORTD3 ist.
> Nochmal: ist das der SS-Pin deines SPI Interfaces? wenn ja, dann ist das
> falsch. Das darfst Du nicht auf LOW ziehen, weil sonst dein Atmel als
> Slave geschaltet wird.

Seit wann?

Nochmal: Die SPI Einheit ist als Master konfiguriert!
Der Zustand des SS Pins, ob 0 oder 1, spielt dazu keine Rolle, solange 
er nur als Ausgang konfguriert ist. Und das ist er.

Und ja. PD3 ist der zur SPI gehörende SS.
Gast
Ok, wenn das SO ist, habe ich nichts gesagt.
Mir war so, als wenn der SlaveSelcet-PIN den Atmel als Slave schaltet, 
wenn der auf LoW geht.
OK - höre weiter zu:)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.