TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: jfmateos2 en 13 de Febrero de 2011, 12:34:01

Título: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 13 de Febrero de 2011, 12:34:01
Hola,
Tengo una placa con un pic que comunica por SPI con un enc28j60 y con otro chip esclavo.

El ENC28j60 funciona, pero el otro esclavo no.

Me ha dado por mirar las señales del puerto SPI con el osciloscopio y he visto que la señal SCK y MOSI tienen un nivel de 3.3V, pero la MISO tiene un nivel de apenas 50mV, tanto cuando comunico con el ENC28J60 como cuando lo hago con el otro esclavo.

¿Saben si esto es normal? ¿O tendría que tener también un nivel de 3.3V en MISO?

Muchas gracias por la atención.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: Nocturno en 13 de Febrero de 2011, 12:43:44
¿Será que alguno de ellos te está pisando la señal hacia masa?
Puedes probar anulando la configuración del SPI y haciendo output_high() en el pin correspondiente a MISO para ver si levanta o alguien le tiene cogido por el cuello..
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: migsantiago en 13 de Febrero de 2011, 12:50:45
A mi pasó algo parecido, la señal SPI se deformaba, se achataba. Bastó con desconectar el pin PGD o PGC del PICkit3 y la señal se encuadró como debió ser. Checa que en paralelo no haya nada que pueda deformarla.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 13 de Febrero de 2011, 12:59:49
Gracias nocturno... el pin sube sin problemas a 3V cuando deshabilito el SPI y lo pongo en HIGH.

Gracias MIG, no tengo nada más en los pines de comunicación SPI (los he direccionado con PPS a unos pines que no usaba para nada).

Voy a probar a quitar una resistencia de 150R que tengo en la línea MISO, y que puse porque leí algo de que no venía mal para el ENC28J60 ponerla en SCK y en MOSI, pero que por error he metido también en la MISO.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: Suky en 13 de Febrero de 2011, 13:05:48
El pin SDO queda en alta impedancia mientras el dispositivo no este seleccionado mediante CS, cuando se lo selecciona y envía clock colocará en el pin el nivel lógico que le corresponda según datasheet.


El otro dispositivo, cual es?

Saludos!
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: migsantiago en 13 de Febrero de 2011, 13:05:59
No sé qué PIC estés usando, pero los dsPIC33 dan poquísima corriente en sus pines: 4mA. Los demás PICs dan hasta 25mA.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 13 de Febrero de 2011, 13:18:07
He cambiado la resistencia por una de 0R y sigue  igual.

Doy por hecho que la señal en MISO debería ser de 3.3V ¿no? Por favor, confírmenme esto. Porque, como les digo, el ENC28j60 funciona.

El otro chip es un cc1101 y su CS está en alto... pero incluso desoldando este chip de la placa, en la comunicación con el ENC28j60 la tensión de MISO sigue siendo 20mV... pero funciona.

Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: Suky en 13 de Febrero de 2011, 13:22:03
Doy por hecho que la señal en MISO debería ser de 3.3V ¿no? Por favor, confírmenme esto. Porque, como les digo, el ENC28j60 funciona.

Entiendo que no. Cuando transfiera datos desde el ENC al PIC, colocará el nivel lógico que corresponda en cada ciclo de reloj y después alta impedancia.

Por ejemplo página 29 del datasheet del ENC.


Ahora, cuando se hace de PIC a ENC, al realizar read() que valor colocas para enviar? Y sin generación de clock es alta impedancia.


Saludos!
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 14 de Febrero de 2011, 05:33:32
Vaya, creo que entonces no he entendido cómo funciona la comunicación SPI.

Yo creía que el maestro siempre controlaba el reloj SCK, tanto en las operaciones de lectura como en las de escritura y que en cada ciclo de SCK ocurrían dos cosas:

* El maestro pone un bit en el MOSI (que está configurado como salida en el maestro) para que el esclavo lo recoja.
* El esclavo pone a la vez un bit en el MISO (que está configurado como entrada en el maestro) para que el maestro lo recoja.

Por este motivo yo esperaba obtener en MISO una señal de 3.3V.

