SPI als Master
Mittwoch, 23. Mai 2012
 
 

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

Beiträge: 12


Profil anzeigen
« am: Oktober 26, 2010, 15:34:28 »

Hi Leute,

ich versuche gerade die SPI-Schnittstelle im Mastermode mit DMA zu laufen zu bringe.
Die Idee der Kommunikation ist folgende. Ich habe einen DMA-Buffer von 4 Nachrichten. Der CS-PIN wird von einem Timer bedient. Alle 10 us wird CS aktiviert. In diesem Augenblick möchte ich den 1 Buffer über SPI versenden, dann aktiviert der Timer einen anderen Baustein und der Buffer2 soll gesendet werden.

Nun kriege ich es net so hin, denn wenn ich den One-Shot Mode wähle, damit der Takt nicht läuft, dann schickt dieser immer alle 4 Nachrichten im abstand von 300-400 ns ab. Leider kann ich den CS nicht so schnell umswitchen.

Hat jemand eine Idee wie ich das problem lösen kann?

Gruß
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #1 am: Oktober 27, 2010, 12:36:21 »

Hi,

erstamal vorneweg, um welchen PIC handelt es sich?
Verstehe dein Problem auch nicht so ganz. Ich hatte aber auch meine Schwierigkeiten, die DMAs in Verbindung mit der SPI zum Laufen zu bringen.
Falls du der englischen Sprache mächtig bist, empfehle ich dir das Microchip-Forum ( http://www.microchip.com/forums/Default.aspx? ), da gibts paar Threads zu dem Thema. Einfach mal suchen.

Gruß
Stefan
Gespeichert

idrisk
Newbie
*
Offline Offline

Beiträge: 12


Profil anzeigen
« Antworten #2 am: Oktober 28, 2010, 08:14:55 »

Hi,

sorry habe vergessen den typ anzugeben, es handelt sich um dem dsPIC33F! Nun läuft es so ein bisschen vor sich hin, dennoch brauche ich zwei Timer und das gefällt mir nicht!

Gespeichert
idrisk
Newbie
*
Offline Offline

Beiträge: 12


Profil anzeigen
« Antworten #3 am: Oktober 28, 2010, 08:51:23 »

Kann ich irgend wie das CS bit automatisch setzten lassen vom DMA- oder SPI-Controller oder muss ich es selber behandeln?
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #4 am: Oktober 28, 2010, 11:06:47 »

Hi,

soweit ich weiß hat nur das PMP Modul einen eigenen CS Pin, die anderen Peripheriemodule nicht. Du wirst das CS also "händisch" setzen müssen.
Poste doch mal den Code / ISR, damit man sich besser vorstellen kann was du tust.

Gruß
Stefan
« Letzte Änderung: Oktober 28, 2010, 11:18:33 von Stampede » Gespeichert

idrisk
Newbie
*
Offline Offline

Beiträge: 12


Profil anzeigen
« Antworten #5 am: Oktober 28, 2010, 14:35:23 »

Ich habe mal ein Bild von der Kommunikation gepostet (Anhang im Post).

Die untere Darstellung im Bild ist eine Vergrößerung!

Es läuft nun, so wie ich es haben möchte. Habe zum triggern des DMA und synchronisierung der SPI-Frames mit CS zwei Timer laufen!
Der Code hat mich viel Zeit gekostet, aber hier mal ein Auszug aus dem TimerInterupt für das CS.

Das Proggi geht so, dass immer 3 Nachrichten gesendet werden. Dann kann der DMA wieder befüllt werden und er nach ca. 25 us werden wieder drei gesendet.

Das Problem war, dass ich es nicht gerallt habe, den DMA-Request zum Senden über den Timer2 zu steuert, sondern versucht habe mit dem Force-Bit in den DMA registern manual einen Request zu erzeugen, dass irgendwie nicht ging. Aber nun Läuft es über zwei Timer, wenn einer eine elegantere Lösung hat, bin ich nicht abgeneigt zu spicken!

Gruß

Code:
/*
    Funktion:       _T8Interrupt()
    Autor:          --------
    Geändert am:    20.10.2010
    
    Parameter:      n.A.
    Rückgabewert:   n.A.
    
    Beschreibung:   ISR() - für Timer8
                    Timer8 - Teiler 1:1 (Period: 25 ns)
                    
*/

void __attribute__((__interrupt__, no_auto_psv)) _T8Interrupt(void)
{
    static unsigned char i_cs = 1;              // CS Deklaration und Initialisierung nach Einschalten!
    static unsigned char spiBuf_counter = 0;    // spi_buf Counter, max. Wert ist max. SPI-DMA-Buffer, --> config.h!
    
    static unsigned char dummy = 0;             // Dummywert
        
    SPI_CS = i_cs;                              // CS-Bit auf Portpin ausgeben!                      
    
    // CS = 0, SPI-Frame im DMA-Freigeben!
    if(i_cs == 0)
    {  
        PR8 = 240;                              // Slot für 6 us          
        system_startTimer2();                   // SCLK um 1 us verschieben, DMA-Auslösen
        spiBuf_counter++;                       // Anzahl der Slots zählen
        dummy++;                                // DUmmy zum testen inc.
    }
    // CS = 1, SPI-Idle
    else                                
    {
        // SPI-DMA-Buffer komplett gesendet? CS = 1 für ca. 25 us
        if(spiBuf_counter == 0)
            PR8 = 1040;
        // SPI-DMA-Buffer noch nicht komplett gesendet? CS = 1 für ca. 3 us
        else
            PR8 = 120;
    }
    
    // Max. Anzahl der SPI-DMA-Buffer erreicht?
    if(spiBuf_counter >= 3)
    {
        // Dummy-Schreiben!
        SPI2_TX_Schedule[0] = dummy - 2;
        SPI2_TX_Schedule[1] = dummy - 1;
        SPI2_TX_Schedule[2] = dummy;
        
        // In DMA-Laden
        system_writeToSPI(SPI2_TX_Schedule);
        spiBuf_counter = 0;            
    }
    
    i_cs = i_cs ^ 1;        // Toogle CS
    IFS3bits.T8IF = 0;  // Reset INT-Flag
}



* spi_kom.JPG (91.68 KB, 1066x420 - angeschaut 87 Mal.)
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.035 Sekunden mit 18 Zugriffen.
 
Top! Top!