ADS7835 SPI con PIC18F2550

  • Fausto
  • Autore della discussione
  • Premium Utente
  • Premium Utente
Di più
11 Anni 2 Mesi fa #1 da Fausto
ADS7835 SPI con PIC18F2550 è stato creato da Fausto
Ciao a tutti, mi sono dedicaato a cercare di comunicare ancora una volta con la SPI del convertitore ADS7835.




da quello che posso capire, quando CS passa a 0, il convertiore passa dalla stato di sample a quello di hold. il dato mi viene fornito dal secondo clock in poi, quindo il dato che ricevo con il primo cklok dovrei buttarlo.

la ho provato tutti i casi (i 4 modi della SPI piu' i due casi del bit SMP, ma nulla: a tensione negativa mi restituisce risultati poco sensati.
Per qualsiasi suggerimento ringrazio anticipatamente.
cosa sbaglio? questo è il mio programma:

#include <p18f2550.h>
#include <delays.h>
#include <stdlib.h>

#include <spi.h>

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

#define CS LATBbits.LATB2
#define CLK LATBbits.LATB1
/*
OSC = HS set the oscillaor at high frequency
WDT = OFF disabilito il wdt timer
LVP = OxFF disable programming LVP
PBADEN = disable analog input
*/


void main (void)
{
int i=0, VAL;
unsigned char data=0x80;
unsigned char LSB=0;
unsigned char MSB=0;


//Setting I/O
LATA=0x00;
TRISA=0xFF;


LATB=0x00;
TRISB=0x00;

//RC6 input TX
//RC7 Output RX
LATC=0x00;
TRISC=0x00;

//Slave Select è nel Pin RB2 Output
//SCK Pin RB1 Output (il pic è il master)
//SDI pin RB0 è Input

TRISBbits.TRISB2=0; //Chip Select
TRISBbits.TRISB1=0; //SCK
TRISBbits.TRISB0=1; //SDI


CS=1;

SSPSTATbits.SMP=1;
SSPSTATbits.CKE=1;

//SSPCON1
SSPCON1=0b00000010;//FOSC/64
SSPCON1bits.CKP=1;
SSPCON1bits.SSPEN=1;

//OpenSPI(SPI_FOSC_64,MODE_11,SMPMID);
//OpenSPI(SPI_FOSC_64,MODE_01,SMPEND);
while(1)
{
CLK=0;
//CLK=0;
//con 20MHz 2us
Delay10TCY();

CS=0;

CLK=1;
CLK=0;

while(WriteSPI(data));
while(!SSPSTATbits.BF);

MSB=SSPBUF;

while(WriteSPI(data));
while(!SSPSTATbits.BF);

LSB=SSPBUF;

CS=1;


Delay1KTCYx(10);
}

CloseSPI();
Allegati:

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
11 Anni 2 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic ADS7835 SPI con PIC18F2550
Ciao Fausto,

ti consiglio di fare delle misure con l´oscilloscopio.
Dalle immagini reali si risolve tutto.

Mi e´ capitato di fare il debug per un cliente e dal software si capisce sempre poco.
Con oscilloscopio e scheda tra le mani si e´ visto subito dove stava il problema.
...poi ci e´ voluto ancora del tempo per capire le impostazioni.
I diagrammi dell´oscilloscopio devono essere "uguali" a quelli del datasheet, almeno per quanto riguarda le transizioni.

Saluti,

Mauro
I seguenti utenti hanno detto grazie : Fausto

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Fausto
  • Autore della discussione
  • Premium Utente
  • Premium Utente
Di più
11 Anni 2 Mesi fa #3 da Fausto
Risposta da Fausto al topic ADS7835 SPI con PIC18F2550
Grazie Mauro, lo faro' il prima possibile dato che mi manca solo questo.
Ho dubbi sulla saldatura...

Nel caso riuscissi a farlo linko in modo che possa essere utile a qualcuno.

Tschiuss

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Fausto
  • Autore della discussione
  • Premium Utente
  • Premium Utente
Di più
11 Anni 2 Mesi fa #4 da Fausto
Risposta da Fausto al topic ADS7835 SPI con PIC18F2550
avevo commesso un errore hardware...confermo che con l'oscilloscopio è un'altra cosa... da li si capisce anche perchè sul datasheet è consigliato utilizzare una resistenza di pull-down del segnale MISO.
A presto
Allegati:

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Fausto
  • Autore della discussione
  • Premium Utente
  • Premium Utente
Di più
11 Anni 2 Mesi fa - 11 Anni 2 Mesi fa #5 da Fausto
Risposta da Fausto al topic ADS7835 SPI con PIC18F2550
Ecco il programma, spero che possa servire.

Code:
#include <p18f2550.h> #include <delays.h> #include <stdlib.h> #include <spi.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF #define CS LATBbits.LATB2 //CS #define CLK LATBbits.LATB1 //CLK #define SDO LATCbits.LATC7 //SDO /* OSC = HS set the oscillaor at high frequency WDT = OFF disabilito il wdt timer LVP = OxFF disable programming LVP PBADEN = disable analog input */ void settaggiSPI_ADS7835(void); int leggiSPI_ADS7835(void); void main (void) { int i=0; int lettura=0; //Setting I/O LATA=0x00; TRISA=0x00; LATB=0b00000000; // RB2 Chip Select=1 TRISB=0b00000001; // B0=1 SDI; B1=0 SCK; B2=0 Chip Select CS=1; LATC=0x00; TRISC=0x00; CloseSPI(); //Slave Select è nel Pin RB2 Output //SCK Pin RB1 Output (il pic è il master) //SDI pin RB0 è Input TRISBbits.TRISB2=0; //Chip Select TRISBbits.TRISB1=0; //SCK TRISBbits.TRISB0=1; //SDI while(1) { for(i=0;i<8;i++) { lettura+=leggiSPI_ADS7835(); } }lettura=(lettura>>3); } void settaggiSPI_ADS7835(void) { SSPSTATbits.SMP=1; SSPSTATbits.CKE=0; SSPCON1bits.CKP=0; //SSPCON1 SSPCON1=0b00000010;//FOSC/64 SSPCON1bits.SSPEN=1; //Enable SPI } int leggiSPI_ADS7835() { unsigned char data='J'; unsigned char LSB=0; unsigned char MSB=0; int lettura_singola=0; CS=0; putcSPI(data); while(!SSPSTATbits.BF); MSB=SSPBUF; putcSPI(data); while(!SSPSTATbits.BF); LSB=SSPBUF; CS=1; MSB&=0b00111111; LSB&=0b11111100; lettura_singola=(((int)MSB)<< 8)|LSB; lettura_singola=(lettura_singola>>2); Delay10TCYx(1000); }
Ultima Modifica 11 Anni 2 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.