SPI Read
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  Schnittstellen (Allgemein)  |  SPI Read « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: SPI Read  (Gelesen 1031 mal)
 
AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« am: September 15, 2011, 15:38:40 »

Hallo,
ich verwende eine PIC32MX460.
Mit diesem möchte ich ein serielles SRam (23K256) nutzen.
Beim Beschreiben kann ich mit dem Scope den Clock und die Daten sehen.
Versuche ich nun aber zu lesen wird kein Clock erzeugt und somit kommen auch keine Daten rein.
Um das Problem zu untersuchen verwende ich nun folgenden Code:
Code:
void Spi1Init(void)

{

unsigned int config = SPI_CON_MODE8|SPI_CON_SMP|SPI_CON_ON|SPI_CON_MSTEN;

      //SPI1    

      //AD25 und SRAM

      SpiChnOpen(1, config, 4);

}

 

void TestSpi1(void)

{

      unsigned int test1=0xaa;

      unsigned int test2=0x00;

      SpiChnPutS(1,&test1,1);

      SpiChnGetS(1,&test2,1);

}

Bei diesem Test ist es das selbe, schreiben wie erwartet und beim lesen kein Clock.
Kann mir Jemand weiter helfen?

Gruß Robert
« Letzte Änderung: September 19, 2011, 16:19:24 von AnyKey » Gespeichert
AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« Antworten #1 am: September 16, 2011, 16:23:02 »

OK, das war wohl ein verständniss Fehler meiner seits. Verlegen
Das befüllen des Rx Buffers erfolgt zeitgleich mit dem senden des Tx Buffers.
Ist das so korrekt?

Wenn Ja, dann muß man vor jedem Read Vorgang einen Write schalten.
Um das zu testen habe ich folgenden Code:

Code:
void Spi1Init(void)
{
    unsigned int config = SPI_CON_MODE8|SPI_CON_SMP|SPI_CON_ON|SPI_CON_MSTEN;
//SPI1
//AD25 und SRAM
SpiChnOpen(1, config, 4);
}

void TestSpi1(void)
{
unsigned int out1=0x00;
unsigned int out2=0xff;
unsigned int in1=0xaa;
unsigned int in2=0x55;
int ch=SPI_CHANNEL1;
// SPI Initialisierung
SpiInitDevice();

/*************
Nur schreiben
*************/
SpiChnPutC(ch,0x55);
SpiChnPutC(ch,0xaa);
//Rx Buffer leeren
while(SpiChnDataRdy(ch))
{
in1=SpiChnGetC(ch);
};

/***********
Nur lesen
************/
//Senden um eine Clock zu erzeugen
SpiChnPutC(ch,out1);
//Warte bis alles raus ist
while(!SpiChnTxBuffEmpty(ch));
//Wenn Daten im Buffer sind
if(SpiChnDataRdy(ch))
{
//Lesen
in1=SpiChnGetC(ch);
//In in1 sollte nun der Wert 0 stehen da die SIn-Datenleitung Low ist
}

//Senden um eine Clock zu erzeugen
SpiChnPutC(ch,out2);
//Warte bis alles raus ist
while(!SpiChnTxBuffEmpty(ch));
//Wenn daten im Buffer sind
if(SpiChnDataRdy(ch))
{
//Lesen
in2=SpiChnGetC(ch);
//In in2 sollte nun der Wert 0 stehen da die SIn-Datenleitung immer noch low ist
}

/****************************
Puste kuchen
In in1 steht ein 0xFF
in in2 immer noch die 0x55, wurde nicht gelesen da nichts im buffer war
****************************/
}

Wieso funzt das nicht?
Jemand ne Idee?

BTW
Wie groß ist eingendlich der SPI Rx und Tx Buffer?
Und wie kann ich die grösse ändern?

Oder muß ich den Tx per Interrupt selber realisieren?


Gruß Robert
« Letzte Änderung: September 19, 2011, 16:18:22 von AnyKey » Gespeichert
AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« Antworten #2 am: September 18, 2011, 11:29:14 »

67 Aufrufe, und keiner ne Idee?

Habe mittler Weile die Doku nochmal durch gelesen.
Konnte aber keine weiteren Hinweise finden.

Ich habe nicht den Hauch von einem Schimmer was ich falsch mache.

Hatte Jemand schon mal das gleiche Problem?

Dank und Gruß Robert
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #3 am: September 19, 2011, 01:29:36 »

Hi Robert,

