rev 30/11/2023


RFID RC522 avec PIC 18F27K42 , SPI HW et MPLABX XC8

Transfert de l'application Lecture RFID RC522 sur carte "Ready for PIC" 18F45K22 de 2018, sous MikroC .
vers PIC18F27K42 sur BASE 18F , et lecteur de carte RFID RC222
Dialogue en SPI1 Hardware

#define Pin_RAZ_Eeprom PORTAbits.RA2
#define MFRC522_CS_Dir TRISBbits.TRISB5
#define SCL LATCbits.LATC3
#define MOSI LATCbits.LATC5
#define MISO PORTCbits.RC4

Rappel Hardware :
ATTENTION Alimentation PIC, LCD et carte RFID-RC522 en 3,3V

data2/t_Proto_RFID_18F27K42_XC8_2023-1130.gif
prototype de test sur Base 18F  



Version 18F27K42 MPLABX XC8 (25/11/2023 )
avec SPI Hardware (Special ) sur PortC , sortie uniquement sur terminal PC

BAD results !!!!!!
data2/t_SCANA_MFRC522_Init_18F27K42_2023-1125_X_bad.gif

Je n'arrive pas à avoir exactement la meme Init RFID !
qu'avec ma version MikroC 18F45K22 (avec un MSSP Hardware = SPI classique !)
avec la meme ligne de commande !
... et donc je ne peux pas poursuivre ... ne detecte pas mes cartes ou jetons ...
malgré xx tentatives ..



Projet MPLABX XC8 et C99:
Source :
main_18F27k42_RFID_reader_2023-1125.X_bad.c

Il s'avere que la grosse difference de gestion du bus SPI
avec module MSSP sur 18F45K22 et avec SPI specifique sur 18F27K42
fait que ça ne se transpose pas facilement ...

*
Le SPI 18F27K42 est en mode FULL DUPLEX par défaut, lit l'entrée SDI en meme temps qu'il envoie une commande !

Modif pour faire un transfert NORMAL .. on envoie une commande ... puis on lit la réponse !

extrait de la datasheet : PIC18F27K42_18F47K42-DS40001919G.pdf
In this particular SPI module, dummy data may be sent without software involvement, by clearing either the
RXR bit (for receiving dummy data) or the TXR bit (for sending dummy data) (see Table 32-1 as well as
Section 32.5 “Host mode” and Section 32.6 “Client Mode” for further TXR/RXR setting details).


Receive/Transmit Modes
- Full duplex
- Receive-without-transmit
- Transmit-without-receive

SPIxCON2bits.RXR
1 = Data transfers are suspended if the RxFIFO is full
0 = Received data is not stored in the FIFO

FIGURE 32-5: SPI HOST OPERATION, COMMAND+READ DATA, TXR/RXR=0/1

SOFTWARE RFID

MPLABX 18F27K42 sur BASE 18F + carte RFID RC522
Projet MPLABX :C:\MPLABX_Projects\18F27k42_ RFID_reader_2023.X ...OK !
Nota : la carte RFID est Seule sur le BUS SPI1....
Détails :

Init SPI1

CPrint(" Init SPI1 clock 240nS 4Mhz \r\n");
SPI1CLK = 0x00; // SPI Clock Source Fosc (64MHz)
SPI1BAUD = 31; // SPI Clock = 64MHz / (2*(BAUD+1)) = 1MHz;
// SPI1BAUD = 63; // SPI Clock = 64MHz / (2*(BAUD+1)) =
500 Khz;
SPI1TWIDTH = 0x00; // 8b wide
SPI1CON1 = 0b11000000;// SMP=1, CKE=1, CKP=0, FST=0, SS/SDI/SDO act hi
SPI1CON2 = 0x03; // SS don't care, TXR=1, RXR=1 (legacy mode)
SPI1CON0= 0x83; // En SPI1, MSB, Master, BMODE=1


Fonctions primaires SPI1 :

void SPI1_Write_Byte(char bb)
{
SPI1STATUSbits.CLRBF = 1; // clearing the RXFIFO and TXFIFO buffers, related to
SPI1TCNTH = 0;
SPI1TCNTL = 1; // One byte transfert counter
SPI1CON2bits.RXR=0;
SPI1CON2bits.TXR=1;
SPI1CON0bits.EN = 1; // enable SPI1 peripheral
SPI1TXB =bb; // write the data into the output buffer
while (SPI1CON2bits.BUSY)
{ __asm("NOP");
};
}

