TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: LucasBols 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
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
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
#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
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
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
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
-
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
-
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!!!
-
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.