Autor Tema: SPI con 2 16F887 - transmite basura  (Leído 133 veces)

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

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 114
    • Desarrollos y Servicios Digitales
SPI con 2 16F887 - transmite basura
« en: 30 de Noviembre de 2019, 20:56:32 »
hola, buenas noches, hace varios días estoy trabado con la comunicación SPI entre dos 16F887, necesito de vuestra ayuda, por favor,

el código de inicialización del maestro es este
Código: [Seleccionar]
SSPCONbits.SSPEN = 0; // desactiva el MSSP
SSPSTATbits.SMP = 1;
SSPSTATbits.CKE = 0;
SSPCONbits.CKP = 0;
SSPCONbits.SSPM3 = 0;
SSPCONbits.SSPM2 = 0;
SSPCONbits.SSPM1 = 0;
SSPCONbits.SSPM0 = 0;
TRISCbits.TRISC2 = 0; // ~SS Slave Select
TRISCbits.TRISC3 = 0; // SCK (Master mode) must have TRISC<3> bit cleared
TRISCbits.TRISC4 = 1; // SDI como entrada
TRISCbits.TRISC5 = 0; // SDO must have TRISC<5> bit cleared
PORTCbits.RC2 = 1; // arranca con el esclavo inactivo
SSPCONbits.SSPEN = 1;

el código de inicialización del esclavo es este
Código: [Seleccionar]
SSPCONbits.SSPEN = 0; // desactiva el MSSP
SSPSTATbits.SMP = 0;
SSPSTATbits.CKE = 0;
SSPCONbits.CKP = 0;
SSPCONbits.SSPM3 = 0;
SSPCONbits.SSPM2 = 1;
SSPCONbits.SSPM1 = 0;
SSPCONbits.SSPM0 = 0;
TRISCbits.TRISC2 = 1; // ~SS Slave Select
TRISCbits.TRISC3 = 1; // SCK (Master mode) must have TRISC<3> bit cleared
TRISCbits.TRISC4 = 1; // SDI como entrada
TRISCbits.TRISC5 = 0; // SDO must have TRISC<5> bit cleared
SSPCONbits.SSPEN = 1;

tanto en el maestro como en el esclavo tengo este código
Código: [Seleccionar]
#define _XTAL_FREQ 8000000

#define byte    unsigned char

#define SPI_CNV_MAY     0x55
#define SPI_CNV_MIN     0xAA
#define SPI_ENV_NUM     0x33

#define SELEC_PIC         PORTCbits.RC2 = 0
#define DESEL_PIC         PORTCbits.RC2 = 1

bool SPI_SS_EstAnt;
#define SPI_ACTV    false
#define SPI_INAC    true

byte SPI_transferir(byte dato)
{
    SSPBUF = dato;
   
    while ( SSPSTATbits.BF==0 );
   
    dato = SSPBUF;
   
    return( dato );
}

#define SPI_tx(x)   SPI_transferir(x)
#define SPI_rx()    SPI_transferir(0xAA)

en el main del maestro
Código: [Seleccionar]
void convertir_a_mayusculas(void)
{
    byte caracteres[4];
   
    caracteres[0] = 97;  // a
    caracteres[1] = 98;  // b
    caracteres[2] = 99;  // c
    caracteres[3] = 100; // d
   
    USART_envia_cadena( (unsigned char*)"Envi", 4 );
    USART_envia_cadena( caracteres, 4 );
   
    SELEC_PIC;
   
    SPI_tx( SPI_CNV_MAY );
   
    for ( byte i=0; i<4; i++ )
        SPI_tx( caracteres[i] );
   
    delay_ms(20); // para darle tiempo para la conversion
   
    for ( byte i=0; i<4; i++ )
        caracteres[i] = SPI_rx();
   
    DESEL_PIC;
   
    USART_envia_cadena( (unsigned char*)"Reci", 4 );
    USART_envia_cadena( caracteres, 4 );
}



void convertir_a_minusculas(void)
{
    byte caracteres[4];
   
    caracteres[0] = 65; // A
    caracteres[1] = 66; // B
    caracteres[2] = 67; // C
    caracteres[3] = 68; // D
   
    USART_envia_cadena( (unsigned char*)"Envi", 4 );
    USART_envia_cadena( caracteres, 4 );
   
    SELEC_PIC;
   
    SPI_tx( SPI_CNV_MIN );
   
    for ( byte i=0; i<4; i++ )
        SPI_tx( caracteres[i] );
   
    delay_ms(20); // para darle tiempo para la conversion
   
    for ( byte i=0; i<4; i++ )
        caracteres[i] = SPI_rx();
   
    DESEL_PIC;
   
    USART_envia_cadena( (unsigned char*)"Reci", 4 );
    USART_envia_cadena( caracteres, 4 );
}



void enviar_numeros(void)
{
    byte numeros[4];
   
    numeros[0] = 1;
    numeros[1] = 2;
    numeros[2] = 3;
    numeros[3] = 4;
   
    USART_envia_cadena( (unsigned char*)"Envi", 4 );
    USART_envia_cadena( numeros, 4 );
   
    SELEC_PIC;
   
    SPI_tx( SPI_ENV_NUM );
   
    for ( byte i=0; i<4; i++ )
        SPI_tx( numeros[i] );
   
    delay_ms(20); // para darle tiempo para la conversion
   
    for ( byte i=0; i<4; i++ )
        numeros[i] = SPI_rx();
   
    DESEL_PIC;
   
    // convierte los numeros a caracteres numericos
    for ( byte i=0; i<4; i++ )
        numeros[i] = numeros[i] + 48;
   
    USART_envia_cadena( (unsigned char*)"Reci", 4 );
    USART_envia_cadena( numeros, 4 );
}



