Autor Tema: TX via SPI con dsPIC33fj32MC204  (Leído 4167 veces)

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

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
TX via SPI con dsPIC33fj32MC204
« en: 07 de Abril de 2009, 23:24:40 »
Hola, probando la transmisión y recepción utilizando SPI me encuentro con el siguiente inconveniente... Al transmitirle un dato a un PIC 18F4550 y almacenar el dato en una variable, lo almacena pero pareciera que lo hace con solo 7 bits. Por ejemplo: si envio 0x0F, en el 4550 tengo 000 1111 0, si envio 0x01, en el 4550 llega 0000 001 0... Siempre como si el bit menos significativo fuera el bit 2 y no el 1...

Mi configuración del módulo SPI es la siguiente:
Código: [Seleccionar]
SPI1STAT = 0x0;  // disable the SPI module (just in case)
SPI1CON1 = 0x0161; // FRAMEN = 0, SPIFSD = 0, DISSDO = 0, MODE16 = 0; SMP = 0; CKP = 1; CKE = 1; SSEN = 0; MSTEN = 1; SPRE = 0b000, PPRE = 0b01
SPI1STAT = 0x8000; // enable the SPI module

Vamos, que puede andar mal en este caso?... El programa en el 4550 es el siguiente

Código: [Seleccionar]
#use spi(DI=PIN_B0, DO=PIN_C7, CLK=PIN_B1, ENABLE=PIN_c0, BITS=8)


void main()
{
int value=0x00, aux= 0;
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   set_tris_d(0x00);
   set_tris_b(0xff);
   set_tris_a(0x00);
   set_tris_c(0x00);
      set_tris_E(0x01);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   // TODO: USER CODE!!
output_d(0x00);

while (1)
{
aux = spi_data_is_in();
if(aux == 1){
value = spi_read();
delay_us(50);
output_d(value);
}
}
}

De antemano gracias!!

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #1 en: 08 de Abril de 2009, 02:16:57 »
yo tuve el mismo problema, y era porque el modulo SPI del pic18 no estaba configurado de la misma manera,
en modo slave, según el datasheet del pic18, puede funcionar en ambos modos (no recuerdo bien cómo se llaman), pero
el compilador CCS no configuraba bien un modo, como solución tuve que usar el mismo que tienes tu, quizás cambiando
de modo en la configuración dsPIC (eso tuve que hacer yo)
te pego ahora cómo quedó:
Código: [Seleccionar]

 

SPI1CONbits.MSTEN=1;           //como maestro
SPI1CONbits.CKE=0; //Data cambia  en transiciσn activo a reposo el reloj (CLK)
SPI1CONbits.CKP=0;
SPI1CONbits.SPRE=0b000; //prescaler secundario 1
SPI1CONbits.PPRE=0b00; //prescaler primario 1
SPI1STATbits.SPIROV=0; //No receive overflow
SPI1STATbits.SPIEN=1;            //habilita el mσdulo SPI



los bits CKE y CKP son los que configuran los  modos de funcionamiento.

suerte!

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #2 en: 08 de Abril de 2009, 12:00:02 »
Efectivamente ese era el error (configuracion de CKE y CKP). Muchas gracias..!

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #3 en: 08 de Abril de 2009, 12:35:11 »
Yo quiero que el PIC18 envie datos al dsPIC y viceversa, como haria con la salida de reloj del 4550? hasta ahora solo puedo enviar y leer el buffer que supongo que es lo que hago al utilizar readSPI1(). En el programa del 4550 mando a recibir y luego enviar un dato distinto, pero en el dspic solo me muestra el dato que acaba de enviar porque aun se encuentra en el buffer.

Código: [Seleccionar]
output_d(0x00);

while (1)
{
aux = spi_data_is_in();
if(aux == 1){
value = spi_read();

delay_us(50);
output_d(value);

delay_us(50);
spi_write(0xff);
}
}
}

 Mi funcion para escribir es la siguiente:
Código: [Seleccionar]
int EscribirSPI(int data)
{
SPI1BUF=data;
while(!SPI1STATbits.SPIRBF){}
return ReadSPI1();
}

Y la utilizo así:
Código: [Seleccionar]
PORTA = EscribirSPI(0x55);
Y lo otro es asi:
Código: C
  1. int leerSPI()
  2. {      
  3.         int dato;      
  4.         while(!SPI1STATbits.SPIRBF){}
  5.         dato = SPI1BUF;
  6.         return dato;   
  7. }
Para leer... Pero de ninguna manera leo algun dato de vuelta...

Que problema me está dando esta comunicación.... Primera vez que la utilizo.
« Última modificación: 08 de Abril de 2009, 12:52:02 por mmX »

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #4 en: 08 de Abril de 2009, 14:47:05 »
cada vez que mandas un dato por spi, el slave responde con algo, siempre es así, pq es full duplex el protocolo.
yo para escribir, usé lo siguiente:

Código: [Seleccionar]

 int spi_out(int send)
{ /*envio por HW*/
SPI1BUF=send;
while(!SPI1STATbits.SPIRBF){}
return SPI1BUF;
}

yo no necesitaba recoger datos del slave, pero según entiendo, en spi1BUF ahora queda el dato recibido.

