Autor Tema: Modulo SPI con dsPIC  (Leído 6799 veces)

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

Desconectado javilon

  • PIC10
  • *
  • Mensajes: 10
Modulo SPI con dsPIC
« en: 02 de Julio de 2008, 10:03:39 »
Hola a todos!!

estoy intentando conectar una memoria via SPI a un dsPIC (en concreto estoy haciendo pruebas con el dsPIC33FJ32MC202), pero parece que soy incapaz de configurar correctamente el módulo SPI, vamos, que no me funciona :'(


La configuracion de los registros es la siguiente:

Código: [Seleccionar]
SPI1CON1 = 0000 0101 0010 0000
SPI1CON2 = 0
SPI1STAT = 0x8000

Y supongo que asigno bien los pines ya que esto, hasta ahora, siempre me ha funcionado... las patitas que asigno son:

Código: [Seleccionar]
SCK1OUT (el clock de salida)
SDO1 (salida, hacia la SDI del periférico)
SDI1 (entrada, del SDO del periférico)
un chip select

Y ahora va el problema, desistiendo de la memória, estoy haciendo pruebas con un potenciómetro digital (periférico más sencillito) con el siguiente código:

Código: [Seleccionar]

while(1){
     PORTBbits.RB6 = 0; //el chip select

     putcSPI1(0b0000000000000000); //poner el potenciómetro al mínimo
     while(SPI1STATbits.SPITBF);
     while(!DataRdySPI1());
     x = ReadSPI1();

     PORTBbits.RB6=1;
}

con un resultado nefasto...

las pruebas que he hecho son las siguientes:

1) Mirar la tension de la patita SCK1OUT. Está a 0V todo el tiempo, mucho me temo que aquí es donde está el problema, que no me sabe sacar el clock.

2) Poner la patita SDI del micro a VCC. En el registro SPI1BUF lee 0xFFFF así que de leer, sabe.

3) Coger el potenciómetro asecas, le pongo su SDI a VSS y hago yo de clock. Le meto los 16 "0" y bien que me pone el potenciómetro al mínimo, así que supongamos que el comando es correcto.


Este es todo mi problema :'(. Lo que mas sospecho es que soy incapaz de configurar el módulo SPI y que debe haber algo que se me escapa...

Espero que me podais ayudar.
Muchas gracias a todos!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Modulo SPI con dsPIC
« Respuesta #1 en: 02 de Julio de 2008, 13:18:51 »
No veo errores en la configuración, siempre que la sintaxis de esto sea correcta y no tal y como está escrito: SPI1CON1 = 0000 0101 0010 0000

¿Cuál es el pote digital que intentas usar?, quizás requiera de más condiciones para funcionar.

Y por cierto, con el polímetro no verás ningún cambio en CLK; va muy rápido para que lo puedas ver.

Desconectado javilon

  • PIC10
  • *
  • Mensajes: 10
Re: Modulo SPI con dsPIC
« Respuesta #2 en: 02 de Julio de 2008, 15:42:40 »
Citar
No veo errores en la configuración, siempre que la sintaxis de esto sea correcta y no tal y como está escrito: SPI1CON1 = 0000 0101 0010 0000

Claro, la sintaxi es la correcta en C. Lo puse así para que fuera algo más facil de leer  :mrgreen:

Citar
¿Cuál es el pote digital que intentas usar?, quizás requiera de más condiciones para funcionar.

Es el MCP4251 es un doble potenciometro que funciona por SPI. La verdad es que es muy sencillote, si ya te digo que lo hice funcionar manualmente...  :D

El pin de SHDN* (Shutdown) lo tengo correctamente conectado (a Vcc)

Primero probé de hacer funciona la EEPROM (25AA020A), pero como no me funcionó, pense que era porque no sabia manejar la memoria, por eso probé con un dispositivo más sencillo que tenia a mano. Pero por lo que parece, es el SPI el que no se hacer funcionar.

Citar
Y por cierto, con el polímetro no verás ningún cambio en CLK; va muy rápido para que lo puedas ver.

gracias por el consejo!! ya no me mataré mas en enchufarle el polimetro, aunque yo esperaba que me marcara la mitad del voltaje o algo así... en fin, desistiré de mirar el CLK con él ;) .


También probé de usar el "Visual Initializer", con el que en principio debe ser más facil configurarlo, sobretodo por el tema de las funciones multiplexadas en los pines, aunque no tenga mucho misterio. La verdad es que llevo un par de dias dándole vueltas y no veo porque no funciona :'(

Muchas gracias!!
« Última modificación: 02 de Julio de 2008, 15:44:54 por javilon »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Modulo SPI con dsPIC
« Respuesta #3 en: 04 de Julio de 2008, 00:08:17 »
Bueno este es mi codigo en un dsPIC33FJ256MC710

Reeeecuerdo que no me funcionaba y me fue muy dificil configurarlo ... la clave está en borrar el registro SPI1STATbits.SPIROV pues si este esta activo el SPI no funciona ... creo  :lol: :lol:

Se los dejo de ejemplo ..

Código: [Seleccionar]
void IOSPI1CommW( INT8U puerto, INT16U* dato, INT16U* dato_salida)
{
IOSPI1Mode16( );                           /* Establece envio de 16bits */

IFS0bits.SPI1IF = 0; /* Borrar fin de TX/RX*/

SPI1STATbits.SPIROV = 0; /* Leer buffer para reset */

SPI1BUF = *dato; /* Comenzar transmision */

while( !IFS0bits.SPI1IF );

SPI1STATbits.SPIROV = 0; /* Leer dato */

*(dato_salida) = SPI1BUF;

IFS0bits.SPI1IF = 0; /* Borrar fin de TX/RX*/
}


