Forum: Mikrocontroller und Digitale Elektronik SSI Schnittstelle LM3S1968 (Luminary Cortex M3)


von Harald H. (mirona)


Angehängte Dateien:

Lesenswert?

Ich habe ein Problem mit der SSI Schnittstelle des LM3S1968 (Cortex M3 
von TI).
Es handelt sich um ein Board von TI.
Programmiert wird mit Crossworks for ARM 2.0.7.

Was wird bezweckt?
  Ich möchte ein TFT Display EA eDIPTFT43-A über seine SPI Schnittstelle
  ansprechen.
Was funktioniert?
  Die Ausgabe eines Kommandostrings an das Display funktioniert.
  Das Display antwortet mit 0x06 (Acknowledge).
Was funktioniert nicht?
  Der Prozessor liest die Antwort 0x06 nicht ein.
Woher weiß ich daß?
  Ich habe an der SSI Schnittstelle des Boards einen Logicanalyzer
  angeschlossen, der mir die Daten anzeigt, die an der Schnittstelle
  ankommen.

Für die Bedienung der Schnittstellen werden die Prozeduren aus der 
Luminary Library genutzt.

So nun zum eigentlichen Problem.
Betroffen ist eigentlich nur die Funktion "read_char".

Wie schon gesagt, liest der Prozessor das Acknowledge nicht ein.
Bis auf eine Ausnahme. Im Schrittbetrieb (step-over, d.h. die Funktionen 
werden als Ganzes ausgeführt) erscheint nach dem zweiten Befehl/zweiter 
Funktion die 0x06 im SSI0_DR (Datenregister der SSI Schnittstelle).
Die Stelle an der der Wert erscheint habe ich mit einem Kommentar 
versehen (ist unmittelbar nach dem return (dat)).
Lege ich einen Breakpoint an diese Stelle und lasse das Programm bis 
dahin durchlaufen, steht im Register 0xfe.
Füge ich zwei zusätzliche Befehle (z.B. zwei Additionen) nach der 
Empfangsfunktion (SSIDataGet) ein, sehe ich das
Acknowledge diese zwei Funktionen eher.

Ersetze ich die Luminary-Funktionen durch die unmittelbaren 
Registerzugriffe ändert sich am Verhalten nichts.

Gibt es jemanden, der sich mit dem LM3S auskennt und etwas zur SSI 
Schnittstelle sagen kann?

Hinsichtlich der SSI Schnittstelle gibt es kein Errata von TI.
1
#include <hw_types.h>
2
#include <driverlib/sysctl.h>
3
#include <driverlib/ssi.h>
4
#include <hw_memmap.h>
5
#include <driverlib/gpio.h>
6
7
#include "system.h"
8
#include "comm.h"
9
#include "spi.h"
10
#include "timer.h"
11
12
#define softSPI  0  // SPI Übertragung durch Soft-SPI wenn 1
13
14
#if softSPI
15
//#define SDC_CLK    GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
16
//#define SDC_DI    GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MISO, 0);
17
//#define SDC_DO    GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, 0);
18
#endif
19
20
unsigned long uldat;
21
22
void write_char (char c) {
23
24
#if SPI
25
26
#if softSPI
27
  volatile char a;
28
  unsigned int i;
29
30
  for (a = 8; a > 0; a--) {
31
//    SDC_CLK = 0;          // 380 ns
32
                GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
33
//    wait_usec (1);
34
    for (i=0;i<20;i++);
35
//    SDC_DO = (dat & (1 << (a - 1))) ? 1 : 0;  // 540 ns
36
    GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, (c & (1 << (a - 1))) ? 1 : 0);//    SDC_CLK = 1;          // 200 ns
37
                GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 1);
38
//    wait_usec (1);
39
    for (i=0;i<200;i++);
40
  }
41
//  SDC_CLK = 0;
42
  GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CLK, 0);
43
//  SDC_DI = 1;
44
  GPIOPinWrite (GPIO_PORTA_BASE, SPI0_MOSI, 1);
45
46
#else
47
  SSIDataPut (SSI0_BASE, c);
48
#endif
49
50
#elif UART
51
52
#endif
53
}
54
55
char read_char (void) {
56
  volatile unsigned char dat;
57
//  unsigned long uldat;
58
  volatile unsigned int a, b;
59
60
  a = 0;
61
  b = 0;
62
  uldat = 0xff;
63
  dat = 0;
64
65
#ifdef SPI
66
  SSIDataPut (SSI0_BASE, 0x55);
67
  SSIDataGet (SSI0_BASE, &uldat);
68
#elif UART
69
70
#endif
71
72
// zwei Dummy Befehle
73
  a = a + 6;
74
  b = a + 8;
75
// Wenn diese beiden Dummy Befehle eingefügt werden, sehe ich das
76
// Acknowledge nach dem nachfolgenden Befehl "dat = ..."
77
78
  dat = (unsigned char)uldat;
79
  return (dat);
80
}  // ohne Dummy-Befehle sehe ich hier die 0x06 im SPI Empfangsregister
81
82
char acknowledge (void) {
83
  char ack;
84
  volatile unsigned int i;
85
86
  for (i = 0; i < 100; i++) {
87
  }
88
89
  ack = read_char ();
90
  return (ack);
91
}
92
93
char write_cmd (char *cmd) {
94
  char ack;
95
  unsigned char i;
96
97
//  CS_LOW;
98
  GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CS, 0);
99
100
  for (i = 0; i < (cmd[1] + 3); i++) {
101
    write_char (cmd[i]);
102
  }
103
104
//  ack = acknowledge ();
105
  ack = read_char ();
106
107
//  CS_HIGH;
108
  GPIOPinWrite (GPIO_PORTA_BASE, SPI0_CS, SPI0_CS);
109
110
  return ack;
111
}

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.