¿No funciona así el SPI?
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: AngelGris en 14 de Febrero de 2011, 09:37:17
  En uno de los mensajes mencionás que la tensión en el pin MISO (me imagino será MasterImputSlaveOutput) es de 20mV pero funciona igual. Lo que yo no entiendo es como hace el PIC para interpretar un nivel tan bajo como si fuera un 1 lógico.

  ¿Estás midiendo siempre con la misma punta y siempre en el mismo canal del osciloscopio?

  Sería bueno que subas el circuito para ver si alguien detecta algo que se te esté pasando por alto.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 15 de Febrero de 2011, 03:43:46
De momento no dispongo de otro osciloscopio, y el  que estoy usando es el Velleman portátil de un sólo canal.
El finde probaré con mi otro osciloscopio.

Entretanto me he implementado las rutinas del SPI por software y he conseguido comunicarme bien con el CC1101, antes estaba usando el SPI por hardware.

Sospecho que el problema puede estar en la asignación que he hecho de los pins mediante PPS o, más probablemente, en que los PIC usan unos modos de comunicación SPI (modo00, modo01, ...) que no coinciden con los modos estándar de  la norma SPI...

Seguiré informando.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 15 de Febrero de 2011, 06:47:32
He encontrado este documento de microchip en el que se explica con claridad el asunto de los modos SPI: http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf
Especialmente interesante es la página 25, en la que se establece la relación entre los modos estándar de SPI y el nombre que les ha dado Microchip en su lenguaje.

Y cruzándolo con esta nota de aplicación de los cc1101 de TI: http://focus.ti.com/lit/an/swra112b/swra112b.pdf

Creo entender que el modo SPI en el lenguaje de microchip que debiera usar es....MODE_01 (que es el 0,0 en el lenguaje estándar SPI)

Y la lectura del dato debería realizarla con el flanco de subida del CLK, es decir en el medio del periodo del CLK, es decir con SMP=0

Habrá que probarlo...
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: AngelGris en 15 de Febrero de 2011, 09:43:50
De momento no dispongo de otro osciloscopio, y el  que estoy usando es el Velleman portátil de un sólo canal.
El finde probaré con mi otro osciloscopio.


  No creo que sea necesario, ya que si todas las mediciones fueron hechas con el mismo instrumento y la misma punta, es seguro que no es un error del instrumento.

  Tomando como referencia la figura 9-2 del datahseet del PIC16F877, creo que la configuración de los bits del SPI tendría que ser

CKP = 0, CKE = 1, SMP = 0;

  Aparentemente hemos llegado a la misma conclusión. Habría que ver los modos SPI soportados por el ENC28j60, tal vez puedas trabajar con los 2 integrados con el modo permitido por el CC1101. De no ser así vas a tener que usar un SPI para cada integrado.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 15 de Febrero de 2011, 10:18:21
Muchas gracias angel gris por confirmar mis conclusiones... ven más 4 ojos que 2.

Hemos llegado a las mismas conclusiones y, sin embargo, no funciona.

Me huelo que hay algo raro en el timing de las rutinas SPI hardware que no le gusta al CC1101... pero hasta que no tenga un osciloscopio con más canales no podré confirmarlo. A ver si el finde puedo contaros la resolución del misterio.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: AngelGris en 15 de Febrero de 2011, 11:51:18
Muchas gracias angel gris por confirmar mis conclusiones... ven más 4 ojos que 2.

Hemos llegado a las mismas conclusiones y, sin embargo, no funciona.

Me huelo que hay algo raro en el timing de las rutinas SPI hardware que no le gusta al CC1101... pero hasta que no tenga un osciloscopio con más canales no podré confirmarlo. A ver si el finde puedo contaros la resolución del misterio.

  Teniendo en cuenta el datasheet del PIC16F877 las posibles velocidades para el SPI son FOSC/4, FOSC/16, FOSC/64 y Timer2 OutPut/2.

  Esto es lo que dice en la página 3 del documento que mostrás respecto del C1101 "If no delay is inserted between bytes, max clock speed is 9 MHz for single access (see Figure4) and 6.5 MHz for burst access (Figure 5)."

  Tal vez allí esté el kid de la cuestión.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 15 de Febrero de 2011, 14:32:37
Lo tengo en FOSC/64 con FOSC=48MHz => FOSC/64=750KHz... ahí no está el problema

Empiezo a sospechar de un flag llamado PIR3bits.SSP2IF sobre el que dice en el datasheet:

Código: [Seleccionar]
bit 7 SSP2IF: Master Synchronous Serial Port 2 Interrupt Flag bit
1 = The transmission/reception is complete *************(must be cleared in software)*************
0 = Waiting to transmit/receive

Yo estoy usando las funciones spi hardware y no dicen nada sobre él, aunque pensaba que estaba relacionado con DataRdySPI2():
Código: [Seleccionar]
TABLE 2-11: MULTIPLE SPI™ PERIPHERAL FUNCTIONS
Function Description
CloseSPI Disable the SSP module used for SPI™ communications.
DataRdySPI Determine if a new value is available from the SPI buffer.
getcSPI Read a byte from the SPI bus.
getsSPI Read a string from the SPI bus.
OpenSPI Initialize the SSP module used for SPI communications.
putcSPI Write a byte to the SPI bus.
putsSPI Write a string to the SPI bus.
ReadSPI Read a byte from the SPI bus.
WriteSPI Write a byte to the SPI bus.

Os dejo a continuación las partes sensibles del código por si se me está escapando algo:
Código: [Seleccionar]
     PPSUnLock();
     PPSInput(PPS_SDI2, PPS_RP11);
     PPSInput(PPS_SCK2IN, PPS_RP12);  //NO SE POR QUÉ ES NECESARIO DEFINIR ESTO   
     PPSOutput(PPS_RP13, PPS_SDO2);
     PPSOutput(PPS_RP12, PPS_SCK2);
    //lock pps registers
    PPSLock();
    OpenSPI2(SPI_FOSC_64,MODE_01,SMPMID);
UINT8 cc1101_reg_read(UINT8 addr)
{
    UINT8 val;

     CS=0;
while(PORTCbits.RC0 == 1);//Espero a que baje el SO del cc1101 (SI del pic)

    putcSPI2(addr | 0x80 | 0x00);
    while(!DataRdySPI2()); //¿Esto tiene algo que ver con PIR3bits.SSP2IF o hay que borrar este flag manualmente?
    getcSPI2();
    putcSPI2(0x00);
    while(!DataRdySPI2());
    val = getcSPI2();
CS=1;
 
    /* Return the data byte */
    return val;
}

