Autor Tema: Nivel señal MISO en comunicación SPI  (Leído 5566 veces)

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

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Nivel señal MISO en comunicación SPI
« Respuesta #15 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?

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Nivel señal MISO en comunicación SPI
« Respuesta #16 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.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6759
Re: Nivel señal MISO en comunicación SPI
« Respuesta #17 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!


No contesto mensajes privados, las consultas en el foro

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Nivel señal MISO en comunicación SPI
« Respuesta #18 en: 16 de Febrero de 2011, 03:36:25 »
Hola Suky ¿puedes ponerme la parte en la que inicializas el servicio SPI?

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6759
Re: Nivel señal MISO en comunicación SPI
« Respuesta #19 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!
No contesto mensajes privados, las consultas en el foro

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Nivel señal MISO en comunicación SPI
« Respuesta #20 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.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Nivel señal MISO en comunicación SPI
« Respuesta #21 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.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Nivel señal MISO en comunicación SPI
« Respuesta #22 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?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Nivel señal MISO en comunicación SPI
« Respuesta #23 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.
Montando mi primera impresora 3D (Raprep Prusa i3)