SPI funktioniert nicht
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Schnittstellen (CCS)  |  SPI funktioniert nicht « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: SPI funktioniert nicht  (Gelesen 2247 mal)
 
spom
Newbie
*
Offline Offline

Beiträge: 5


Profil anzeigen
« am: Juli 26, 2007, 12:54:21 »

Hi,
ich verwende einen PIC18F2480 und einen externen AD-Wandler AD7790 (http://www.analog.com/UploadedFiles/Data_Sheets/AD7790.pdf), die ich über SPI verbinde.
Leider funktioniert es bei mir nicht. Hier mal mein Code:
Code:
#include <18f2480.h>
#device ADC=10

#use delay(clock=8000000)

#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP

#define SPI_MODE_0_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_0_1 (SPI_L_TO_H)
#define SPI_MODE_1_0 (SPI_H_TO_L)
#define SPI_MODE_1_1 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,BRGH1OK,stream=debug)

#define SPANNUNG_REF 4
#define KOMPERATOR_REF 0
#define LUFTBLASENSENSOR 1

#define SPI_CS PIN_C2
#define SPI_CLOCK PIN_C3
#define SPI_DO PIN_C4
#define SPI_DIN PIN_C5

#define CREAD 0x38 // continous read

void main()
{
int8 ad_in1;
int8 ad_in2;

setup_spi(SPI_MASTER | SPI_MODE_1_1 | SPI_CLK_DIV_64);
//setup_spi(SPI_MASTER|0x4010|SPI_CLK_DIV_4|SPI_SS_DISABLED);
setup_adc(adc_off);

//SET_TRIS_C( 0x90 );

//output_high(SPI_CS);
output_high(SPI_CLOCK);
output_high(SPI_DO);
output_high(SPI_DIN);

        while (TRUE)
{
while (!input(SPI_DO))
{
//warten auf SPI_DO high
};

spi_write(CREAD);
delay_us(50);

while(input(SPI_DO))
{
printf("warten auf Dout low");
};

output_high(SPI_DIN);
delay_us(50);


while(!input(SPI_DIN))
{
//warten auf SPI_DIN high
};


ad_in1 = spi_read(0);
ad_in2 = spi_read(0);

fprintf(debug,"%u  ;", ad_in1, ad_in2);

while(!input(SPI_DO))
{
printf("warten bis DOUT high");
};


output_high(SPI_CS);

}
}

Wenn ich mal mit input_stat(PIN_C4) meine Pins auf Ein- und Ausgänge überprüfe, stelle ich fest, dass PIN C3 ein Eingang und PIN C4 ein Ausgang ist. Dies dürfte aber nicht richtig sein oder? Richtig angeschlossen habe ich alles.

Wenn ich den Status abfrage, ob ein Pin high oder low ist, verwende ich
Code:
while(input());
Setzt dieser Befehl einen Ausgang wieder zu einem Eingang?
Wie kann ich sonst den Pegelstatus prüfen?

Mein Programm bleibt immer vor dem spi_read Befehl in der while Schleife hängen.
Code:
while(!input(SPI_DIN))
{
//warten auf SPI_DIN high
};
Warum ist SPI_DIN nicht high? Laut Datenblatt vom AD7790(Seite 15) sollte das doch so sein oder?

Danke!
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #1 am: Juli 26, 2007, 18:38:27 »

Zitat
Code:
while(input());

Setzt dieser Befehl einen Ausgang wieder zu einem Eingang?

Ja.

Zitat
Wie kann ich sonst den Pegelstatus prüfen?

Die Adressen der SFRs selbst über #bit und #byte definieren und dann darauf zugreifen.

Code:
#byte PORTC = 0xF82
#bit RC0 = PORTC.0
#bit RC1 = PORTC.1
...

while (!RC1);

Zitat
Warum ist SPI_DIN nicht high? Laut Datenblatt vom AD7790(Seite 15) sollte das doch so sein oder?

Zwei Probleme:

  • der als Ausgang konfigurierte SDO-Pin vom PIC (RC5) steht unter der Kontrolle vom MSSP-Modul und kann nicht gesetzt oder gelöscht werden
  • durch input(SPI_DIN) wird SDO (RC5) zum Eingang, wodurch dem MSSP-Modul die Kontrolle über diesen Pin entzogen wird
    --> es wird der von "außen" anliegende Pegel eingelesen

Du kannst auf diesen Programmteil

Code:
output_high(SPI_DIN);
delay_us(50);

while(!input(SPI_DIN))
{
   //warten auf SPI_DIN high
};

komplett verzichten. Solange kein Taktsignal anliegt, ist der Logikpegel an SDO vollkommen egal und auch nicht wirklich beeinflußbar (wenn ich mich richtig erinnere, bleibt an SDO das LSB der letzten Übertragung "stehen"). Wichtig ist nur, daß beim Auslesen SDO high ist, also:

Code:
ad_in1 = spi_read(0xFF);
ad_in2 = spi_read(0xFF);

In Deinem Code setzt Du übrigens SPI_CS nicht auf 0. Der Zustand der LAT-Register nach dem Einschalten ist aber undefiniert (er kann mal "0" und mal "1" sein).

Zitat
Wenn ich mal mit input_stat(PIN_C4) meine Pins auf Ein- und Ausgänge überprüfe, stelle ich fest, dass PIN C3 ein Eingang und PIN C4 ein Ausgang ist. Dies dürfte aber nicht richtig sein oder?

Nein. Pin C3 (SCK) muß im Master-Betrieb ein Ausgang sein. Für RC4 (SDI) ignoriert das MSSP-Modul allerdings die TRIS-Einstellung, d.h. es ist egal, ob SDI ein Eingang oder Ausgang ist.


Viele Grüße

Bernd
Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.036 Sekunden mit 18 Zugriffen.
 
Top! Top!