char SPI1_Read_Byte (void)
{ char rep;
SPI1TCNTH=0;
SPI1TCNTL=1;
SPI1CON2bits.TXR=0;
SPI1CON2bits.RXR=1;
__asm("NOP");
while (!PIR2bits.SPI1RXIF) // Check for any SPI Receive Interrupts;
{__asm("NOP");
};
rep=SPI1RXB;
return (rep); // Return data from SPI Receive Buffer Register;
}


Beeper :
const float NCO1_Coeff = 4.194; // 2097152/500.000= 4.194
uint32_t Increment=0L;
unsigned char *pI=(char *)&Increment;


void NCO1_Init(void)
{
// EN disabled; POL active_hi; PFM FDC_mode Fixed Duty Cycle =divide by 2;
NCO1CONbits.EN = 0; // Disable the NCO module
PIE4bits.NCO1IE =0; // no interrupt
NCO1CON = 0x00;
NCO1CONbits.PFM=0;
NCO1CLK = 3; // 3=500Khz
NCO1ACCU = 0x00;
NCO1ACCH = 0x00;
NCO1ACCL = 0x00;

Increment=4195L; //1000 Hz
pI=(char *)&
Increment;

NCO1INCU= *(pI+2);
NCO1INCH= *(pI+1);
NCO1INCL= *(pI+0);
NCO1CONbits.EN = 0; // Enable the NCO module
}


Terminal YAT :

Test SPI Hardware 18F27K42
Projet MPLABX :C:\MPLABX_Projects\18F27k42_ RFID_reader_2023.X
Version : 2023-1127
Compile le Nov 27 2023 a 18:16:18 UTC
avec version XC8 : 2360 et PIC18F-K_DFP 1.6.125
Hardware : PIC18F27K42 FOSC interne 64Mz
SOURCES :
main.c, Config.c
AUTRES :
Defines_RFID_datas.h, RC522_SPI_Hardw.X.h
Devices: RFID RC522 board
UART1 RC6=TX RC7=RX 115200,8,N,1
SPI HARDWARE 500Khz
SPI1 RC3=SCLK RC5=MOSI RC4=MISO RB5=SS/SDA RC1=Buzzer

Init NCO1 gene.Freq

Init Compteur 24 bits SMT1, avec choix clock 4=> 500KHz tick=2uS
Test SMT1 avec __delay_xSec(2) , Nb Tics 1000000 L2=2000000 uS
Init SPI1 clock 240nS 4Mhz
Init Timer6 2*500mS -> 1sec
Stop. SMT1=501760 ,soit 1003520 uS

Chrono SMT1 avec TMR6_Init_500ms(2) , Nb Tics 501760 L2=1003 mS
MFRC522 Init() :
...fin init



Capture sequence Init RFID RC522 avec SQA Analyser logique

28/11/2023
SPI1 hardware , SClck =1Mhz
data2/t_SCANA_MFRC522_Init_18F27K42_2023-1128_X.gif


Si Etat Pin RA2 = 0 => Init Zone EEprom PIC :
8 premieres ligne : UID number à Zero
8 suivantes : un Libéllé de <16 carateres


00 --> 00:00:00:00:00
01 --> 00:00:00:00:00
02 --> 00:00:00:00:00
03 --> 00:00:00:00:00
04 --> 00:00:00:00:00
05 --> 00:00:00:00:00
06 --> 00:00:00:00:00
07 --> 00:00:00:00:00
08 --> NoName Assigned.
09 --> NoName Assigned.
10 --> NoName Assigned.
11 --> NoName Assigned.
12 --> NoName Assigned.
13 --> NoName Assigned.
14 --> NoName Assigned.
15 --> NoName Assigned.
...OK


------- Main Boucle ------

Presenter la Carte ou le jeton à moins de 30mm de la carte RFID RC522
Un bip bip est généré si detecté et le dialogue est envoyé sur l'UART1
Si c'est une premiere fois, le Numero UID est stocké en EEprom et le message "NoName Assigned"
Si la carte a déja été reconnue et initialisée, affiche le Numéro UID et le libellé associé..
Nouveau BIP d'invite pour retirer la carte ..
la boucle programme tourrne avec un delay de 2 sec...
exemple :
(18:09:08.316) Attente Presence Carte ou Jeton:
(18:09:10.323) Attente Presence Carte ou Jeton:
(18:09:12.326) Attente Presence Carte ou Jeton:
:
exemple avec presentation d'une carte :