void main(void)
{
    PIC_configurar_oscilador();
    PIC_configurar_puertos();
    USART_configurar();
    SPI_configurar();
   
    delay_ms(5000);
   
    USART_envia_cadena( (unsigned char *)"PIC Inic", 8 );
   
    while ( 1 )
    {
        delay_ms(100);
       
        PORTAbits.RA3 = !PORTAbits.RA3;
        PORTAbits.RA4 = !PORTAbits.RA3;
       
        convertir_a_mayusculas();
       
        delay_ms(250);
       
        convertir_a_minusculas();
       
        delay_ms(250);
       
        enviar_numeros();
       
        delay_ms(250);
       
        USART_envia_cadena( (unsigned char*)"########", 8 );
    }
}

y en el main del esclavo
Código: [Seleccionar]
void procesar_comando(void)
{
    byte recepcion[5];
   
    for ( byte i=0; i<5; i++ )
    {
        recepcion[i] = SPI_rx();
    }
   
    if ( recepcion[0] == SPI_CNV_MAY )
    {
        for ( byte i=1; i<5; i++ )
        {
            SPI_tx( recepcion[i] - 32 );
        }
    }
    else if ( recepcion[0] == SPI_CNV_MIN )
    {
        for ( byte i=1; i<5; i++ )
        {
            SPI_tx( recepcion[i] + 32 );
        }
    }
    else if ( recepcion[0] == SPI_ENV_NUM )
    {
        for ( byte i=1; i<5; i++ )
        {
            SPI_tx( recepcion[i] + 4 );
        }
    }
    else
    {
        for ( byte i=0; i<4; i++ )
        {
            SPI_tx( 0x5A );
        }
    }
}



void main(void)
{
    PIC_configurar_oscilador();
    PIC_configurar_puertos();
    SPI_configurar();
   
    cuenta1seg = 0;
   
    SPI_SS_EstAnt = SPI_INAC;
   
    while ( 1 )
    {
        if ( (SPI_SS_EstAnt == SPI_INAC) && (PORTCbits.RC2 == 0) )
        {
            SPI_SS_EstAnt = SPI_ACTV;
            procesar_comando();
        }
        else if ( (SPI_SS_EstAnt == SPI_ACTV) && (PORTCbits.RC2 == 1) )
        {
            SPI_SS_EstAnt = SPI_INAC;
        }
    }
}

en el main del maestro, el USART entrega esto
los números de la izquierda están en hex
Código: [Seleccionar]
50 49 43 20 49 6e 69 63  PIC Inic
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da da 8a  ReciÚÚڊ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 64 aa aa aa  Recidªªª
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 34 da da da  Reci4ÚÚÚ
23 23 23 23 23 23 23 23  ########
45 6e 76 69 61 62 63 64  Enviabcd
52 65 63 69 aa aa 5a 5a  ReciªªZZ
45 6e 76 69 41 42 43 44  EnviABCD
52 65 63 69 44 aa aa aa  ReciDªªª
45 6e 76 69 01 02 03 04  Envi....
52 65 63 69 da da 8a 8a  ReciÚڊŠ
23 23 23 23 23 23 23 23  ########

este es el principio del intento de manejo de un módulo de RFID que tiene un MFRC522, pero si no puedo implementar el SPI entre dos PIC no estoy ni cerca de poder leer los tag,

agradezco cualquier ayuda,

muchas gracias,

saludos
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:SPI con 2 16F887 - transmite basura
« Respuesta #1 en: 02 de Diciembre de 2019, 12:55:45 »
Si al final lo que deseas es realizar la librería o el código para usar el MFRC522, lo mejor sería que usaras una librería ya hecha.
En el siguiente link encontré una, espero te sirva:

https://www.ccsinfo.com/forum/viewtopic.php?t=56815

elreypic

Desconectado LucasBols

  • PIC16
  • ***
  • Mensajes: 114
    • Desarrollos y Servicios Digitales
Re:SPI con 2 16F887 - transmite basura
« Respuesta #2 en: 02 de Diciembre de 2019, 18:10:00 »
hola, buenas tardes, gracias por la respuesta

Si al final lo que deseas es realizar la librería o el código para usar el MFRC522, lo mejor sería que usaras una librería ya hecha.
En el siguiente link encontré una, espero te sirva:

https://www.ccsinfo.com/forum/viewtopic.php?t=56815

elreypic

ese código fue uno de los primeros que implementé pero no funcionó, por eso empecé desde el principio, implementar el SPI

gracias!!!
Un experto es alguien que te explica algo sencillo de forma confusa de tal manera que te hace pensar que la confusión sea culpa tuya.

DSD http://www.dysd.com.ar/

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:SPI con 2 16F887 - transmite basura
« Respuesta #3 en: 04 de Diciembre de 2019, 15:16:23 »
Que tal LucasBols,

Encontré el siguiente link en español que usa una librería para el MFRC522. Lo he probado y funciona de maravilla.

https://simplesoftmx.blogspot.com/2014/11/libreria-para-usar-lector-rfid-rc522.html

Cabe mencionar que lo he probado con un microcontrolador PIC16F648A, ya que la librería no usa SPI por hardware sino por software y los resusltados fueron satisfactorios.

Si en algún momento tengo tiempo, voy a modificar la librería para poder usar el SPI por hardware.
Espero esto te sirva para tu proyecto.

elreypic.


 

anything