Autor Tema: Comunicacion SPI entre MCP3911 y PIC18F2580  (Leído 2092 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nacedo

  • PIC10
  • *
  • Mensajes: 2
Comunicacion SPI entre MCP3911 y PIC18F2580
« en: 26 de Abril de 2013, 11:57:47 »
Monte un circuito para trabajar con el periferico MCP3911, el que es un anologico/digital que se comunica via spi, pero cuando le envio algun comando desde el PIC al perifeico lo unico que recibo del integrado es ruido

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Comunicacion SPI entre MCP3911 y PIC18F2580
« Respuesta #1 en: 26 de Abril de 2013, 12:39:06 »
  No lo tomes a mal, tendrías que ser bastante más específico (como incluir el programa, mencionar el compilador con el que estás trabajando, incluir el esquema....), porque con lo poco que comentas pocos te van a poder ayudar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado nacedo

  • PIC10
  • *
  • Mensajes: 2
Re: Comunicacion SPI entre MCP3911 y PIC18F2580
« Respuesta #2 en: 29 de Abril de 2013, 12:33:53 »
  No lo tomes a mal, tendrías que ser bastante más específico (como incluir el programa, mencionar el compilador con el que estás trabajando, incluir el esquema....), porque con lo poco que comentas pocos te van a poder ayudar.



esta es la imagen del circuito, ademas comento que ya hice algunas pruebas y he confirmado que el puerto SPI realiza el diagrama de tiempo y he probado las diversas configuraciones del puerto SPI, lo que no logro comprobar es si el analogico digital esta funcionando, porque no puedo ver ninguna señal en los pines del integrado a parte de las que envio desde el puerto spi del pic además de la señal de reset desde el pic hasta el analogico digital, por lo demas aqui esta la mayor parte del codigo utilizado para la configuracion y manejo del puerto spi desde el pic

spi.h

/***************************************
cabecera del protocolo de comunicación
SPI

****************************************/

//Modos de Trabajo
//sync_mode
#define SPI_FOSC_4 0b00000000 // SPI Master mode, clock = Fosc/4
#define SPI_FOSC_16 0b00000001 // SPI Master mode, clock = Fosc/16
#define SPI_FOSC_64 0b00000010 // SPI Master mode, clock = Fosc/64
#define SPI_FOSC_TMR2 0b00000011 // SPI Master mode, clock = TMR2 output/2
#define SLV_SSON 0b00000100 // SPI Slave mode, /SS pin control enabled
#define SLV_SSOFF 0b00000101 // SPI Slave mode, /SS pin control disabled

//Modos de Trabajo del Bus
//bus_mode
#define MODE_00 0b00000000 // Setting for SPI bus Mode 0,0
//CKE 0x40 // SSPSTAT register
//CKP 0x00 // SSPCON1 register

#define MODE_01 0b00000001 // Setting for SPI bus Mode 0,1
//CKE 0x00 // SSPSTAT register
//CKP 0x00 // SSPCON1 register

#define MODE_10 0b00000010 // Setting for SPI bus Mode 1,0
//CKE 0x40 // SSPSTAT register
//CKP 0x10 // SSPCON1 register

#define MODE_11 0b00000011 // Setting for SPI bus Mode 1,1
//CKE 0x00 // SSPSTAT register
//CKP 0x10 // SSPCON1 register

//Modos de Trabajo Fase
//smp_phase
#define SMPEND 0b10000000 // Input data sample at end of data out
#define SMPMID 0b00000000 // Input data sample at middle of data out


/* SSPCON1 REGISTER */
#define SSPENB 0b00100000 // Enable serial port and configures SCK, SDO, SDI



unsigned char DataRdySPI(void);

//Operacion del Puerto
void CloseSPI(void);
void OpenSPI(unsigned char sync_mode,unsigned char bus_mode,unsigned char smp_phase);

//Funciones Lectura
unsigned char ReadSPI(void);
unsigned char getcSPI(void);
void getsSPI(unsigned char *rdptr, unsigned char length);

//Funciones Escritura
unsigned char WriteSPI(unsigned char data_out);
unsigned char putcSPI(unsigned char cx);
void pudsSPI(unsigned char *wrptr);


spi.c

#include   <pic18.h>
#include <sys.h>
#include <ctype.h>
#include <stdlib.h>   
#include   "spi.h"
#include   "config.h"


unsigned char DataRdySPI(void)
{
if (BF)
return ( +1 ); // data in SSP1BUF register
else
return ( 0 ); // no data in SSP1BUF register
}

//Funciones Operacion
void CloseSPI(void)
{
SSPCON1 &= 0xDF;
}

void OpenSPI(unsigned char sync_mode,unsigned char bus_mode,unsigned char smp_phase)
{
SSPSTAT &= 0x3F; // power on state
SSPCON1 = 0x00; // power on state
SSPCON1 |= sync_mode; // select serial mode
SSPSTAT |= smp_phase; // select data input sample phase

TRIS_SDI=1;
TRIS_SDO=0;   
TRIS_SCK=0;   
TRIS_SS=0;   
TRIS_DATAR=1;   
TRIS_RST=0;

switch( bus_mode )
{
case 0: // SPI bus mode 0,0
CKE = 1; // data transmitted on falling edge
break;
case 2: // SPI bus mode 1,0
CKE = 1; // data transmitted on rising edge
CKP = 1; // clock idle state high
break;
case 3: // SPI bus mode 1,1
CKP = 1; // clock idle state high
break;
default: // default SPI bus mode 0,1
break;
}

SSPCON1 |= SSPENB; // enable synchronous serial port
}


//Funciones Lectura
unsigned char ReadSPI(void)
{
unsigned char TempVar;
TempVar = SSPBUF; // Clear BF
SSPIF = 0; // Clear interrupt flag
SSPBUF = 0x00; // initiate bus cycle
//while ( !BF ); // wait until cycle complete
while(!SSPIF)continue; // wait until cycle complete
return SSPBUF; // return with byte read
}

unsigned char getcSPI(void)
{
SSPBUF = 0; // trigger 8 SCK pulses to shift in data
while(!BF)continue; // wait until the whole byte has been shifted in
return SSPBUF;    // return with byte read
}


void getsSPI(unsigned char *rdptr, unsigned char length)
{
while ( length ) // stay in loop until length = 0
{
*rdptr++=getcSPI(); // read a single byte
length--; // reduce string length count by 1
}
}

//Funciones Escritura
unsigned char WriteSPI(unsigned char data_out)
{
unsigned char TempVar;
TempVar = SSPBUF; // Clears BF
SSPIF = 0; // Clear interrupt flag
WCOL = 0;    //Clear any previous write collision
SSPBUF = data_out; // write byte to SSPBUF register
if ( SSPCON1 & 0x80 ) // test if write collision occurred
return ( -1 ); // if WCOL bit is set return negative #
else
//while( !BF ); // wait until bus cycle complete
while( !SSPIF )continue; // wait until bus cycle complete
return ( 0 ); // if WCOL bit is not set return non-negative#
}

unsigned char putcSPI(unsigned char cx)
{

if ( SSPCON1 & 0x80 ) // test if write collision occurred
{
return (-1);    // if WCOL bit is set return negative #
}
else
{
SSPBUF   = cx;
while( !BF )continue; // wait until bus cycle complete
}
return ( 0 );
}

void pudsSPI(unsigned char *wrptr)
{
while ( *wrptr ) // test for string null character
{
SSPBUF = *wrptr++; // initiate SPI bus cycle
while( !BF ); // wait until 'BF' bit is set
}
}

Archivo principal

// Archivos Header
#include   <pic18.h>
#include <sys.h>
#include <ctype.h>
#include <stdlib.h>
#include   <math.h>
#include   "spi.h"

static bit bMCP3911_DATAR   @((unsigned)&PORTB*8+0);
static bit bMCP3911_SCK    @((unsigned)&PORTC*8+3);
static bit bMCP3911_SDI    @((unsigned)&PORTC*8+4);
static bit bMCP3911_SDO   @((unsigned)&PORTC*8+5);
static bit bMCP3911_SS    @((unsigned)&PORTC*8+6);
static bit bMCP3911_RST    @((unsigned)&PORTC*8+7);

__CONFIG(1, HS & IESODIS & FCMDIS);
__CONFIG(2, PWRTDIS & WDTPS4K & WDTDIS & BOREN);
__CONFIG(4, XINSTDIS & STVREN & LVPDIS);

//SPI
bMCP3911_RST=0;
DelayMs(20);
bMCP3911_RST=1;
bMCP3911_SS=1;
SSPIE=0;
OpenSPI(SPI_FOSC_16, MODE_00, SMPMID);

//Primero
di();
bMCP3911_SS=0;

ResultadoSPI=putcSPI(0b00011010);

ResultadoSPI=putcSPI(0b11000100);

bMCP3911_SS=1;
ei();

//Segundo
di();

ResultadoSPI=putcSPI(0b00011010);

ResultadoSPI=putcSPI(0b00000100);

bMCP3911_SS=1;
ei();

//Tercero
di();   
bMCP3911_SS=0;

ResultadoSPI=putcSPI(0b00011011);

ResultadoSPI=getcSPI();

bMCP3911_SS=1;
ei();


 

anything