¿Alguien tiene un ejemplo de código SPI con C18 que use las librerías hardware?
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 15 de Febrero de 2011, 15:23:45
Aquí hay un ejemplo (http://www.eatelier.nl/microcontrollers/pic/serial-peripheral-interface-bus-spi/all-pages), pero me parece muy raro eso de subir el CS después de mandar el dato a la espera de que conteste el esclavo, pues no lo he visto así en ninguno de los gráficos de osciloscopio de comunicación SPI que hay por la red.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: Suky en 15 de Febrero de 2011, 16:08:56
Que manera rara de implementar el protocolo SPI  :undecided: Un ejemplo probado en C18 para control de una memoria RAMTRON

Código: C
  1. UINT8 ui8ReadSingleMemoryFM25H20(UINT32 Address){
  2.         UINT8 DataRead;
  3.        
  4.         PIN_CS_MEM_FM25H20A=0;
  5.         vWriteMemorySPI(MEMORY_SPI_READ);
  6.         vWriteMemorySPI(*((UINT8 *)&Address+2));
  7.         vWriteMemorySPI(*((UINT8 *)&Address+1));
  8.         vWriteMemorySPI(Address);
  9.         DataRead=ui8ReadMemorySPI();
  10.         PIN_CS_MEM_FM25H20A=1;
  11.  
  12.         return(DataRead);
  13. }
  14.  

Donde:

Código: C
  1. void vWriteMemorySPI(UINT8 data_out){
  2.    
  3.   UINT8 TempVar;  
  4.  
  5.       TempVar = SSP2BUF;           // Clears BF
  6.       PIR3bits.SSP2IF = 0;         // Clear interrupt flag
  7.      
  8.       SSP2BUF = data_out;          // write byte to SSPBUF register
  9.       while( !SSP2STATbits.BF );   // wait until bus cycle complete
  10.  
  11. }

Código: C
  1. UINT8 ui8ReadMemorySPI(void){
  2.  
  3.    UINT8 TempVar;
  4.    
  5.       TempVar = SSP2BUF;        // Clear BF
  6.       SSP2BUF = 0xFF;           // initiate bus cycle
  7.       while (!SSP2STATbits.BF); // wait until cycle complete
  8.       return ( SSP2BUF );       // return with byte read  
  9.                
  10. }

También he usado esa estructura en la memoria SD y conversores analógicos de TI.


Saludos!


Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 16 de Febrero de 2011, 03:36:25
Hola Suky ¿puedes ponerme la parte en la que inicializas el servicio SPI?
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: Suky en 16 de Febrero de 2011, 11:50:05
Hola Suky ¿puedes ponerme la parte en la que inicializas el servicio SPI?

Claro!
Código: C
  1. void vInitSPI(UINT8 Vel){
  2.        
  3.         switch(Vel){
  4.                 case VEL_SPI_LOW:
  5.                         CloseSPI2();
  6.                         OpenSPI2(SPI_FOSC_64, MODE_11, SMPMID);
  7.                 break;
  8.                 case VEL_SPI_MEDIUM:
  9.                         CloseSPI2();
  10.                         OpenSPI2(SPI_FOSC_16, MODE_11, SMPMID);
  11.                 break;
  12.                 case VEL_SPI_HIGH:
  13.                         CloseSPI2();
  14.                         OpenSPI2(SPI_FOSC_4, MODE_11, SMPMID);
  15.                 break;
  16.         }  
  17. }


Saludos!
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: groundman en 11 de Abril de 2011, 16:22:19
hola jfmateos2.parece que te esta doliendo la cabeza con el enc28j60.pues a mi tambien me esta doliendo la cabeza con este.ayer hize una placa para probar un modulo que compre del enc28j60.y cuando me he dado cuenta parece que el susodicho chip y el regulador de 3.3v se calientan en exceso.me parece que me lo he cargado.
ya que aunque tenga todos los pin desconectados del pic.excepto la masa y la alimentacion de 3.3v,el regulador se sigue calentando.que lastima  :(
no me ha dado tiempo a disfrutarlo.asi que tengo otro pedido.

no entiendo que ha podido pasar para que se estropease.ya que segun he leido en el datasheet,todos los pin son compatibles con 5V excepto Vcc que es de 3.3v
lo unico que he visto en el datasheet que pudiera estropear el chip,es la limitacion de intensidad que tiene el pin MISO.pero como es una salida hacia el pic,no creo que pudiera estropearse con esto.a no ser claro,que el pic le meta 5v por mala configuracion de los puertos.
ya no se que pensar.
el programa me funciona en el proteus.claro que la teoria no es igual que la practica.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: jfmateos2 en 11 de Abril de 2011, 16:46:13
Hola groundman, a mí también se me calienta bastante el enc y la cabez  :mrgreen:, pero conseguí finalmente hacerlo funcionar bien.

Me vinieron bien los consejos de Jorge Amodio (http://eprojects.ljcv.net/2010/08/internetworking-with-microchip.html) concretamente donde aconseja intercalar unas resistencias en los pines SI, SO y CS para evitar unos picos de tensión que pueden hacer que el enc falle.

Saludos y suerte.
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: groundman en 11 de Abril de 2011, 16:57:21
de que valor pusistes las resistencias? no me entero muy bien si son de 180 omios.

y dices que es normal que se caliente el regulador y el enc28j60.tanto consume este controlador?
Título: Re: Nivel señal MISO en comunicación SPI
Publicado por: groundman en 11 de Abril de 2011, 19:27:58
en los circuitos que he comprado por ebay.he visto que en los esquemas hay resistencias de 220 omios en serie con todos los terminales que se conectan al pic.
INT,SO,SI,SCK,CS y RESET.
supongo que si estan ahi,sera porque hacen falta.veremos haber que tal funciona.

estoy usando un 18F2550.no estoy muy familiarizado con este.todabia no me cuadra que tipo de cristal hay que usar ni como configurarlo internamente para el uso del SPI.