Attente Presence Carte ou Jeton:
Attente Presence Carte ou Jeton:
Presence carte ou Jeton detectée OK
TAG TYPE : 0X0004
Lecture Numero de serie : CB:2D:A0:49:0F
uiD contenu dans CRam1 !
CB:2D:A0:49:0F
test si existant
Index=2 Deja existant : CB:2D:A0:49:0F
Select Tag , retourne size= 08
Lecture bloc 4 Num_UID=2
Comparaison
DC:93:60:83:AC --> CB:2D:A0:49:0F
44:B7:E1:E9:FB --> CB:2D:A0:49:0F
CB:2D:A0:49:0F --> CB:2D:A0:49:0F

Bonjour : Ecrivain
... retirer la carte Num_UID #2
Attente Presence Carte ou Jeton:

DIALOGUE TERMINAL

(10:10:13.406) Attente Presence Carte ou Jeton:
(10:10:14.697)
Help
(10:10:15.413) Reception de : Help
Help & Commandes dispo:
(10:10:15.463) Led_R=1 ou Led_R=0
(10:10:15.463) Message= : assigne un msg de 16 sur le bloc 4 de la carte
(10:10:15.463) Liste_UID : liste les numeros de cartes déja reconnues
(10:10:15.463) Liste_Msg : liste des Msg stocké sur cartes
(10:10:15.463) Liste_EEprom : liste contnu EEPROM PIC
(10:10:15.463) Assigne_Nom= : Assigne un nom à l'etiquette lue
(10:10:15.463) RAZ_EEprom : RAZ contenu EEPROM du PIC
(10:10:15.463)

(10:14:11.154) Attente Presence Carte ou Jeton:
(10:14:12.789)
Liste_UID
(10:14:13.159) Reception de : Liste_UID
(10:14:13.212) Index 0 UID : DC:93:60:83:AC
(10:14:13.248) Index 1 UID : 44:B7:E1:E9:FB
(10:14:13.369) Index 2 UID : CB:2D:A0:49:0F
(10:14:13.436) Index 3 UID : 0A:E6:E8:75:71
(10:14:13.520) Index 4 UID : 00:00:00:00:00
(10:14:13.609) Index 5 UID : 00:00:00:00:00
(10:14:13.700) Index 6 UID : 00:00:00:00:00
(10:14:13.739) Index 7 UID : 00:00:00:00:00
(10:14:14.814) Attente Presence Carte ou Jeton:

(10:13:23.135) Attente Presence Carte ou Jeton:
(10:13:25.040)
Liste_Msg
(10:13:25.138) Reception de : Liste_Msg
(10:13:25.183) Index 0 Nom : Architecte
(10:13:25.183) Index 1 Nom : Joelle 25-02-55
(10:13:25.183) Index 2 Nom : Ecrivain
(10:13:25.183) Index 3 Nom : paulfjujo.free.f
(10:13:25.183) Index 4 Nom :
(10:13:25.183) Index 5 Nom :
(10:13:25.183) Index 6 Nom :
(10:13:25.183) Index 7 Nom :
(10:13:26.152) Attente Presence Carte ou Jeton:



Assignation d'un NOM a une CARTE / JETON ( nom associé à UID)
but : remplacer Architecte par Robert carte #03

Liste EEprom PIC :
00 --> CB:2D:A0:49:0F
01 --> 44:B7:E1:E9:FB
02 --> 0A:E6:E8:75:71
03 --> DC:93:60:83:AC
04 --> 00:00:00:00:00
05 --> 00:00:00:00:00
06 --> 00:00:00:00:00
07 --> 00:00:00:00:00
08 --> Ulrich
09 --> Joelle 25-02-55
10 --> paulfjujo.free.f
11 --> Architecte
12 --> NoName Assigned
13 --> NoName Assigned
14 --> NoName Assigned
15 --> NoName Assigned

