Autor Tema: dspic pic24 SPI  (Leído 8528 veces)

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

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
dspic pic24 SPI
« en: 18 de Enero de 2012, 05:59:38 »
Hola,

Estoy realizando un proyecto en el que controlo un sistema con un dsp (dsPIC33FJ128MC802) y monitoreo con un pic24 (pic24fj32GB002) enviando los datos al PC por usb. De esta forma despreocupo al dsp de tener que enviar la información de los sensores al pic24, ahorrando el tiempo que ésto conlleva y que me puede ser vital.

El problema es comunicar los dos dispositivos mediante spi para cuando desde el pc mande una orden al pic24 de tipo setpoint o cambio de valor de parametros del controlador. En fin, el SPI, no consigo hacerlo funcionar. Es un modulo con PPS, y me compila, el master funciona (veo en el osciloscopio los datos de sck y sdo), pero el slave no consigo hacer que reciba ningún dato.

Estoy programando en CCS, pues aun no aprendí C30. ¿Alguien lo ha hecho funcionar? Tengo el codigo algo perdido de hacer tantos cambios para poder hacerlo funcionar, en cuanto ordene las ideas lo cuelgo por si veis algo extraño.

Gracias y saludos!
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dspic pic24 SPI [ CCS ]
« Respuesta #1 en: 18 de Enero de 2012, 12:08:47 »
En CCS no puedo ayudarte, pero sería bueno que subas el código. Para recomendarte, puedes ir debugeando (MPLAB SIM) el código y determinando si los registros se configuran de forma correcta con las funciones que implementas en CCS.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #2 en: 20 de Enero de 2012, 05:36:25 »
Hola, aqui dejo el codigo para ver si alguien ve algo mal, ya que me sigue sin funcionar.

El codigo del master, el pic24, funciona a 32MHz con PLL (crystal=4MHz), es

Código: [Seleccionar]
#include <main.h>
#pin_select SDI1     = PIN_B7
#pin_select SDO1     = PIN_B8
#pin_select SCK1OUT   = PIN_B9

void main()
{


int8 enviar=4;
on(led);
   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_8 | SPI_XMIT_L_TO_H | SPI_MODE_8B );//16MHz
       
       
while(1)
{

     off(SS);
      cambio(led);
       spi_write(enviar);
        on(SS);
      enviar++;
      delay_ms(500);
 
  }
}

El slave, el dspic, funciona a 80MHz con PLL, crystal=4MHz y el codigo es

Código: [Seleccionar]
#include <DSP_SPI_f.h>
#include <flex_lcd.c>

#pin_select SDI1     = PIN_B7
#pin_select SDO1     = PIN_B8
#pin_select SCK1IN     = PIN_B9
#pin_select SS1IN    = PIN_B10


void main()
{
int8 recibido;
lcd_init();
on(led2);
setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_CLK_DIV_20 |SPI_XMIT_L_TO_H | SPI_MODE_8B);
on(led1);

printf(lcd_putc,"\fEsperando...");
   
while(true)
   {
   if(spi_data_is_in())
         {
         recibido=spi_read();
          printf(lcd_putc,"\fValor SPI=%u",recibido);
        cambia(led1);
   }
}

He pensado que el problema puede estar en usar PLL, pues consigo hacer andar el master (utilice el pic24 o el dspic para ello) pero el slave nunca me lee. No sé que podrá ser.

Gracias y saludos!!
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #3 en: 03 de Febrero de 2012, 07:18:46 »
Hola! Sigo sin hacer funcionar el SPI entre el pic24 y el dsp33...jajaja pesimo!

¿Alguien ha conseguido comunicar dos pic de 16 bits por SPI?  ¿Por software o por hardware? En caso afirmativo, ¿podria colgar el esquema y codigo sea CCS o C30?

Gracias! Ya deberia tener éste modulo terminado y estoy atrancado aqui jeje  :)
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dspic pic24 SPI
« Respuesta #4 en: 03 de Febrero de 2012, 09:53:31 »
Te paso el código de un esclavo dsPIC33:

