Problem bei SPI Datenübertragung

#3928658
Lesenswert?

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
}
#3928731
Lesenswert?

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.
#3928806
Lesenswert?

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 #3928860
Lesenswert?

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.
#3929114
Lesenswert?

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 #3929912
Lesenswert?

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
#3929930
Lesenswert?

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.

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