Forum: Mikrocontroller und Digitale Elektronik SPI kein clock


von Peter P. (jre)


Lesenswert?

Hallo

Bei unserer SPI Komunikation wird vom Master kein Clock generiert (mit 
Ozcilloskope gemessen).

Auf dem Mosi sind die Flankenwechsel der 01 folge deutlich zu erkennen.

Die Inhalte der Einstellungsregister haben wir uns per USART an einen PC 
gesendet und kontrolliert.

Die Hardware haben wir getestet, indem wir jede Sekunde den SCK Pin 
invertiert haben. (Vorher wurde die SPI init und so natürlich 
deaktiviert)
Die Wechsel der Pegel sind auf dem Ozci zu sehen.

Im Normalen SPI Modus ist SCK dauer high
1
#define DD_CS   PB4
2
#define DD_MOSI    PB5
3
#define DD_MISO   PB6
4
#define DD_SCK     PB7
5
#define DDR_SPI    DDRB
6
#define PORT_SPI   PORTB
7
8
void SPI_MasterInit()
9
{
10
  USART_send_Byte(0x22);
11
  // Set MOSI,CS and SCK output, all others input
12
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);
13
  PORT_SPI = (0<<DD_MOSI)|(0<<DD_SCK)|(0<<DD_CS);
14
  LTC6802_set_cs();
15
  //Enable SPI, Master, set clock rate fck/16
16
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA)|(1<<CPOL);
17
  _delay_ms(10);
18
}
19
20
void LTC6802_set_cs()
21
{
22
  PORT_SPI |= (1<<DD_CS);
23
}
24
25
void LTC6802_clear_cs()
26
{
27
  PORT_SPI &= ~(1<<DD_CS);
28
}
29
30
void LTC6802_transmit(uint8_t cData)
31
{
32
  // Start transmission 
33
  LTC6802_clear_cs();
34
  USART_send_Byte(0x23);
35
  SPDR = cData;
36
  // Wait for transmission complete 
37
  while(!(SPSR & (1<<SPIF)))
38
  LTC6802_set_cs();
39
}
1
int main (void)
2
{  
3
  _delay_ms(1000);
4
  USART_init();
5
  _delay_ms(20);
6
  USART_send_Byte(0x11);
7
  SPI_MasterInit();
8
  /* //SCK Test
9
  DDRB = 0xFF;
10
  PORTB = (1<<PB7);
11
  */
12
  _delay_ms(3000);
13
  //LTC_init(Cellcount);
14
  //sei();
15
16
  while(running)
17
  {  
18
    _delay_ms(4000);
19
    USART_send_Byte(0x44);
20
    LTC6802_transmit(0b10101010);
21
  
22
    /* //SCK Test
23
    PORTB = (1<<PB7);
24
    _delay_ms(1000);
25
    PORTB &= ~(1<<PB7);
26
    _delay_ms(1000);
27
    */  
28
29
  }
30
  return 0;
31
}

Es ist noch zu sagen, dass SPIF Flag erfolgreich kommt.

Kann uns jemand helfen? Danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jan Remmert schrieb:

>   // Wait for transmission complete
>   while(!(SPSR & (1<<SPIF)))
>   LTC6802_set_cs();

"So lange, wie das SPIF nicht gesetzt ist, schalte bitte immer wieder
das CS inaktiv."

von Markus C. (ljmarkus)


Lesenswert?

PORT_SPI = (0<<DD_MOSI)|(0<<DD_SCK)|(0<<DD_CS);

naja, das ist nicht schön....

von Falk B. (falk)


Lesenswert?

@  Markus C. (ljmarkus)

>PORT_SPI = (0<<DD_MOSI)|(0<<DD_SCK)|(0<<DD_CS);

>naja, das ist nicht schön....

Klar, ne Nullrunde schieben, wegen Sparpaket ;-)

von Martin M. (capiman)


Lesenswert?

@Jan Remmert
Irgendwie vermisse ich auch den Prozessor,
auf dem das ganze laufen soll.
Wie sind denn PB4 bis PB7 definiert ?

von Peter P. (jre)


Lesenswert?

Die "Nullrunde" habe ich auch nur in meiner Verzweifelung aus einem Code 
im Forum Kopiert. Das kann man sich auch sparen, da eh Null drin steht.

Das ganze soll auf einem ATmega32 @ 8 MHz laufen. Bei dem sind die Pins 
natürlich entsprechend der definition belegt.

von holger (Gast)


Lesenswert?

>Bei unserer SPI Komunikation wird vom Master kein Clock generiert (mit
>Ozcilloskope gemessen).

Lern erstmal mit nem Osci messen. Wenn ich die unbekannten UART
Routinen rausschmeisse kommt bei deinem Programm ein
Signal bei SCLK raus. Trigger mal auf negative Flanke.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hast du denn nun mal das fehlende Semikolon nachgereicht?

von Peter P. (jre)


Lesenswert?

Danke für die Antworten. Wo fehlt denn ein Semikokon?. AVR-Studio 
Meckert nicht. Das Osci ist ein ziemlich gutes Digitales von der FH. Die 
Signale auf Mosi konnte ich auch wunderbar erkennen. Auch im Run Modus. 
waren die Peaks kurz zu erkennen.

Wenn das Programm bei dir geht dann ist uns ja schonmal sehr geholfen.
Als erstes werde ich dann morgen den ATMega mal auswechseln.
Da der Pegelwechsel auf SCK ja deutlich zu messen ist, wenn man SCK als 
Ausgang verwendet und hin und her schaltet gehe ich mal davon aus, dass 
auf dem Board jedenfalls nichts ist was den Pegel heigh hält.

Kann eigendlich der Programmer die SPI Komunikation stören?
Habe schon versucht was ist, wenn man den abmacht aber selbst dann ist 
kein Signal auf SCK.

Gibt es vieleicht irgendwelche Fuse Bits die ich ändern muss?

von Stefan (Gast)


Lesenswert?

Hallo,

das fehlende Semikolon gehört hinter die while-Schleife!

1
  SPDR = cData;
2
  // Wait for transmission complete 
3
  while(!(SPSR & (1<<SPIF)));
4
  LTC6802_set_cs();

Gruß
Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.