Attente Presence Carte ou Jeton:
Attente Presence Carte ou Jeton:
Assigne=Robert
Reception de : Assigne=Robert
assigne un Nom ou Msg lie a l'UID de la carte presentee
Robert
Vous avez 3 sec. pour presenter le Jeton ou la Carte ...
Carte ou Jeton detecté OK
Re-Lecture Numero de serie : DC:93:60:83:AC
Select Tag ->size= 8
Recherche Index stockage Msg Eeprom pour cet
UID : 11

Ecriture de <Robert> sur 1A bloc 4
Memo Msg associé sur Eeprom PIC ligne 11
Robert
.. retirer la carte Num_UID = 11

Attente Presence Carte ou Jeton:
Attente Presence Carte ou Jeton:

Attente Presence Carte ou Jeton:
Presence carte ou Jeton detectée OK
TAG TYPE : 0X0004
Lecture Numero de serie : DC:93:60:83:AC
uiD contenu dans CRam1 : DC:93:60:83:AC
test si existant
CB:2D:A0:49:0F
44:B7:E1:E9:FB
0A:E6:E8:75:71
DC:93:60:83:AC
Index=3 Deja existant : DC:93:60:83:AC
Select Tag , retourne size= 08

Lecture bloc 4
Num_UID=3
Comparaison
CB:2D:A0:49:0F --> DC:93:60:83:AC
44:B7:E1:E9:FB --> DC:93:60:83:AC
0A:E6:E8:75:71 --> DC:93:60:83:AC
DC:93:60:83:AC -->
DC:93:60:83:AC
Robert
Bonjour : Robert
... retirer la carte Num_UID #3
Attente Presence Carte ou Jeton:
Attente Presence Carte ou Jeton:
Attente Presence Carte ou Jeton:
Liste_EEprom
Reception de : Liste_EEprom

Liste EEprom PIC :
00 --> CB:2D:A0:49:0F
01 --> 44:B7:E1:E9:FB
02 --> 0A:E6:E8:75:71
03 --> DC:93:60:83:AC
04 --> 00:00:00:00:00
05 --> 00:00:00:00:00
06 --> 00:00:00:00:00
07 --> 00:00:00:00:00
08 --> Ulrich
09 --> Joelle 25-02-55
10 --> paulfjujo.free.f
11 --> Robert
12 --> NoName Assigned
13 --> NoName Assigned
14 --> NoName Assigned
15 --> NoName Assigned


ATTENTION :

* affectation UID automatique ..sur presentaion de carte ..et Memo en eeprom ( si pas déja stocké)....OK
* RA2 = 0 pour RAZ eeprom
*Pour ne pas à avoir à ressaisir les UID et NOM de chaque carte / jeton :
..compiler avec
...Production
....Set Project configuration
............Customize
..................Project properties
.......................conf ..pickit4 ..
............................Memories to program
..............................cocher..
Preserve EEPROM Memory



Projet MPLABX XC8

Projet MPLABX :C:\MPLABX_Projects\18F27k42_ RFID_reader_2023.X
Version :
2023-1130
Compile le Nov 30 2023 a 11:55:16 UTC
avec version
XC8 : 2360 et PIC18F-K_DFP 1.6.125
Hardware : PIC18F27K42 FOSC interne 64Mhz

Pack :
18F27k42_RFID_reader_2023-1130.X.zip
Source :
main_18F27k42_RFID_reader_2023-1130.X.c
Chargeur :
18F27k42_RFID_reader_2023-1130.X.hex


lien vers version 18F45K22 avec MikroC Pro 7.60




Bug rencontrés :

Pas de lecture correcte carte RFID :
Mode SPI full Duplex ! ...=> SPI Simple
-------------------------------
26/11/2023
NCO1 ne marche plus ??? ....
27/11/2023
because la variable Increment dans la fonction Set_Note est LOCALE ,
n'est pas le même que celle definie dans le main programme (comme GLOBALE)
=> mise en commentaire ci-dessous

void Set_Note_NCO( float Fr)
{
//static unsigned long Increment;
..etc ..
----------------------
cde terminal : Assigne= nom ne stoke pas le nom dans la carte
il manquait la fonction de selection UID

size = MFRC522_SelectTag( &UID );

avant d'ecrire le nouveau nom


A Suivre ...
Applicatif ??
Rajouter l'écran OLED CG9A01 ..sur SPI1..
Parole / message associées à la reconnaissance de la carte ?
Actions sur relais de sorties