Forum: Digitale Signalverarbeitung / DSP / Machine Learning eZdspF28335 SPI


von K. A. (k-a)


Lesenswert?

Hallo zusammen!

Ich möchte auf dem eZdsp Board zwei SPI generieren und diese über eine 
Leitung miteinander kommunizieren lassen.

Ich habe auch die Register nach den Angaben im Datenblatt vom McBSP 
Modul gesetzt. Jeweils einmal für Slave und einmal für Master.

//McBSP-A register settings MASTER
  McbspaRegs.SPCR2.all = 0x0000;
  McbspaRegs.SPCR1.all = 0x0000;

  McbspaRegs.SPCR1.bit.CLKSTP = 2;
  McbspaRegs.PCR.bit.CLKXP = 0;
  McbspaRegs.PCR.bit.CLKRP = 0;

  McbspaRegs.SPCR1.bit.DLB = 1;

  McbspaRegs.PCR.bit.CLKXM = 1;

  McbspaRegs.PCR.bit.SCLKME = 0;
  McbspaRegs.SRGR2.bit.CLKSM = 1;

  McbspaRegs.SRGR1.bit.CLKGDV = 16;
  McbspaRegs.PCR.bit.FSXM = 1;
  McbspaRegs.SRGR2.bit.FSGM = 0;
  McbspaRegs.PCR.bit.FSXP = 1;
  McbspaRegs.XCR2.bit.XDATDLY = 01;
  McbspaRegs.RCR2.bit.RDATDLY = 01;

  McbspbRegs.XCR1.bit.XWDLEN1=2;
  delay_loop();
  McbspaRegs.SPCR2.bit.GRST = 1;
  McbspaRegs.SPCR2.bit.XRST = 1;
  McbspaRegs.SPCR1.bit.RRST = 1;
  McbspaRegs.SPCR2.bit.FRST = 1;


//McBSP-B register settings SLAVE
  McbspaRegs.SPCR2.all = 0x0000;
  McbspaRegs.SPCR1.all = 0x0000;

  McbspaRegs.SPCR1.bit.CLKSTP = 2;
  McbspaRegs.PCR.bit.CLKXP = 0;
  McbspaRegs.PCR.bit.CLKRP = 0;

  McbspaRegs.PCR.bit.CLKXM = 0;

  McbspaRegs.PCR.bit.SCLKME = 0;
  McbspaRegs.SRGR2.bit.CLKSM = 1;

  McbspaRegs.SRGR1.bit.CLKGDV = 16;
  McbspaRegs.PCR.bit.FSXM = 1;

  McbspaRegs.PCR.bit.FSXP = 1;
  McbspaRegs.XCR2.bit.XDATDLY = 00;
  McbspaRegs.RCR2.bit.RDATDLY = 00;

  McbspbRegs.RCR1.bit.RWDLEN1=2;
  delay_loop();
  McbspaRegs.SPCR2.bit.GRST = 1;
  McbspaRegs.SPCR2.bit.XRST = 1;
  McbspaRegs.SPCR1.bit.RRST = 1;

Allerdings hab ich jetzt das Problem, dass ich mit dem Osziloskop keine 
DX Signal am Ausgang des Master messen kann.

Ich habe auch dem DX Register die Werte reingeschrieben, die ich 
versenden will und zwar:

McbspaRegs.DXR1.all=a;

a ist hier frei wählbar bis 16bit. Ansonsten muss ich das DXR2 Register 
noch zusätzlich benutzen.

Kann mir jemand weiter helfen?

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Hast du auch in den SysCtrlRegs den Takt für die beiden Module 
eingeschaltet?


   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1;
   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1;

Und dann solltest du mal alle deine Registerbezeichnungen nachprüfen.

//McBSP-B register settings SLAVE
  McbspaRegs.SPCR2.all = 0x0000;
  McbspaRegs.SPCR1.all = 0x0000;

Du willst laut Kommentar McBSP-B einstellen, stellst aber an McBSP-A.
Das ist in deinem ganzen Code durcheinander geraten, nicht nur in diesen 
beiden Zeilen.

Grüße,

Peter

von K. A. (k-a)


Lesenswert?

Danke für deine Antwort

Ja die sind auf eins gesetzt.

Hab das mit McBSP-A und B jetzt richtig gemacht, aber wenn ich die dann 
über eine Leitung verbinden möchte, sehe ich nichts am scope.

Hier nochmal die Register Einstellungen. Habe jetzt B als Master und A 
als Slave.

