mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM LM3S811 SSI Problem


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir ein EK LM3S811 gekauft und möchte nun über die
SSI-Schnittstelle etwas ausgeben. Ich möchte nun anfangs die
Probe-Applikation aus dem User Guide verwenden und mit dem Oszi
prüfen, ob es wirklich funktioniert.
Doch bis jetzt habe ich es nicht erreicht, dass das Oszi etwas ausgibt.

Hier meine Programm, dass ich dazu verwende:
int main()
{
#include "hw_types.h"
#include "hw_memmap.h"
#include "hw_ints.h"
#include "sysctl.h"
#include "sysctl.c"
#include "ssi.c"
#include "ssi.h"
#include "lm3s811.h"
#include "debug.h"
#include "gpio.h"
#include "interrupt.h"


  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
  
  SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
  
  SSIConfigSetExpClk(SSI_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
                   SSI_MODE_MASTER, 2000000, 8);
  
  
  char *pcChars = "SSI Master send data.";
  long lIdx;
     
     //
    // Enable the SSI module.
    //
  SSIEnable(SSI_BASE);
    //
    // Send some data.
    //
  lIdx = 0;
  while(lIdx)
  {
    
    (SSIDataPut(SSI_BASE, pcChars[lIdx]));
 /* {
    lIdx++;
  }*/
}
  return 0;
}


Ich glaube nicht, dass ich alle Header-Dateien benötige, aber lieber zu
viel wie zu wenig. Welche Initialisierungen fehlen mir noch??

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nicht gut:
  lIdx = 0;
  while(lIdx)
...

Und ein paar Sachen fehlen noch:
//GPIO-Port anschalten
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOx);

//rx -> Input mit Pull-up
GPIOPinTypeGPIOInput(GPIO_PORTx_BASE, GPIO_PIN_x);
GPIOPadConfigSet(GPIO_PORTx_BASE, GPIO_PIN_x, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

//tx, clk -> Output
GPIOPinTypeGPIOOutput(GPIO_PORTx_BASE, GPIO_PIN_y | GPIO_PIN_z);
GPIOPadConfigSet(GPIO_PORTx_BASE, GPIO_PIN_y | GPIO_PIN_z, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);

//Pins an SSI übergeben
GPIOPinTypeSSI(GPIO_PORTx_BASE, GPIO_PIN_x | GPIO_PIN_y | GPIO_PIN_z);

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die rasche Antwort,
ich weiß, aber da diese Angabe direkt vom
User Guide entnommen ist, wundere ich mich wirklich.

Habe die Pin Konfigurationen übernommen, kann aber leider immer noch
nichts aufm Oszi sehen.

Auch die ursprüngliche Schleife:
while(pcChars[lIdx])
{
if(SSIDataPut(SSI_BASE, pcChars[lIdx]))
{
lIdx++;
}
} 



verwundert mich, denn SSIDataPut ist eine Void-Funktion
und hat somit keinen Returnwert, aber wie soll dann die Schleife 
überhaupt
ausgeführt werden ??

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche mal einen Pin zu togglen, um zu sehen ob das Programm auch 
ausgeführt wird.

Deine Schleife aus dem ersten Post wird überhaupt nicht abgearbeitet, 
weil lIdx auf 0 gesetzt ist und die Schleife aus dem DB sendet immer 
das selbe Zeichen -> pcChars[0] -> 'S'

Der Code aus dem DB ist vielleicht für eine ältere Version der DriverLib 
gedacht - SSIDataPut() ist wahrscheinlich jetzt SSIDataPutNonBlocking()

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt habe ich ein Beispielprogramm gefunden, dass zwar eigentlich
für das Development Kit LM3S811 ausgelegt ist, aber in diesem Beispiel
wird ebenfalls die SSI-Schnittstelle verwendet, um mit einem Atmel 
EEPROM#
zu kommuniezieren. Das Programm läuft einwandfrei, nur komme ich nicht 
dahinter
wie ich meinem jetztigen Code:

int main()
{
  // SSI anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
  //GPIO-Port anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  
 IntMasterEnable();

  //rx -> Input mit Pull-up
  GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, SSI_RX);
  GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_RX, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

  //tx, clk -> Output
  GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, SSI_TX);
  GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_TX, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);

  //Pins an SSI übergeben
  GPIOPinTypeSSI(GPIO_PORTA_BASE, SSI_RX | SSI_TX); 
  
  // Clock der Peripherie angeben 
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
  
  // SSI anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
  
  // SSI Konfigurationen einstellen
  SSIConfigSetExpClk(SSI_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_3,
                   SSI_MODE_MASTER, 2000000, 8);
  
  // SSI aktivieren
  SSIEnable(SSI_BASE);
  
  
  char *pcChars = "SSI Master send data.";
  long lIdx;
     

  lIdx = 1;
  while(lIdx)
  {
    
    (SSIDataPut(SSI_BASE, pcChars[lIdx]));
  
    lIdx++;
  
  }
  return 0;
}
noch ändern muss oder was ich vergessen habe zu initialisieren.