Creo que tienes el dsPIC como master, entonces según entiendo, el pic18F no puede iniciar una transmisión por su cuenta,
tiene que esperar que llegue un dato (y junto a él su respectivo clock) para comenzar a enviar simultáneamente el dato que hallas determinado.
La dificultad está (creo) en que antes que llegue el dato, ya tienes que tener determinado qué enviarás como respuesta.
saludos!

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #5 en: 08 de Abril de 2009, 15:10:33 »
Entiendo... Pero tengo una duda, el dspic posee dos lineas de reloj, una de entrada y una de salida, pero el pic18f4550 creo que solo posee una, que es la señal de reloj multiplexada con el de i2c, entonces  como hago para enviar y luego recibir si poseo una sola linea de reloj?

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #6 en: 08 de Abril de 2009, 16:55:10 »
dos lineas de reloj?
SPI tiene clock, data in, data out y SS.

A qué te refieres?

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #7 en: 09 de Abril de 2009, 00:14:38 »
te lo digo por lo que veo en el mapeo de pìnes del dspic...

SCK1OUT 01000 RPn tied to SPI1 Clock Output

SPI1 Clock Input SCK1 RPINR20 SCK1R<4:0>

 Paginas 123 y 124 del datasheet del dspic33fj32mc204

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #8 en: 09 de Abril de 2009, 11:12:20 »
no se  :oops:

lo que creo es que es sólo para configurar en qué pin dejarás el clock.

De hecho en la misma hoja de datos, en la sección del SPI, dice que tiene 4 lineas.

saludos!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #9 en: 09 de Abril de 2009, 13:03:45 »
Solo debe ser un pin ... si el pic es MAESTRO el clock es salida ... si el pic es ESCLAVO el clock es entrada.
Control Automático, DSP & Microcontroladores

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #10 en: 13 de Abril de 2009, 09:53:43 »
Hola, bueno sigo aún con este problema.... Envio un dato del dspic al pic18 y el pic 18 lo muestra en un puerto, luego mando a escribir un 0x00 desde el pic18 (esclavo) y sacarlo por un puerto del dspic, pero el dspic saca el buffer de transmisión, no se porque lo hace si el while lo dice así...  Aqui les cuelgo el código:

Esto es para el dspic-

Código: C
  1. void configurarSPI(void)
  2. {
  3.         RPINR20bits.SCK1R = 19;
  4.         RPINR20bits.SDI1R = 20;
  5.         RPINR21bits.SS1R = 21;
  6.     RPOR12bits.RP24R = 8; //SCK1
  7.     RPOR12bits.RP25R = 7; //SD01  
  8.         SPI1STAT = 0x0;  // disable the SPI module (just in case)
  9.         SPI1CON1 = 0x0161;      // FRAMEN = 0, SPIFSD = 0, DISSDO = 0, MODE16 = 0; SMP = 0; CKP = 1; CKE = 1; SSEN = 0; MSTEN = 1; SPRE = 0b000, PPRE = 0b01
  10.         SPI1CON1bits.CKE = 0;
  11.         SPI1CON1bits.CKP = 0;
  12.         SPI1STAT = 0x8000; // enable the SPI module
  13.     TRISC = 0x0FF;
  14.     TRISA = 0x000;
  15. }
  16.  
  17.  
  18. int EscribirSPI(int data)
  19. {              
  20.         SPI1BUF=data;
  21.         while(!SPI1STATbits.SPIRBF){}
  22.         PORTA = SPI1BUF;
  23.         return SPI1BUF;
  24. }

Esto para el pic18 (CCS PCWHD)-

Código: C
  1. void main()
  2. {
  3. int value=0x00, aux= 0;
  4.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  5.    setup_adc(ADC_OFF);
  6.    setup_psp(PSP_DISABLED);
  7.    setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_SS_DISABLED);
  8.    setup_wdt(WDT_OFF);
  9.    setup_timer_0(RTCC_INTERNAL);
  10.    set_tris_d(0x00);
  11.    set_tris_b(0x03);
  12.    set_tris_a(0x00);
  13.    set_tris_c(0x00);
  14.    set_tris_E(0x01);
  15.  
  16.    output_d(0x00);
  17.  
  18. while (1)
  19. {
  20. aux = spi_data_is_in();
  21. if(aux == 1){
  22. value = spi_read();
  23. delay_us(50);
  24. output_d(value);
  25. delay_us(50);
  26. spi_write(0x00);
  27.  
  28. }
  29.  
  30. }
  31. }

Espero alguien pueda ayudarme con este incidente.... Muchas gracias!

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #11 en: 13 de Abril de 2009, 10:57:23 »
Problema solucionado!
Código: C
  1. int EscribirSPI(int data)
  2. {              
  3.         SPI1BUF=data;
  4.         while(SPI1STATbits.SPITBF == 1){}
  5.         while(!SPI1STATbits.SPIRBF){}
  6.         return SPI1BUF;
  7. }

espere inicialmente que se vaciara el buffer al transmitir para preguntar por el buffer al recibir....

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: TX via SPI con dsPIC33fj32MC204
« Respuesta #12 en: 13 de Abril de 2009, 12:08:05 »
Nuevamente yo.... si que me ha dado lata este SPI.... Ahora sucede lo siguiente... Envio 1 Byte al PIC18, este lo analiza, envia una respuesta de 8 bits "supuestamente"... Luego el DsPIC toma estos 8 bits y los procesa y actualiza un registro y listo... El problema que se me da, es que si el PIC18 envia un BYTE, llega repetido al destino... Ejemplo_

spi_write(0x03);
//lo que llega al destino es 0000001100000011, y deberia llegar solo 00000011...

La configuracion del spi en el ccs es la siguiente:

Código: C++
  1. #use spi(DI=PIN_B0, DO=PIN_C7, CLK=PIN_B1, ENABLE=PIN_c0, BITS=8)
  2. setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_SS_DISABLED);

No se aqui como llegarle porque claramente escribo que la comunicacion es de 8 bits.