rfid reader group 1

Dependencies:   mbed

Committer:
rickyqqj
Date:
Fri Jun 19 09:57:08 2020 +0000
Revision:
1:cedf6a3c299e
Parent:
0:672cd82db097
This is the code for Caecus RFID MCU

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rickyqqj 0:672cd82db097 1 #include "mbed.h"
rickyqqj 0:672cd82db097 2
rickyqqj 1:cedf6a3c299e 3 Serial pc(PA_2, PA_3);
rickyqqj 0:672cd82db097 4 Serial reader(PB_6, PB_7);
rickyqqj 0:672cd82db097 5 InterruptIn Green(PB_0);
rickyqqj 0:672cd82db097 6 DigitalIn CTS(PB_1);
rickyqqj 0:672cd82db097 7 int TXBsize = 1;
rickyqqj 1:cedf6a3c299e 8 char TXB[16];
rickyqqj 1:cedf6a3c299e 9 //for init RFID
rickyqqj 0:672cd82db097 10 uint8_t READRFID = 0b01010010;
rickyqqj 0:672cd82db097 11 uint8_t WRITEEEPROM = 0b01010000;
rickyqqj 0:672cd82db097 12 uint8_t POLLING = 0x1;
rickyqqj 0:672cd82db097 13 uint8_t POLLINGADDRESS = 0;
rickyqqj 0:672cd82db097 14 uint8_t RFIDTYPEADDRESS = 0x3;
rickyqqj 0:672cd82db097 15 uint8_t RFIDTYPE = 0x0;
rickyqqj 1:cedf6a3c299e 16 uint8_t ADDRESS = 2;
rickyqqj 1:cedf6a3c299e 17 uint8_t ADDRESSMAX = 40;
rickyqqj 0:672cd82db097 18 uint8_t KEY = 0;
rickyqqj 0:672cd82db097 19 bool FINDINGUID = 0;
rickyqqj 1:cedf6a3c299e 20 bool UIDFOUND = 0;
rickyqqj 0:672cd82db097 21 bool SENDSUCCESS = 0;
rickyqqj 0:672cd82db097 22 bool UIDTRIED = 0;
rickyqqj 1:cedf6a3c299e 23 bool inword = 0; //avoid sending dummy bits, flag. etc..
rickyqqj 1:cedf6a3c299e 24 bool spoken = 0;
rickyqqj 1:cedf6a3c299e 25 char speak [256];
rickyqqj 1:cedf6a3c299e 26 uint8_t speaklength=0; //length of words to be send
rickyqqj 0:672cd82db097 27 uint8_t UID[8];
rickyqqj 1:cedf6a3c299e 28 bool nextread = 1; //read next address or stop
rickyqqj 1:cedf6a3c299e 29 void readerRX() { //will enter this through interrupt, recieving data from rfid mdule
rickyqqj 1:cedf6a3c299e 30 if(FINDINGUID == 1) //only for multiple tag read, not used in this project
rickyqqj 0:672cd82db097 31 {UID[0]=reader.getc();
rickyqqj 0:672cd82db097 32 UID[1]=reader.getc();
rickyqqj 0:672cd82db097 33 UID[2]=reader.getc();
rickyqqj 0:672cd82db097 34 UID[3]=reader.getc();
rickyqqj 0:672cd82db097 35 UID[4]=reader.getc();
rickyqqj 0:672cd82db097 36 UID[5]=reader.getc();
rickyqqj 0:672cd82db097 37 UID[6]=reader.getc();
rickyqqj 0:672cd82db097 38 UID[7]=reader.getc();
rickyqqj 0:672cd82db097 39
rickyqqj 0:672cd82db097 40 pc.printf("%d %d %d %d %d %d %d %d", UID[7],UID[6], UID[5], UID[4], UID[3], UID[2], UID[1], UID[0]);
rickyqqj 0:672cd82db097 41 UIDFOUND = 1;
rickyqqj 0:672cd82db097 42 FINDINGUID = 0;
rickyqqj 0:672cd82db097 43 }
rickyqqj 0:672cd82db097 44 else
rickyqqj 1:cedf6a3c299e 45 {
rickyqqj 1:cedf6a3c299e 46 char tmp = reader.getc();
rickyqqj 1:cedf6a3c299e 47 if(tmp == '@')
rickyqqj 1:cedf6a3c299e 48 {inword = 1;}
rickyqqj 1:cedf6a3c299e 49 else if(tmp == ';')
rickyqqj 1:cedf6a3c299e 50 {inword = 0;}
rickyqqj 1:cedf6a3c299e 51 if(inword == 1 && tmp != '@' && tmp != ';' && tmp < 0b10000000) //to avoid non char character to be sent
rickyqqj 1:cedf6a3c299e 52 {spoken = 0;
rickyqqj 1:cedf6a3c299e 53 speak[speaklength]=tmp;
rickyqqj 1:cedf6a3c299e 54 speaklength++;
rickyqqj 1:cedf6a3c299e 55 }
rickyqqj 1:cedf6a3c299e 56 }
rickyqqj 0:672cd82db097 57
rickyqqj 0:672cd82db097 58 }
rickyqqj 0:672cd82db097 59
rickyqqj 1:cedf6a3c299e 60 void GreenIRQ() { //enter through interrupt, send command and read address to the RFID chips, send words to central MCU.
rickyqqj 1:cedf6a3c299e 61 if(Green == 0 && nextread == 1)
rickyqqj 1:cedf6a3c299e 62 {bool sent = 0;
rickyqqj 1:cedf6a3c299e 63 uint8_t TXBused = 0;
rickyqqj 1:cedf6a3c299e 64 TXB[0]=READRFID;
rickyqqj 0:672cd82db097 65 TXB[1]=KEY;
rickyqqj 0:672cd82db097 66 TXB[2]=ADDRESS;
rickyqqj 1:cedf6a3c299e 67 TXBsize = 3;
rickyqqj 0:672cd82db097 68
rickyqqj 1:cedf6a3c299e 69 if(SENDSUCCESS == 1 && TXB[0] == READRFID) //synthesize the command
rickyqqj 1:cedf6a3c299e 70 {ADDRESS=ADDRESS+4;
rickyqqj 0:672cd82db097 71 SENDSUCCESS = 0;
rickyqqj 1:cedf6a3c299e 72 TXBsize = 3;
rickyqqj 1:cedf6a3c299e 73 if(ADDRESS > ADDRESSMAX)
rickyqqj 1:cedf6a3c299e 74 {ADDRESS = 2;
rickyqqj 1:cedf6a3c299e 75 nextread = 0;
rickyqqj 1:cedf6a3c299e 76 }
rickyqqj 1:cedf6a3c299e 77 /* if(ADDRESS == 0)
rickyqqj 0:672cd82db097 78 {KEY++;
rickyqqj 0:672cd82db097 79 if(KEY == 0b00100000)
rickyqqj 0:672cd82db097 80 {KEY = 0b10000000;}
rickyqqj 0:672cd82db097 81 else if(KEY == 0b10100000)
rickyqqj 0:672cd82db097 82 {KEY = 0b00000000;}
rickyqqj 0:672cd82db097 83 pc.printf("%d",KEY);
rickyqqj 1:cedf6a3c299e 84 } */
rickyqqj 0:672cd82db097 85 TXB[1]=ADDRESS;
rickyqqj 0:672cd82db097 86 TXB[2]=KEY;
rickyqqj 0:672cd82db097 87 }
rickyqqj 0:672cd82db097 88
rickyqqj 0:672cd82db097 89
rickyqqj 0:672cd82db097 90 // Time keeping
rickyqqj 0:672cd82db097 91 while (TXBused<TXBsize){
rickyqqj 0:672cd82db097 92 if (CTS == 0 && sent == 0){
rickyqqj 1:cedf6a3c299e 93 reader.putc(TXB[TXBused]); //send the command to RFID chip when CTS=0
rickyqqj 0:672cd82db097 94 TXBused++;
rickyqqj 0:672cd82db097 95 // sent = 1;
rickyqqj 0:672cd82db097 96 }
rickyqqj 0:672cd82db097 97 else if(CTS == 1)
rickyqqj 0:672cd82db097 98 {sent = 0;
rickyqqj 0:672cd82db097 99 }
rickyqqj 0:672cd82db097 100 SENDSUCCESS = 1;
rickyqqj 1:cedf6a3c299e 101 }
rickyqqj 1:cedf6a3c299e 102 while(CTS == 0);
rickyqqj 1:cedf6a3c299e 103
rickyqqj 1:cedf6a3c299e 104 }
rickyqqj 1:cedf6a3c299e 105 else if(Green == 1)
rickyqqj 1:cedf6a3c299e 106 {nextread = 1;
rickyqqj 1:cedf6a3c299e 107 ADDRESS = 2;
rickyqqj 1:cedf6a3c299e 108 if(spoken == 0)
rickyqqj 1:cedf6a3c299e 109 {uint8_t tmpsize = speaklength+1;
rickyqqj 1:cedf6a3c299e 110 if(speaklength == 255)
rickyqqj 1:cedf6a3c299e 111 {tmpsize=255;}
rickyqqj 1:cedf6a3c299e 112 speak[tmpsize]='!'; //Tell the Central MCU thst the word are finished.
rickyqqj 1:cedf6a3c299e 113 for(int i=0; i<=tmpsize; i++) // sent the composed mesaage to the central MCU
rickyqqj 1:cedf6a3c299e 114 {pc.putc(speak[i]);}
rickyqqj 1:cedf6a3c299e 115 speaklength = 0;
rickyqqj 1:cedf6a3c299e 116 spoken = 1;
rickyqqj 1:cedf6a3c299e 117 }
rickyqqj 1:cedf6a3c299e 118 }
rickyqqj 1:cedf6a3c299e 119 if(spoken == 0 && nextread == 0)
rickyqqj 1:cedf6a3c299e 120 {uint8_t tmpsize = speaklength+1;
rickyqqj 1:cedf6a3c299e 121 if(speaklength == 255)
rickyqqj 1:cedf6a3c299e 122 {tmpsize=255;}
rickyqqj 1:cedf6a3c299e 123 speak[tmpsize]='!';
rickyqqj 1:cedf6a3c299e 124 for(int i=0; i<=tmpsize; i++)
rickyqqj 1:cedf6a3c299e 125 {pc.putc(speak[i]);}
rickyqqj 1:cedf6a3c299e 126 speaklength = 0;
rickyqqj 1:cedf6a3c299e 127 spoken = 1;
rickyqqj 1:cedf6a3c299e 128 }
rickyqqj 0:672cd82db097 129 }
rickyqqj 0:672cd82db097 130
rickyqqj 0:672cd82db097 131
rickyqqj 1:cedf6a3c299e 132 void initRFID() //program the EEPROM of RFID chip to set it to the correct mode
rickyqqj 0:672cd82db097 133 { bool sent = 0;
rickyqqj 0:672cd82db097 134
rickyqqj 0:672cd82db097 135 while (sent ==0 )
rickyqqj 0:672cd82db097 136 { if(CTS == 0)
rickyqqj 0:672cd82db097 137 {TXBsize = 3;
rickyqqj 0:672cd82db097 138 reader.putc(WRITEEEPROM);
rickyqqj 0:672cd82db097 139 reader.putc(RFIDTYPEADDRESS);
rickyqqj 0:672cd82db097 140 reader.putc(RFIDTYPE);
rickyqqj 0:672cd82db097 141 sent = 1;
rickyqqj 0:672cd82db097 142 }
rickyqqj 0:672cd82db097 143 }
rickyqqj 0:672cd82db097 144 while (CTS == 0){}
rickyqqj 0:672cd82db097 145 while (CTS == 1){}
rickyqqj 0:672cd82db097 146 sent = 0;
rickyqqj 0:672cd82db097 147 while (sent ==0 )
rickyqqj 0:672cd82db097 148 { if(CTS == 0)
rickyqqj 0:672cd82db097 149 {TXBsize = 3;
rickyqqj 0:672cd82db097 150 reader.putc(WRITEEEPROM);
rickyqqj 0:672cd82db097 151 reader.putc(POLLINGADDRESS);
rickyqqj 0:672cd82db097 152 reader.putc(POLLING);
rickyqqj 0:672cd82db097 153 sent = 1;
rickyqqj 0:672cd82db097 154 }
rickyqqj 0:672cd82db097 155 }
rickyqqj 1:cedf6a3c299e 156
rickyqqj 0:672cd82db097 157 }
rickyqqj 0:672cd82db097 158
rickyqqj 0:672cd82db097 159
rickyqqj 0:672cd82db097 160 int main() {
rickyqqj 0:672cd82db097 161
rickyqqj 0:672cd82db097 162 pc.baud(9600);
rickyqqj 0:672cd82db097 163 reader.baud(9600);
rickyqqj 0:672cd82db097 164 initRFID();
rickyqqj 1:cedf6a3c299e 165 reader.attach(&readerRX,Serial::RxIrq);
rickyqqj 0:672cd82db097 166 Green.fall(&GreenIRQ); // attach the address of the flip function to the rising edge
rickyqqj 0:672cd82db097 167 while(true)
rickyqqj 1:cedf6a3c299e 168 {if(Green == 0)
rickyqqj 1:cedf6a3c299e 169 { wait(0.05);
rickyqqj 1:cedf6a3c299e 170 GreenIRQ();}
rickyqqj 1:cedf6a3c299e 171 }
rickyqqj 0:672cd82db097 172
rickyqqj 0:672cd82db097 173 }