Zitat
67 Aufrufe, und keiner ne Idee?
Dann will ich dich mal nicht haengen lassen, obwohl ich jetzt das Problem von dir auch nicht dirket sehe.
Daher haenge ich mal als Beispiel ein bisschen Code an, den ich benutze (laeuft auf MX460 und MX795):

Init des SPI:
Code:
   // Set up SPI port pins
    VS1053_RESET = 0;
    VS1053_RESET_TRIS = OUTPUT_PIN;
    VS1053_DREQ_TRIS = INPUT_PIN;
    VS1053_XCS_TRIS = OUTPUT_PIN;        // Make theCS pin an output
    VS1053_SI_TRIS = OUTPUT_PIN;         // SI to VS chip
    VS1053_SO_TRIS = INPUT_PIN;          // SO from VS Chip
    VS1053_SCLK_TRIS = OUTPUT_PIN;       // Make the SCK pin an output
VS1053_XCS = 1;

    VS1053_XDCS_TRIS = OUTPUT_PIN;       // Make the Data CS pin an output
VS1053_XDCS = 1;
VS1053_SPIBRG = (GetPeripheralClock()-1ul)/2ul/VS1053_SPI_FREQUENCY_SLOW;
    VS1053_SPICON1bits.CKE = 1;
    VS1053_SPICON1bits.MSTEN = 1;
    VS1053_SPICON1bits.ON = 1;

Das Lesen und Schreiben laeuft mit der selben einfachen Routine:

Code:
BYTE VLSIWrite(BYTE output)
{
VS1053_putcSPI((BYTE)output);
   return (BYTE)VS1053_getcSPI();
}

Dazu gibts dann zum Abstrahieren noch ne Ladung #defines:
Code:
//VLSI VS1053 Decoder
    #define VS1053_XCS LATBbits.LATB2      
    #define VS1053_XCS_TRIS TRISBbits.TRISB2  
    #define VS1053_XDCS LATAbits.LATA9    
    #define VS1053_XDCS_TRIS TRISAbits.TRISA9    
    #define VS1053_RESET LATBbits.LATB8      
    #define VS1053_RESET_TRIS TRISBbits.TRISB8    
    #define VS1053_SCLK LATDbits.LATD10      
    #define VS1053_SCLK_TRIS TRISDbits.TRISD10
    #define VS1053_SI LATCbits.LATC4      
    #define VS1053_SI_TRIS TRISCbits.TRISC4
    #define VS1053_SO PORTDbits.RD0      
    #define VS1053_SO_TRIS TRISDbits.TRISD0
    #define VS1053_DREQ PORTAbits.RA10  
    #define VS1053_DREQ_TRIS TRISAbits.TRISA10
#define VS1053_SPISTAT_RBF SPI1STATbits.SPIRBF
#define VS1053_SPIBUF SPI1BUF
    #define VS1053_SPICON1 SPI1CON
    #define VS1053_SPISTAT SPI1STAT
    #define VS1053_SPICON1bits SPI1CONbits
    #define VS1053_SPISTATbits SPI1STATbits
    #define VS1053_SPIENABLE SPI1CONbits.ON
    #define VS1053_SPIBRG SPI1BRG
#define VS1053_OpenSPI(config1, config2)   OpenSPI1(config1, config2)
#define VS1053_putcSPI putcSPI1
#define VS1053_getcSPI getcSPI1

Ich nutze nicht die Libraries, da zu dem Zeitpunkt wo ich den Code geschrieben habe diese noch nicht da waren.

Gruesse
Stefan
« Letzte Änderung: September 19, 2011, 01:36:00 von Stampede » Gespeichert

AnyKey
Newbie
*
Offline Offline

Beiträge: 35



Profil anzeigen
« Antworten #4 am: September 19, 2011, 16:16:06 »

Hi Stephan,
vielen Dank für deine Hilfe.
Annimiert durch deinen Code habe ich den Read/Write-Vorgang in ne Funktion ausgelagert.
Auf meine Platine habe ich die SDO und SDI gebrückt.
Und nun geht es, nach dem ich die SDO und SDI wieder richtig verlegt habe bekomm ich nun die erwartete 0x00. (SDI = Low)
Somit ist erst mal klar gestellt das die SPI funktioniert.
Warum nun die SDI immer null ist (das SRam sollte hier ja Daten raus schieben) ist ne andere Frage.
Hier zu mach ich dann einen neuen Thread auf.

Dank und Gruß Robert
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.042 Sekunden mit 19 Zugriffen.
 
Top! Top!