SPI-Problem bei ADuC812

Gast #341745
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:
1
#include <stdio.h>                /* prototype declarations for I/O
2
functions */
3
#include <ADuC812.h>              /* ADuC812 header file            */
4

5
sbit LED = P3 ^ 4;                                
6

7
void wait_ms(int time)
8
{
9
 int delay_time,delays;
10
 for (delay_time=0; delay_time<time; delay_time++)
11
  {
12
  for( delays=0;delays<500;delays++);
13
  }
14
}
15

16
void interrup_0 () interrupt 7    // SPI Interrupt Vector Address
17
{
18
  ISPI=0;  
19
  P2=~P2;
20
}
21
void main (void)
22
{
23
  EA=1;                           // Enable global interrupts
24

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

30
  SPICON = 0x30 ;      //master mode
31
  IE2 = 0x01 ;
32

33
  SPE=1;                          // enable SPI interrupt
34
  while (1)                       // Wait for ADC interrupt
35
  {
36
          SPIDAT = 0x55;
37
      LED = 1;
38
      wait_ms(500);
39
      LED = 0;
40
      wait_ms(500);
41

42
  }
43
}

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
Gast #341747
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]
Gast #341748
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
Gast #341749
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.
Gast #341756
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.
Gast #341757
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren