Problem SPI bei PIC

OP #611717
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.
Gast #612054
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)?
Gast #612082
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
OP #612499
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?

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