www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI-Problem bei ADuC812


Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich Versuche momentan das SPI-Modul des ADuC812 zum laufen zu bekommen,
doch irgendwie funktioniert es nicht. Das Beispielprogramm von Analog
devices funktioniert auch nicht. hat jemand eine Idee woran das liegen
kann?

Hier der Code:
#include <stdio.h>                /* prototype declarations for I/O
functions */
#include <ADuC812.h>              /* ADuC812 header file            */

sbit LED = P3 ^ 4;                                

void wait_ms(int time)
{
 int delay_time,delays;
 for (delay_time=0; delay_time<time; delay_time++)
  {
  for( delays=0;delays<500;delays++);
  }
}

void interrup_0 () interrupt 7    // SPI Interrupt Vector Address
{
  ISPI=0;  
  P2=~P2;
}
void main (void)
{
  EA=1;                           // Enable global interrupts

  SCON = 0x52 ;       // UART configuration
  TMOD = 0x20 ;      //9600 bauds
  TH1 = 0xFD ;      //1 stop bit 
  TR1 = 1 ;      //no parity bit

  SPICON = 0x30 ;      //master mode
  IE2 = 0x01 ;

  SPE=1;                          // enable SPI interrupt
  while (1)                       // Wait for ADC interrupt
  {
          SPIDAT = 0x55;
      LED = 1;
      wait_ms(500);
      LED = 0;
      wait_ms(500);

  }
}

ICh programmiere mit µVision3. Wenn ich es simulier merke ich, dass nie
ein wert im SPIDAT-Register steht. Warum ist das so?

Achja.... ich benutze das ADuC812QS Evalboard.

PS.: Ich hab mit dem Oszi auch schon die SPI-Pins nachgemessen... tat
tut sich nichts :-(

Kann mir bitte jemand helfen?

mfg SChoasch

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, was machst du jetzt UART oder SPI?

Bei SPI gibt es jedenfalls kein Stopbit usw.
Das ist ein Ringbus. Vorne reinschieben und hinten abholen.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UART ist nur schon konifugriert, da ich es für eine Ausgabe dann
benutzen will.

Aber mit:
SPICON = 0x30 ;
Stelle ich ja das SPI-Modul ein.

SPICON SPI CONTROL REGISTER

ISPI    SPI INTERRUPT
       (SET AT END OF SPI TRANSFER)
WCOL    WRITE COLLISION ERROR FLAG
SPE     SPI ENABLE
        (0 = DISABLE, ALSO ENABLES SPI)
SPIM    MASTER MODE SELECT (0 = SLAVE)
CPOL    CLOCK POLARITY SELECT
        (0 = SCLK IDLES LOW)
CPHA    CLOCK PHASE SELECT
        (0 = LEADING EDGE LATCH)

SPR1    SPI BITRATE SELECT BITS
SPR0    BITRATE = FOSC / [4, 8, 32, 64]

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt die PINs entsprechend konfigurieren. Einfach immer einen Wert in
das Register schreiben geht auch nicht. Du mußt warten bis das transfer
ready flag erscheint.

Aber in jedem fall müssen die PINs richtig auf input und output
stehen.

Mattias

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@MAttias: Nichts für ungut... Aber weist du wovon du redest?
Der ADuC812 ist ein 8051er... und da muss man nicht in die
Tristate-Register schreiben. Ausserdem können die SPI bzw I²C-Pins
nicht direkt angesprochen werden, da sie nur fürs SPI und I²C modul zur
verfügung stehen.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ausserdem... ich nehme mal an, das nach ca. 1Sekunde die SPI
übertragung abgeschlossen sein sollte oder glaubst du nicht ;-)

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tschuldigung, ich dachte das ist ein arm.
Dann kenn ich mich nicht aus.

Mattias

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:-) nein... aber ist eh verwirrend mit den namen von Analog.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner von euch mit diesem µC was getan?

Autor: Kafelnikov (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist 'Enable all interrupts'?


oder hab ichs übersehen?

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gleich am anfang ist es:
  EA=1;                           // Enable global interrupts

Was mich iritiert ist die Tatsache, das nie ein Wert im SPIDAT steht.

Autor: Kafelnikov (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> EA=1;  // Enable global interrupts

Das ist doch enable extern Interrrupt0


mov IE, #80h ist enable global Interrupt(in assembler)


Ich arbeite zwar auch mit dem ADuC812, habe die SPI jedoch noch nicht
benutzt.
Ich lese das nur aus den Apps ab.

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EA ist ein Bit, welches sich im IE-Register befinden (7Bit).

Hier ein Auszug aus dem Datenblatt:

EA    Written by user to enable &#8220;1&#8221; or disable
&#8220;0&#8221; all interrupt sources.

(ist auf Seite 38 zu lesen)

Das komische ist ja, dass Keil beim debuggen in die ISR springt, jedoch
nie etwas im SPIDAT drin steht. Wenn ich es so Teste, tut sich auch
nichts an den Pins. Weder an MOSI noch an SCLOCK.

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.