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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.