Código: C
  1. int main(void){
  2.         unsigned int SPICON1Value,SPICON2Value,SPISTATValue,k;
  3.  
  4.                
  5.         // Configuramos PLL para trabajar a 40 MIPS con Cristal de 4MHz.-
  6.         PLLFBD = 0x004E; // M=80.
  7.         CLKDIV = 0x0000; //N1=2, N2=2. 
  8.         // Cambiamos clock para incroporar PLL.-
  9.         __builtin_write_OSCCONH(0b011); // Indicamos cambio a clock primario con PLL.-
  10.         __builtin_write_OSCCONL(0x01); // Iniciamos cambio.-
  11.         while(OSCCONbits.OSWEN == 1) {}; // Esperamos a que se termine el cambio de clock.
  12.                
  13.         AD1PCFGL=0xFFFF; // Todos los pines digitales.-
  14.  
  15.         // Habilitamos escritura sobre registros RPINRx y RPORX.
  16.         __builtin_write_OSCCONL(OSCCON & ~(0x40));
  17.         iPPSInput(IN_FN_PPS_SCK1,IN_PIN_PPS_RP5);               // Asignamos pin clock SCK1 a RP5.-
  18.         iPPSInput(IN_FN_PPS_SDI1,IN_PIN_PPS_RP6);               // Asignamos pin recepción SDI1 a RP6.-
  19.         iPPSInput(IN_FN_PPS_SS1,IN_PIN_PPS_RP7);                // Asignamos pin SS a RP7.-
  20.         iPPSOutput(OUT_PIN_PPS_RP4,OUT_FN_PPS_SDO1);    // Asignamos RP4 al pin de transmisión SDO.-
  21.        
  22.         // Bloqueamos escritura sobre registros RPINRx y RPORX.
  23.         __builtin_write_OSCCONL(OSCCON |0x40);
  24.        
  25.         /* Turn off SPI modules */
  26.         CloseSPI1();    //Disbale SPI1 mdolue if enabled previously
  27.  
  28.         //***************** SPI1 configuration (CKE=0, CKP=1) ******************************************************
  29.         SPICON1Value = SPI_MODE16_OFF & SPI_CKE_OFF & SPI_SMP_OFF & CLK_POL_ACTIVE_LOW & ENABLE_SDO_PIN & SLAVE_ENABLE_ON & MASTER_ENABLE_OFF;
  30.         SPICON2Value = FRAME_ENABLE_OFF;
  31.         SPISTATValue = SPI_ENABLE ;
  32.         OpenSPI1(SPICON1Value,SPICON2Value,SPISTATValue );
  33.        
  34.         //************ SPI interrupt configuration *****************************
  35.     ConfigIntSPI1(SPI_INT_EN | SPI_INT_PRI_1); //slave with priority 1
  36. }

Código: C
  1. void __attribute__((__interrupt__,no_auto_psv)) _SPI1Interrupt(void){
  2.         unsigned char Temp,nBytesWrite,*Data;
  3.         unsigned int k;
  4.        
  5.        
  6.         while(DataRdySPI1()==0); // Esperamos a recibir dato
  7.         Temp=ReadSPI1();
  8.         if(Temp==MCU33_READ){
  9.                 nBytesWrite=0;
  10.                 do{
  11.                         WriteSPI1(*PtrSamples--);
  12.                         while(DataRdySPI1()==0);
  13.                         Temp=ReadSPI1();       
  14.                         nBytesWrite++;
  15.                         CntData++;
  16.                 }while(nBytesWrite<64);
  17.         }else if(Temp==MCU33_WRITE){
  18.                 Data=&SampleParameters.Data[0];        
  19.                 for(k=0;k<16;k++){
  20.                         while(DataRdySPI1()==0); // Esperamos a recibir dato
  21.                         *Data++=ReadSPI1();
  22.                 }
  23.                 kbhit_Samples=1;               
  24.         }
  25.  
  26.         _SPI1IF = 0; //Borramos flag.
  27. }


Y esta sería la configuración para el master:

Código: C
  1. //***************** SPI2 configuration (CKE=0, CKP=1) ******************************************************
  2.         SPICON1Value = SPI_MODE16_OFF & SPI_CKE_OFF & SPI_SMP_OFF & CLK_POL_ACTIVE_LOW & ENABLE_SCK_PIN & ENABLE_SDO_PIN & MASTER_ENABLE_ON & SEC_PRESCAL_3_1 & PRI_PRESCAL_1_1;
  3.         SPICON2Value = FRAME_ENABLE_OFF;
  4.         SPISTATValue = SPI_ENABLE ;
  5.         OpenSPI2(SPICON1Value,SPICON2Value,SPISTATValue );


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #5 en: 13 de Febrero de 2012, 09:23:46 »
Hola,

siento reabrir el tema, pero deje el proyecto aparcado y ahora vuelvo a trabajar con él y me encuentro sin salida. Sigo consiguiendo con cualquier micro (pic24, dspic33 y pic18) hacerlos funcionar como MASTER, pero el SLAVE (pic24 y dspic33) nunca reciben los datos. He probado ya todo, incluso trabajar directamente con registros, fijandome en el codigo de Suky, pero nada.

Antes de darme por vencido quiero saber que es lo que falla, y teniendo en cuenta que ambos micros funcionan correctamente como master pero no como slave, no creo que sea la configuracion de los pines PPS (o quizás si). Podría ser la frecuencia de trabajo, pero tampoco creo, porque los he puesto a los dos a 4MHz con su crystal, y nada. Si alguien tiene alguna idea será bienvenida. Y si tiene un codigo que funcione en CCS.... :-/ :D
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #6 en: 14 de Febrero de 2012, 08:38:09 »
¿Existen pines PPS para entradas y otros para salidas?
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado xsagas

  • PIC10
  • *
  • Mensajes: 9