Control Automático, DSP & Microcontroladores

Desconectado javilon

  • PIC10
  • *
  • Mensajes: 10
Re: Modulo SPI con dsPIC
« Respuesta #4 en: 12 de Julio de 2008, 11:26:13 »
Muchísimas gracias!! Ahora ya funciona!!! Vaya pijadita lo del SPIROV...

Hasta hoy no lo he podido probar pero ahora casi lloro de la emocion, jejejeje. Muchas gracias de nuevo.


Por cierto, si meto el multímetro en la patita del clock, me marca la mitad del voltaje (algo lógico según el funcionamiento del PWM) ;)

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Modulo SPI con dsPIC
« Respuesta #5 en: 12 de Julio de 2008, 14:06:13 »
hola, por si quisieras probar, yo hago lo siguiente:

Código: C
  1. int spi_out(int send)
  2. {
  3.         SPI1BUF=send;
  4.         while(!SPI1STATbits.SPIRBF){}
  5.         return SPI1BUF;
  6. }

y me funciona bien. (hasta el momento)

Desconectado javilon

  • PIC10
  • *
  • Mensajes: 10
Re: Modulo SPI con dsPIC
« Respuesta #6 en: 12 de Julio de 2008, 17:57:14 »
vtasco: he probado tu código y no me funciona. Se me queda "clavado" en el while. ¿Qué configuracion usas?

el que uso ahora es:

Código: [Seleccionar]
unsigned int EscribirSPI(unsigned int data)
{

WriteSPI1(data);
while(!DataRdySPI1());
return ReadSPI1();

}

He descubierto que el ReadSPI ya lleva incluido la desactivacion del SPIROV.


Pero ahora tengo otro problema :'(.  Con las pruebas que estoy haciendo, he conseguido escribir y modificar registros de los periféricos (estoy probando con el potenciómetro y el expansor MCP23S17), pero no me permite leer!!

Lo que hago es enviar cualquier cosa por el puerto para generar el clock y que el periférico me de su dato, pero no me funciona. En la variable leo 0x00. Pero lo mas raro de todo es que si clavo la SDI del micro a alimentación bien que me lee 0xFF!! Eso es lo que menos entiendo de todo...

Hay algun otro truco aqui?? Porque, en principio, la función me deberia devolver lo que da el periférico... no lo entiendo...
« Última modificación: 12 de Julio de 2008, 18:03:00 por javilon »

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Modulo SPI con dsPIC
« Respuesta #7 en: 12 de Julio de 2008, 18:43:08 »
Código: C
  1. esta es la configuracion que uso, no estoy usando interrupciones.
  2. suerte!
  3.  
  4. void spi_init_master(void)
  5. {
  6.  
  7.        
  8.        
  9.         SPI1STATbits.SPIEN=0;   //deshabilita el módulo SPI
  10.         IFS0bits.SPI1IF=0;              //limpia la bandera de interupción
  11.         IEC0bits.SPI1IE=0;              //deshabilita la interrupción del módulo
  12.         IPC2bits.SPI1IP=0x2;    //prioridad de interrupcion Nº2 (ADC tiene 4)
  13.         SPI1CONbits.MSTEN=1;    //como maestro
  14.         SPI1CONbits.CKE=1;              //Data cambia  en transición activo a reposo el reloj (CLK)
  15.         SPI1CONbits.SPRE=0b000; //prescaler secundario 1
  16.         SPI1CONbits.PPRE=0b01;  //prescaler primario 1
  17.         SPI1STATbits.SPIROV=0;  //No receive overflow
  18.         SPI1STATbits.SPIEN=1;   //habilita el módulo SPI
  19. }

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Modulo SPI con dsPIC
« Respuesta #8 en: 12 de Julio de 2008, 21:47:28 »
SI yo tambien casi lloro cuando me toco implementarlo  :g) :D

Control Automático, DSP & Microcontroladores

Desconectado javilon

  • PIC10
  • *
  • Mensajes: 10
Re: Modulo SPI con dsPIC
« Respuesta #9 en: 13 de Julio de 2008, 07:30:50 »
Buenas a todos!!

Informaros que ya me funciona. :-/ El problema estaba en la alimentacion del expansor de puertos.

Algo un tanto extraño, en principio puede alimentarse desde 2,7 a 5,5 V segun el datasheet, así que yo lo alimentaba a 3,3V al igual que el PIC. Y, cuando se me ha ocurrido alimentarlo a 5V, ha funcionado!!

Un tanto extraño... ya estaba al borde del suicidio  :D


Muchas gracias a todos!!!

Edito: Ahora me asalta otra duda: mi objetivo final es comunicar a un dsPIC maestro con un dsPIC esclavo + una EEPROM + el expansor de puertos. La EEPROM y el expansor los puedo alimentar a 5V, pero el dsPIC no. Mi pregunta es si funcionará o tengo que colocar algun buffer intermedio. Gracias!.
« Última modificación: 13 de Julio de 2008, 08:10:47 por javilon »

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Modulo SPI con dsPIC
« Respuesta #10 en: 13 de Julio de 2008, 22:30:46 »
Yo creo que podrías poner un buffer CMOS alimentado a 3V3 para adaptar los niveles.

Suerte!

P.S.: Yo estuve sufriendo casi una semana con este asuntito, necesitaba comunicar un dsPIC con un PIC18F4550, el problema era que el CCS no admite directamente todos los modos SPI, así que tuve que cambiar la configuración en el dsPIC, y comunicar unos PGA con un SPI hecho por software.  :?

En fin, que bien que te funcione