Ricky Jiang
/
Nucleo_printf
rfid reader group 1
main.cpp@1:cedf6a3c299e, 2020-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |