Autor Tema: Problema con configuración de SPI en C30  (Leído 3816 veces)

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

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Problema con configuración de SPI en C30
« en: 27 de Junio de 2012, 17:41:00 »
Buenas, estoy tratando de hacer un ejemplo simple de algo por SPI y el dspic33fj32mc204, pero tengo un problema, cuando lo ejecuto en proteus me sale los errores que estan en la imagen.

#include<p33fj32mc204.h>
#include<spi.h>

void main()
{
   unsigned int SPI1CON1Value;
   unsigned int SPI1CON2Value;
   unsigned int SPI1STATValue;

   //Configuración de pines del SPI
   TRISC=0x0200;//configuración de SDI como entrada y el resto como salida
   RPINR20=0x1F19;//configuración del pin RP25 como SDI
   RPOR12=0x0007;//configuración del pin RP24 como SDO
   RPOR11=0x0809;//configuración del pin RP23 como SCK Y DEL PIN RP22 como SS
   
   SPI1CON1Value=ENABLE_SCK_PIN &
            ENABLE_SDO_PIN &
            SPI_MODE16_OFF &
            SPI_SMP_OFF &
            SPI_CKE_OFF &
            SLAVE_ENABLE_OFF &
            CLK_POL_ACTIVE_HIGH &
            MASTER_ENABLE_ON &
            SEC_PRESCAL_1_1 &
            PRI_PRESCAL_4_1;

   SPI1CON2Value=FRAME_ENABLE_OFF &
            FRAME_SYNC_OUTPUT &
            FRAME_POL_ACTIVE_HIGH &
            FRAME_SYNC_EDGE_COINCIDE;

   SPI1STATValue=SPI_ENABLE &
            SPI_IDLE_CON &
            SPI_RX_OVFLOW_CLR;

   OpenSPI1(SPI1CON1Value, SPI1CON2Value, SPI1STATValue);


   WriteSPI1(0x3F);


   while(1);


}

Espero que alguien me pueda ayudar o decir porque esta mal.





Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con configuración de SPI en C30
« Respuesta #1 en: 27 de Junio de 2012, 18:51:09 »
Proteus será el problema?  :mrgreen: Mejor prueba en hardware  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: Problema con configuración de SPI en C30
« Respuesta #2 en: 27 de Junio de 2012, 20:35:11 »
Lo malo que en hardward no hay un SPI virtual, ya que solo estoy implementando el maestro, y al SPI de proteus lo coloco como esclavo.
Ejecute el programa en proteus en modo debug, para ver a que se referia eso. y vi que cuando se ejecutaba la instruccion de OpenSPI1, aparecia el número 0x3FFF que me da proteus en la direccion de memoria 0x0002, segun el datasheet ese registro es un registro de trabajo(WREG1).


Adjunto la imagen del debug.


Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: Problema con configuración de SPI en C30
« Respuesta #3 en: 28 de Junio de 2012, 17:42:42 »
Ya he solucionado parte del problema, configurando de frente los registros.

Maestro:

Código: [Seleccionar]
#include<p33fj32mc204.h>
#include<spi.h>


#define LED PORTCbits.RC0
#define BOTON PORTCbits.RC1
#define SELECTOR PORTCbits.RC6

void main()
{ SELECTOR=0;
//Configuración de pines del SPI
CLKDIVbits.DOZE=0x0000;//Fcy=Fosc/2
TRISC=0x0202;//configuración de SDI como entrada, RC1 como entrada para boton y el resto como salida
RPINR20=0x1F19;//configuración del pin RP25 como SDI
RPOR12=0x0007;//configuración del pin RP24 como SDO
RPOR11=0x0800;//configuración del pin RP23 como SCK Y *****************DEL PIN RP22 como SS

while(BOTON==0);

IFS0bits.SPI1IF=0;//desactivamos el flag de interrupción

SPI1CON1bits.PPRE=10;//preescaler primario 4:1
SPI1CON1bits.SPRE=111;//preescaler secundario 1:1
//Con los preescaler, para un Cristal de 20MHz, Fcy=20Mhz/2=10Mhz, Fsck=Fcy/(PP*PS)=10Mhz/(4*1)=2.5MHz
SPI1CON1bits.MSTEN=1;//modo maestro
SPI1CON1bits.CKP=0;//polarizacion, descanzo bajo y activo alto
SPI1CON1bits.SSEN=0;//uso SS de cualquier puerto que desee
SPI1CON1bits.CKE=0;//activacion de cambios en flanco de subida
SPI1CON1bits.SMP=0;//data es muestreada a la mitad de la recepcion o transmision
SPI1CON1bits.MODE16=1;//transmision de 16 bits
SPI1CON1bits.DISSDO=0;//pin SDO controlado por el modulo
SPI1CON1bits.DISSCK=0;//Internal reloj SPI es habilitado


SPI1STATbits.SPIROV=0;//limpiando el indicador de buffer lleno
SPI1STATbits.SPIEN=1;//habilitamos el modulo SPI


SPI1BUF=0x7777;
while(!SPI1STATbits.SPIRBF);

SELECTOR=1;

while(1);


}


Además estoy intentando comunicarme con otro dspic del mismo código:

Esclavo:

Código: [Seleccionar]

#include<p33fj32mc204.h>
#include<spi.h>

#define LED PORTCbits.RC0
void main()
{
unsigned int almacen=0;
//Configuración de pines del SPI
CLKDIVbits.DOZE=0x0000;//Fcy=Fosc/2
TRISC=0x02C0;//configuración de SDI, SCK Y SS como entrada , el resto como salida
RPINR20=0x1719;//configuración del pin RP25 como SDI ***y SCK EN RP23 como entrada
RPINR21=0x0016;//configuracion del pin SS EN RP22 como entrada
RPOR12=0x0007;//configuración del pin RP24 como SDO como salida


IFS0bits.SPI1IF=0;//desactivamos el flag de interrupción

//Con los preescaler, para un Cristal de 20MHz, Fcy=20Mhz/2=10Mhz, Fsck=Fcy/(PP*PS)=10Mhz/(4*1)=2.5MHz
SPI1CON1bits.MSTEN=0;//modo esclavo
SPI1CON1bits.CKP=0;//polarizacion, descanzo bajo y activo alto
SPI1CON1bits.SSEN=1;//uso SS de cualquier puerto que desee
SPI1CON1bits.CKE=0;//activacion de cambios en flanco de subida
SPI1CON1bits.SMP=0;//data es muestreada a la mitad de la recepcion o transmision
SPI1CON1bits.MODE16=1;//transmision de 16 bits
SPI1CON1bits.DISSDO=0;//pin SDO controlado por el modulo
SPI1CON1bits.DISSCK=1;//Internal reloj SPI es habilitado

SPI1CON2 = 0x0000;//desabilito el frame de clk

SPI1STATbits.SPIEN=1;//habilitamos el modulo SPI
SPI1STATbits.SPIROV=0;//limpiando el indicador de buffer lleno


         

  SPI1BUF = 0x0000;                 

  while(!SPI1STATbits.SPIRBF);

  if (SPI1STATbits.SPIRBF)
  {
      SPI1STATbits.SPIROV = 0;     
      almacen=SPI1BUF;
  }

  LED=1;


while(1);


}


El maestro cuando presiona un boton, le envia 0x7777 al otro dspic, como se ve en la imagen de proteus tengo un virtual SPI, donde lo pongo como monitor, y cuando lo ejecuto, se ve que en el virtual SPI, aparece que realmente si se esta enviando la data. Pero parece que el esclavo no logra leer la información, ya he revisado el registro SPI1BUF en el esclavo, pero no cambia nada cuando supuestamente le llega la información del master.

Mi problema es que el esclavo solo se queda hasta la instrucción while(!SPI1STATbits.SPIRBF); en ningún momento se activa el bit, para que pase al resto de instrucciones y prender el led.


alguien me pueda ayudar?



 

anything