Autor: Andreas Watterott (andreasw) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sind denn SSI_RX und SSI_TX deklariert? Du musst auch noch den 
Clk-Pin konfigurieren und dem SSI übergeben.

Wenn ich jetzt nichts übersehen habe, dann müsste folgender 
Codeschnipsel funktionieren und andauernd etwas senden:
int main()
{
  // Sys-Clock setzen
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);

  // GPIO-Port anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

  // SSI anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);

  // rx -> Input mit Pull-up
  GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_4);
  GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

  // tx und clk -> Output
  GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5);
  GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);

  // Pins an SSI übergeben
  GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5); 

  // SSI Konfigurationen einstellen
  SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, 2000000, 8);
  
  // SSI aktivieren
  SSIEnable(SSI0_BASE);

  volatile unsigned long i;

  while(1)
  {
    SSIDataPut(SSI0_BASE, 'S');

    for(i=50000; i!=0; i--);
  }

  return 0;
}

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe SSI_RX und TX so deklariert:
#define SSI_CS                  GPIO_PIN_3
#define SSI_CLK                 GPIO_PIN_2
#define SSI_TX                  GPIO_PIN_5
#define SSI_RX                  GPIO_PIN_4


Aber leider kann ich immer noch nichts sehen.
Muss ich vielleicht noch einen Interrupt setzten?
Ich kann auch nicht mit dem Debugger das Programm einzelnen durchlaufen,
es wirkt fast so, als ob ich irgendwo in einer Endlosschleife drin wäre.

Hier noch einmal mein gesamtes Programm, wie es wirklich aussieht:
#include "ersterVersuch.h"


int main()
{
 
  // Clock der Peripherie angeben 
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
  
   //GPIO-Port anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  
  // SSI anschalten
  SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
 
  //rx -> Input mit Pull-up
  GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, SSI_RX);
  GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_RX, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
  
   //tx, clk -> Output
  GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, SSI_TX | SSI_CLK);
  GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_TX | SSI_CLK, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD);
  
  //Pins an SSI übergeben
  GPIOPinTypeSSI(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX); 
  
  // SSI Konfigurationen einstellen
  SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, 2000000, 8);
  
  //SSI aktivieren  
  SSIEnable(SSI0_BASE);

  while(1)
  {
    SSIDataPut(SSI0_BASE, 'S');

    for(i=50000; i!=0; i--);
  }

  return 0;
}
  

Und die Header-Dateien

#include "...\hw_types.h"
#include "...\hw_memmap.h"
#include "...\hw_ints.h"
#include "...\sysctl.h"
#include "...\sysctl.c"
#include "...\ssi.c"
#include "...\ssi.h"
#include "...debug.h"
#include "...\interrupt.h"
#include "...\interrupt.c"
#include "...\gpio.h"
#include ":...\gpio.c"
#include "...\cpu.h"
#include "...\asmdefs.h"
#include "...\diag.h"


#define SSI_CS                  GPIO_PIN_3
#define SSI_CLK                 GPIO_PIN_2
#define SSI_TX                  GPIO_PIN_5
#define SSI_RX                  GPIO_PIN_4

volatile unsigned long i;

Ich weiß im Moment leider nicht, wie ich weitermachen kann.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt weiß ich, wo mein Problem liegt:
Ich lande immer in einer Endlosschleife von Startup.c aufgrund
eines falschen Interrupts, aber was ich dagegen machen soll ist mir
immernoch unklar.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.