void init_mcbsp_spi()
{

     // McBSP-B register settings MASTER
    McbspbRegs.SPCR2.all=0x0000;
    McbspbRegs.SPCR1.all=0x0000;
    McbspbRegs.PCR.all=0x0A08;
    McbspbRegs.SPCR1.bit.CLKSTP = 2;
    McbspbRegs.PCR.bit.CLKXP = 0;
    McbspbRegs.PCR.bit.CLKRP = 0;
    McbspbRegs.RCR2.bit.RDATDLY=01;
    McbspbRegs.XCR2.bit.XDATDLY=01;
    McbspbRegs.RCR1.bit.RWDLEN1=2;
    McbspbRegs.XCR1.bit.XWDLEN1=2;

    McbspbRegs.SRGR2.all=0x2000;
    McbspbRegs.SRGR1.all= 0x000F;
    McbspbRegs.SPCR2.bit.GRST=1;
    delay_loop();                        // Wait at least 2 SRG clock 
cycles
    McbspbRegs.SPCR2.bit.XRST=1;         // Release TX from Reset
    McbspbRegs.SPCR1.bit.RRST=1;         // Release RX from Reset
    McbspbRegs.SPCR2.bit.FRST=1;         // Frame Sync Generator reset


    // McBSP-A register settings SLAVE
    McbspaRegs.SPCR2.all=0x0000;
    McbspaRegs.SPCR1.all=0x0000;
    McbspaRegs.PCR.all=0x0008;
    McbspaRegs.SPCR1.bit.CLKSTP = 2;
    McbspaRegs.PCR.bit.CLKXP = 0;
    McbspaRegs.PCR.bit.CLKRP = 0;
    McbspaRegs.RCR2.bit.RDATDLY=01;
    McbspaRegs.XCR2.bit.XDATDLY=01;

    McbspaRegs.RCR1.bit.RWDLEN1=2;
    McbspaRegs.XCR1.bit.XWDLEN1=2;

    McbspaRegs.SRGR2.all=0x2000;
    McbspaRegs.SRGR1.all= 0x000F;
    McbspaRegs.SPCR2.bit.GRST=1;
    delay_loop();
    McbspaRegs.SPCR2.bit.XRST=1;         // Release TX from Reset
    McbspaRegs.SPCR1.bit.RRST=1;         // Release RX from Reset
}

Hab ich eventuell die GPIO falsch gesetzt?

Hier die GPIOs:

void InitMcbspaGpio(void)
{
  EALLOW;

/* Configure McBSP-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be McBSP 
functional pins.
// Comment out other unwanted lines.
  GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2;  // GPIO20 is MDXA pin
  GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2;  // GPIO21 is MDRA pin
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2;  // GPIO22 is MCLKXA pin
    GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2;    // GPIO7 is MCLKRA pin 
(Comment as needed)
  //GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1;  // GPIO58 is MCLKRA pin 
(Comment as needed)
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2;  // GPIO23 is MFSXA pin
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2;    // GPIO5 is MFSRA pin 
(Comment as needed)
  //GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1;  // GPIO59 is MFSRA pin 
(Comment as needed)

/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.

  GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0;     // Enable pull-up on GPIO20 
(MDXA)
    GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0;     // Enable pull-up on GPIO21 
(MDRA)
  GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;     // Enable pull-up on GPIO22 
(MCLKXA)
  GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;      // Enable pull-up on GPIO7 
(MCLKRA) (Comment as needed)
  //GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;   // Enable pull-up on GPIO58 
(MCLKRA) (Comment as needed)
  GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0;     // Enable pull-up on GPIO23 
(MFSXA)
  GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;      // Enable pull-up on GPIO5 
(MFSRA) (Comment as needed)
  //GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;   // Enable pull-up on GPIO59 
(MFSRA) (Comment as needed)

/* Set qualification for selected input pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.


    GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0;   // Asynch input GPIO21 
(MDRA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0;   // Asynch input GPIO22 
(MCLKXA)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 0;    // Asynch input GPIO7 
(MCLKRA) (Comment as needed)
    //GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input 
GPIO58(MCLKRA) (Comment as needed)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0;   // Asynch input GPIO23 
(MFSXA)
    GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 0;    // Asynch input GPIO5 
(MFSRA) (Comment as needed)
    //GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 
(MFSRA) (Comment as needed)

  EDIS;
}

Wäre super, wenn ihr mir weiter helfen könntet.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Ich habe jetzt gerade nicht genug Zeit, um das alles nachzuvollziehen.

Ich kann nur empfehlen, unter folgendem Link (ab Seite 65) mal alles 
nachzuprüfen:

http://focus.ti.com/lit/ug/sprufb0c/sprufb0c.pdf

Und dann würde ich erstmal versuchen, ein Modul alleine dazu zu bringen, 
dass es etwas sendet. Ohne elektrische Verbindung zu dem anderen und 
ohne das andere überhaupt zu konfigurieren.

Grüße,

Peter

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.