Forum: Mikrocontroller und Digitale Elektronik Problem SPI bei PIC


von Thomas S. (spom)


Lesenswert?

Hi,
ich benutze einen Luftblasensensor und habe ein Problem mit SPI.
Ich verwende einen PIC18F2480 
(http://ww1.microchip.com/downloads/en/DeviceDoc/39637a.pdf) und 
verbinde über die SPI Schnittstelle den uC mit den AD-Wandler AD7790 
(http://www.analog.com/UploadedFiles/Data_Sheets/AD7790.pdf).
Ich habe PIN 1 (SCLK) des AD7790 mit PIN 14 (RC3/SCK/SCL) des PIC, PIN 2 
(CS) mit PIN 13 (RC2/CCP1), PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und PIN 10 
(DIN) mit PIN 15 (RC4/SDI/SDA) direkt verbunden. Die anderen erklären 
sich von selbst.

Als Compiler benutze ich CCS C. Mein Code sieht wie folgt aus:
1
#include <18f2480.h>
2
#device *=16
3
#device ADC=10
4
5
#use delay(clock=8000000)
6
7
#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
8
9
10
#define SPI_MODE_0_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
11
#define SPI_MODE_0_1 (SPI_L_TO_H)
12
#define SPI_MODE_1_0 (SPI_H_TO_L)
13
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H) 
14
15
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,BRGH1OK,stream=debug)
16
17
#define SPANNUNG_REF 4
18
#define KOMPERATOR_REF  0
19
#define LUFTBLASENSENSOR 1
20
21
#define CS PIN_C2
22
23
#define CREAD 0b00111100    // continous read
24
25
26
void main()
27
{
28
29
  int8 ad_in1;
30
  int8 ad_in2;
31
  int8 ad_in3;
32
33
34
  setup_spi(SPI_MASTER | SPI_MODE_1_1 | SPI_CLK_DIV_16);
35
  setup_adc(adc_off);
36
37
38
  SET_TRIS_C( 0b00001000 );  
39
40
  output_high(CS);
41
42
  delay_ms(100);
43
44
  puts("\nLuftblase;Referenzspannung;Komparator_Ref;Luftblasensensor\n");
45
46
47
  while (TRUE)    
48
  {
49
    
50
    delay_ms(20);
51
    output_low(CS);  
52
    
53
54
    if (input(PIN_B0))
55
      {
56
      printf("Ja;");
57
      }
58
    else
59
      {
60
      printf("Nein;");
61
      }
62
    
63
    spi_write(CREAD);
64
    
65
    ad_in1 = spi_read(0);
66
    ad_in2 = spi_read(0);
67
    ad_in3 = spi_read(0);
68
    output_high(CS);
69
70
    fprintf(debug,"%u %u %u;\n", ad_in1, ad_in2, ad_in3);
71
  }
72
}

Wenn ich das Programm nun ausführe, erscheint am Computer (sende Daten 
über RS232 und sehe sie mir über Docklight an) noch ein "Ja" und dann 
kommt nichts mehr. Wo liegt der Fehler?

Ich bin um jede Hilfe dankbar.

von Dieter Werner (Gast)


Lesenswert?

> PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und
> PIN 10 (DIN) mit PIN 15 (RC4/SDI/SDA)

Falls das wirklich so sein sollte ist es falsch.

DOUT(put) muss natürlich SDI(nput) verbunden werden und entsprechend
DIN(put) mit SDO(utput).


Und was ist bitteschön input(PIN_B0)?

von Gerhard. (Gast)


Lesenswert?

Hallo Thomas,

von wo stammt das: "SPI_MODE_1_1" - Gibt es so viel wie ich weiss nicht.

Das verwende ich z.B. bei mir mit Erfolg:

...
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H  | SPI_CLK_DIV_4);
...
output_low(SPI_STROBE);

    for (j = 0; j < (max_loop) ; j++){
        spi_write(MAX7301_buffer[j]);
    }

output_high(SPI_STROBE);
...

Gerhard

von Thomas S. (spom)


Lesenswert?

Hi,
entschuldigt bitte, das

> PIN 9 (DOUT) mit PIN 16 (RC5/SDO) und
> PIN 10 (DIN) mit PIN 15 (RC4/SDI/SDA)

habe ich natürlich falschrum geschrieben. Also PIN 9 auf PIN 15 und PIN 
10 auf PIN 16.

"SPI_MODE_1_1" habe ich oben definiert als
1
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

Was ist mit "SPI_STROBE" gemeint bzw. wie ist es definiert??


Ich habe mir mal die einzelnen Pins näher angeschaut, ob sie high oder 
low sind. Dabei habe ich festgestellt, dass DOUT und DIN vor und nach 
dem spi_write Befehl immer low sind. Als nächstes kommt dann der 
spi_read Befehl und dann bleibt das Programm "hängen". Ist evtl. an 
diesem Befehl was falsch?

Zusätzlich habe ich versucht, die Clockleitung mit einem Oszi zu messen. 
Wie sollte das Signal aussehen?

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.