Re: dspic pic24 SPI
« Respuesta #7 en: 13 de Abril de 2012, 19:43:36 »
hola; marqueses creo que tu problema radica en que tienes los dispositivos funcionando a distintas velocidades
32Mhz y 80Mhz. por experiencia yo he programado en ccs master y slave a la misma frecuencia y me ha funcionado.
revisa, de todas voy a buscar los codigos  para un 18f y dspic30f y los publicare

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: dspic pic24 SPI
« Respuesta #8 en: 13 de Abril de 2012, 20:14:19 »
hola; marqueses creo que tu problema radica en que tienes los dispositivos funcionando a distintas velocidades
32Mhz y 80Mhz. por experiencia yo he programado en ccs master y slave a la misma frecuencia y me ha funcionado.
revisa, de todas voy a buscar los codigos  para un 18f y dspic30f y los publicare


No tiene sentido que sea ese el problema... El master fija la frecuencia y el slave en base a esa frecuencia trabaja. Yo por ejemplo he realizado un PIC18 a 12 MIPS y un dsPIC a 40 MIPS  :undecided:
No contesto mensajes privados, las consultas en el foro

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dspic pic24 SPI
« Respuesta #9 en: 14 de Abril de 2012, 02:48:14 »
hola, veo que tu codigo de envio lo tienes de la siguiente forma:

off(SS);
      cambio(led);
       spi_write(enviar);
        on(SS);

prueba colocandole un pequeño retardo despues de enviar los datos, asi:

off(SS);   // SS=0 dspic esclavo activo
      cambio(led);
       spi_write(enviar);
      delay_us(20);
        on(SS);

esto para asegurarte que el esclavo recibio todo el byte y luego despues poner el CS=1.

saludos
control de movimiento

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #10 en: 14 de Abril de 2012, 10:04:40 »
Hola,

ya solucioné el problema. Bueno, me explico mejor. He conseguido hacer comunicar ambos micros, pero no sé la solucion del problema.
La cosa es que el DSP algunos pines funcionan y otros no.  No sé si es problema del DSP o del compilador (CCS).

Incluso hicimos una prueba de colocar todos los pines del puerto B a "1" y algunos se mantenían a "0", por lo que nos parece algo místico jajajaja, en serio, me parece que es algo que no tiene sentido, o el compilador no traduce bien el codigo (y no es nuevo que CCS tenga bugs) o se hace un lio con la configuracion del puerto y lo pines PPS....a saber cual es el problema.

En fin, la solución, probar pin por pin cual funciona hasta que se establezca comunicación. Si estáis interesados coloco el código.

PD: Hemos realizado la prueba con dos placas distintas y el mismo micro (dsp33fj128mc802) y obtenemos los mismos resultados, así que el error hardware queda casi descartado.
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: dspic pic24 SPI
« Respuesta #11 en: 14 de Abril de 2012, 14:48:51 »
Solo para responder tu pregunta


Citar
¿Existen pines PPS para entradas y otros para salidas?

Si, en el PIC24FJ256DA210, en el cual trabajo,  hay unos que son solamente entradas, los RPIxx, y otros que son I/O, RPxx.

Saludos.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: dspic pic24 SPI
« Respuesta #12 en: 14 de Abril de 2012, 20:16:12 »
Muchos pines son de utilidades, o de algun modulo, para ello te miras el datasheet y ahi ves cada pin las funciones que pueden tomar. Si por ejemplo tenemos activo el ADC y algun pin del portb esta siendo usado por este modulo, aunque pongamos =1 o =0 este no cambiara de estado. Esto suele pasar mucho en CCS, al crear un proyecto en el wizard vas configurando los puertos, modulos y demas, si no hemos echado mucha cuenta puede que se nos haya colado algo por ahi.

Desconectado marqueses

  • PIC12
  • **
  • Mensajes: 80
    • Alberto Marqueses Blog
Re: dspic pic24 SPI
« Respuesta #13 en: 17 de Abril de 2012, 04:41:34 »
Hola,

Vtronic: Con los micros que yo trabajo (PIC24FJ64GB002 y DSPIC33FJ128MC802) en el datasheet solo aparecen RPxx. Supongo que la opción de RPIxx solo aparece con micros con mas patillaje como el que usas.

MerLiNz: He cambiado la configuración de todos los pines, he probado con el wizard, con standard_io, fixed_io y todas las que me conozco... y nada.

Aun así, sigo pensando que ha de ser problema del compilador, pues no creo que dos micros tengan el mismo error hardware en los mismos pines, incluso de repasar soldaduras. En fin, seguiré trabajando y postearé los resultados por si ha alguien se le presenta el mismo error.
Alberto Aragón Marqueses
albertomarqueses.wordpress.com

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: dspic pic24 SPI
« Respuesta #14 en: 17 de Abril de 2012, 11:39:12 »
que pines exactamente no te respondian?



 

anything