Forum: Mikrocontroller und Digitale Elektronik SPI immer gleiche Signal am MISO


von SPI Master (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein Problem:   Egal was ich im Slaveprogramm auf SPIDAT 
schreibe es liegt immer das selbe Signal an Miso an und zwar wie auf dem 
Bild


MISO
SCLK
SS

sind in dieser Reihenfolge auf dem Oszilloskope Bild zu sehen vielleicht 
weiß jemand einen guten Rat


MFG   Danke

von SPI Master (Gast)


Lesenswert?

Nach dem empfangen schreibe ich die daten vom Master direkt auf ein 
array und kopiere dannach die Slavedaten auf SPIDAT


-----------------------------------------------------------
char daten;
char daten_aus = 0xF2;


void SPIINTERRUPT () interrupt 7
{
  ISPI = 0;

      daten = SPIDAT;                            SPIDAT = daten_aus; 
fertig = 1;




}


Bitte um dringende Hilfe

von Falk B. (falk)


Lesenswert?

@ SPI Master (Gast)

>Dateianhang: MISO.JPG (165,5 KB, 5 Downloads)

Bildformate

>Ich habe ein Problem:   Egal was ich im Slaveprogramm auf SPIDAT
>schreibe es liegt immer das selbe Signal an Miso an und zwar wie auf dem
>Bild

>Nach dem empfangen schreibe ich die daten vom Master direkt auf ein
>array und kopiere dannach die Slavedaten auf SPIDAT

Welcher Controller?

Netiquette

MfG
Falk

von SPI Master (Gast)


Lesenswert?

ADUC 831    mit 8051 Kern

von SPI Master (Gast)


Lesenswert?

Es funktioniert DANKE trotzdem

von spi slave (Gast)


Lesenswert?

zeig mal den slave code.
lass den slave immer das selbe byte ausgeben, z.b. 0x55, 0x81 etc. dann 
guck, was das oszi anzeigt.

von SPI Master (Gast)


Lesenswert?

DAs Mach ich es funktioniert doch noch nicht;

es ist nur noch die serielle routine dabei, da ich etwas über rs232 
einlese







/****         Angabe der Include Dateien               ****/

#include <ADUC831.H>
#include <stdio.h>
#include <string.h>
#include "LCD_DOGM_SPI.h"



//Globale Variablen//

char c, buffer [21] , empfangswort[10]="AAAAA", sendewort[10];
char daten;
char daten_aus = 0xAB;
char buf[6];
bit fertig = 0;


char  empf[10];    // Hier wird ein Stringarray definiert (zum empfangen 
von ganzen Wörtern),(10 Stellen)

int
    empfzeiger=0,   //Definieren eines Zeigers, der später weiß, wie 
viele Buchstaben das empfangene Wort hat
    empfangen=0,   // Empfangsflag auf Null setzen
    zeitschicken=0,
    i=0;





void ini_ser1()    // Initialisierung der seriellen Schnittstelle 1
{
  T3CON = 0x085;  T3FD = 0x08;  SCON   = 0x052;  //Baudratengenerierung 
auf Seiten 56-58 im ADUC831.pdf
}



void RS232() interrupt 4  //siehe Seite 60 bei RI und dann erhält man 
mit (23-3)/8 die Interruptnummer 4
             //  beim calc achten, dass auf hex eingestellt ist
{

if (RI)
{

  empf[empfzeiger]=SBUF;//Hier werden nacheinander alle 8 bit aus dem 
Empfangsbuffer auf den string empf geschrieben (Seite 55)
  empfzeiger=empfzeiger+1;
  // Rücksetzzeiger wird erhöht
  if (empfzeiger == 5 )  // Solange nicht alle 5 Zeichen (Zeit) 
empfangen wurden wird dieser erhöht

  {
    empf[empfzeiger]='\0';
    strcpy(empfangswort, empf);  //steht der Empfangszeiger auf 5 dh, 
wurden alle 5 bytes empfangen wird der empf string auf
    empfzeiger=0;
    empfangen=1;        //das empfangswort kopiert und ist nun für 
Georg's Modul abholbar

  }

RI=0;       // RI mit der Resetmaske rücksetzen
}
}

/*
void SPIINTERRUPT () interrupt 7
{

  if(SPIDAT==0xA2 && zeitschicken==0)
  {
    print_lcd(1,1,"empfangen");
    i=0;
    zeitschicken=1;
    strcpy(sendewort, empfangswort);
    SPIDAT = sendewort[1+i];
    i++;
  }

  if (zeitschicken==1)
  {
    SPIDAT = sendewort[1+i];
    i++;

    if(i==5)
    {
      zeitschicken=0;
    }

  }
}

*/



void SPIINTERRUPT () interrupt 7
{
  ISPI = 0;

      daten = SPIDAT;            // SPI_Daten auf daten schreiben
      SPIDAT = daten_aus;        // Slave Daten auf SPIDAT schicken um 
zu senden
      fertig = 1;
    //  sprintf(buffer,"%x",daten);
    //  print_lcd(2,1,buffer);



}


main()
{

  P1 = 0xFF;
  SPICON= 0x23;       // Konfiguration SLAVE SPI
  init_lcd();      // LCD initialisieren
  blank_lcd();    // LCD Bildschirm löschen
  ini_ser1();      // Serielle Schnittstelle 1 initialisieren
  fertig = 0;


  ES=1;         // UART Serial Port Interrupt  Enable
  IEIP2 = IEIP2|0x01;  //für SPI Schnittstelle (Interrupt Enable)
  EX0=1;         //Enable External Interrupt von GPS Modul
  EA = 1;           // Befehl dass Interupts allgemein erlaubt werden
  empf[0]='\0';
  empfangswort[0]='\0';


  while(1)
  {

    if(fertig)
    {
    //  sprintf(buf,"%d",i);
    //  print_lcd(2,6,buf);
      i++;
    //  daten_aus = daten_aus + 1;
    //  print_lcd(1,1,"empfangen");

      fertig = 0;

    }
    if(empfangen)      //Prüfen ob etwas empfangen wurde
    {
    empfangen=0;
    }
}

}

von SPI Master (Gast)


Lesenswert?

Bin gerade draufgekommen, dass  das er die ersten 4 BIT des Bytes immer 
richtig schickt aber die zweiten 4 ist immer high.

von SPI Master (Gast)


Lesenswert?

und wenn ich mit dem Tastkopf die SS leitung abgreife bekommt er die 
daten richtig


was ist da los?


Wer weiß eine Antwort

DANKE für eure Hilfe

von Falk B. (falk)


Lesenswert?

@ SPI Master (Gast)

>und wenn ich mit dem Tastkopf die SS leitung abgreife bekommt er die
>daten richtig
>was ist da los?

Vielleicht gibt es da ein ähnliches Verhalten wie beim AVR. Dort muss 
SS am Master auf Ausgang stehen und beim Slave auf Eingang.

MFG
Falk

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.