SHOW:
|
|
- or go back to the newest paste.
1 | - | // Transmit data from UART (Arduino + NFC reader) and Planner |
1 | + | // Transmit data between NFC reader and Planner |
2 | - | // Author: Jamiver Montaner |
2 | + | |
3 | - | // Date: 15 Dec 2012 |
3 | + | |
4 | - | // License: To be decided |
4 | + | |
5 | const PN532_STARTCODE1= 0x00; | |
6 | const PN532_STARTCODE2= 0xFF; | |
7 | const PN532_POSTAMBLE= 0x00; | |
8 | ||
9 | const PN532_HOSTTOPN532= 0xD4; | |
10 | ||
11 | const PN532_FIRMWAREVERSION= 0x02; | |
12 | const PN532_GETGENERALSTATUS= 0x04; | |
13 | const PN532_SAMCONFIGURATION= 0x14; | |
14 | const PN532_INLISTPASSIVETARGET= 0x4A; | |
15 | const PN532_RFCONFIGURATION= 0x32; | |
16 | const PN532_INDATAEXCHANGE= 0x40; | |
17 | const PN532_MIFARE_READ= 0x30; | |
18 | const PN532_MIFARE_WRITE= 0xA0; | |
19 | ||
20 | const PN532_AUTH_WITH_KEYA= 0x60; | |
21 | const PN532_AUTH_WITH_KEYB= 0x61; | |
22 | ||
23 | ||
24 | const PN532_WAKEUP= 0x55; | |
25 | ||
26 | const PN532_SPI_STATREAD= 0x02; | |
27 | const PN532_SPI_DATAWRITE= 0x01; | |
28 | const PN532_SPI_DATAREAD= 0x03; | |
29 | const PN532_SPI_READY= 0x01; | |
30 | ||
31 | const PN532_MIFARE_ISO14443A= 0x0; | |
32 | const PN532_MAX_RETRIES= 0x05; | |
33 | local pn532ack = [0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00]; | |
34 | local pn532response_firmwarevers = [0x00, 0xFF, 0x06, 0xFA, 0xD5, 0x03]; | |
35 | ||
36 | ||
37 | local tagId="" | |
38 | ||
39 | function intToHex(inputByte) //assumes 1 byte value 0-255 | |
40 | { | |
41 | local result = ""; | |
42 | if ((inputByte>255)||(inputByte<0)) return "00"; | |
43 | local digit= inputByte/16; //high nibble | |
44 | if (digit<10) result=digit.tostring(); | |
45 | else { | |
46 | digit=(0x41 + digit-10) //"A"..."F" | |
47 | result=digit.tochar(); | |
48 | } | |
49 | digit= inputByte%16; //low nibble | |
50 | if (digit<10) result+=digit.tostring(); | |
51 | else { | |
52 | digit=(0x41 + digit-10) //"A"..."F" | |
53 | result+=digit.tochar(); | |
54 | } | |
55 | return result; | |
56 | } | |
57 | ||
58 | ||
59 | function begin() { | |
60 | hardware.pin1.write(0);//pull CS low | |
61 | imp.sleep(1); | |
62 | // not exactly sure why but we have to send a dummy command to get synced up | |
63 | sendCommandCheckAck([PN532_FIRMWAREVERSION], 1, 100); | |
64 | // ignore response! | |
65 | } | |
66 | ||
67 | function RFConfiguration(mxRtyPassiveActivation) { | |
68 | sendCommandCheckAck([PN532_RFCONFIGURATION, PN532_MAX_RETRIES, 0xFF, 0x01, mxRtyPassiveActivation], 5,100); | |
69 | server.show("RFConfiguration") | |
70 | // ignore response! | |
71 | } | |
72 | ||
73 | function startNFC(){ | |
74 | begin(); | |
75 | RFConfiguration(0x14); // default is 0xFF (try forever; ultimately it does time out but after a long while | |
76 | local versiondata = getFirmwareVersion(); | |
77 | if (! versiondata) { | |
78 | server.show("Didn't find PN53x board"); | |
79 | }else { | |
80 | // Got ok data, print it out! | |
81 | server.show("Found chip PN5"); | |
82 | server.show(versiondata); | |
83 | ||
84 | // nfc.SAMConfig(); | |
85 | } | |
86 | } | |
87 | ||
88 | function getFirmwareVersion() { | |
89 | local response; | |
90 | local buf=[0,1,2,3,4,5,6,7,8,9,10,11]; | |
91 | ||
92 | if (! sendCommandCheckAck([PN532_FIRMWAREVERSION], 1,100)) | |
93 | return 0; | |
94 | // read data packet | |
95 | readspidata(buf, 12); | |
96 | // check some basic stuff | |
97 | for (local i=0; i<6; i++) { | |
98 | if (buf[i] != pn532response_firmwarevers[i]) return false; | |
99 | } | |
100 | ||
101 | response = buf[6]; | |
102 | response = response<<8; | |
103 | response += buf[7]; | |
104 | response = response<<8; | |
105 | response += buf[8]; | |
106 | response = response<<8; | |
107 | response += buf[9]; | |
108 | ||
109 | return response; | |
110 | } | |
111 | ||
112 | ||
113 | ||
114 | ||
115 | ||
116 | ||
117 | function sendCommandCheckAck(cmd, cmdlen, timeout) { | |
118 | local timer = 0; | |
119 | ||
120 | // write the command | |
121 | spiwritecommand(cmd, cmdlen); | |
122 | ||
123 | // Wait for chip to say its ready! | |
124 | while (readspistatus() != PN532_SPI_READY) { | |
125 | if (timeout != 0) { | |
126 | timer+=10; | |
127 | if (timer > timeout){ | |
128 | server.show("No response READY"); | |
129 | return false; | |
130 | } | |
131 | } | |
132 | imp.sleep(0.01); | |
133 | } | |
134 | ||
135 | // read acknowledgement | |
136 | if (!spi_readack()) { | |
137 | server.show("Wrong ACK"); | |
138 | return false; | |
139 | } | |
140 | ||
141 | timer = 0; | |
142 | // Wait for chip to say its ready! | |
143 | while (readspistatus() != PN532_SPI_READY) { | |
144 | if (timeout != 0) { | |
145 | timer+=10; | |
146 | if (timer > timeout) | |
147 | return false; | |
148 | } | |
149 | imp.sleep(0.01); | |
150 | } | |
151 | ||
152 | return true; // ack'd command | |
153 | } | |
154 | ||
155 | ||
156 | function spi_readack() { | |
157 | local ackbuff =[0,1,2,3,4,5]; | |
158 | ||
159 | readspidata(ackbuff, 6); | |
160 | for (local i=0; i<6; i++) { | |
161 | if (ackbuff[i] != pn532ack[i]) return false; | |
162 | } | |
163 | return true; | |
164 | } | |
165 | ||
166 | function readspidata(buff, length) { | |
167 | hardware.pin1.write(0);//pull CS low | |
168 | imp.sleep(0.002); | |
169 | spiwrite(PN532_SPI_DATAREAD); //read leading byte DR and discard | |
170 | ||
171 | for (local i=0; i<length; i++) { | |
172 | imp.sleep(0.001); | |
173 | buff[i] = spiwrite(PN532_SPI_STATREAD); | |
174 | server.show(buff[i]); | |
175 | } | |
176 | hardware.pin1.write(1);//pull CS high | |
177 | ||
178 | } | |
179 | ||
180 | function readspistatus() { | |
181 | hardware.pin1.write(0);//pull CS low | |
182 | imp.sleep(0.002); | |
183 | spiwrite(PN532_SPI_STATREAD); | |
184 | local value= hardware.spi257.read(1); | |
185 | hardware.pin1.write(1);//pull CS high | |
186 | return value; | |
187 | ||
188 | } | |
189 | ||
190 | ||
191 | function spiwritecommand(cmd, cmdlen) { | |
192 | local checksum; | |
193 | hardware.pin1.write(0);//pull CS low | |
194 | imp.sleep(0.002); | |
195 | cmdlen++; | |
196 | ||
197 | spiwrite(PN532_SPI_DATAWRITE); | |
198 | ||
199 | checksum = PN532_PREAMBLE + PN532_PREAMBLE + PN532_STARTCODE2; | |
200 | spiwrite(PN532_PREAMBLE); | |
201 | spiwrite(PN532_PREAMBLE); | |
202 | spiwrite(PN532_STARTCODE2); | |
203 | ||
204 | spiwrite(cmdlen); | |
205 | local cmdlen_1=256-cmdlen; | |
206 | spiwrite(cmdlen_1); | |
207 | ||
208 | spiwrite(PN532_HOSTTOPN532); | |
209 | checksum += PN532_HOSTTOPN532; | |
210 | ||
211 | for (local i=0; i<cmdlen-1; i++) { | |
212 | spiwrite(cmd[i]); | |
213 | checksum += cmd[i]; | |
214 | } | |
215 | checksum%=256; | |
216 | local checksum_1=255-checksum; | |
217 | spiwrite(checksum_1); | |
218 | spiwrite(PN532_POSTAMBLE); | |
219 | ||
220 | hardware.pin1.write(1);//pull CS high | |
221 | ||
222 | } | |
223 | ||
224 | function spiwrite(byte){ | |
225 | ||
226 | local tempString="\\x"+intToHex(byte); | |
227 | hardware.spi257.write(tempString); | |
228 | local resp=hardware.spi257.read(1); | |
229 | foreach(i, val in resp){ | |
230 | server.show(tempString +"-> (" +resp.len() + ") "); | |
231 | server.log(val); | |
232 | } | |
233 | ||
234 | return resp; //read n bytes | |
235 | ||
236 | ||
237 | } | |
238 | ||
239 | ||
240 | ||
241 | function initSPI() | |
242 | { | |
243 | hardware.configure(SPI_257); | |
244 | hardware.spi257.configure(LSB_FIRST| CLOCK_IDLE_HIGH , 4000); // Configure SPI_257 at about 4MHz | CLOCK_IDLE_LOW | |
245 | hardware.pin1.configure(DIGITAL_OUT); //Configure the chip select pin | |
246 | hardware.pin1.write(1);//pull CS high | |
247 | imp.sleep(0.1);//wait 100 ms | |
248 | hardware.pin1.write(0); //pull CS low to start the transmission of temp data | |
249 | server.show("init ok"); | |
250 | } | |
251 | ||
252 | ||
253 | ||
254 | ||
255 | // This is where our program actually starts! Previous stuff was all function and variable declaration. | |
256 | // This'll configure our impee. It's name is "UartCrossAir", and it has both an input and output to be connected: | |
257 | imp.configure("remoteNFC", [], []); | |
258 | initSPI(); // Initialize the SPI, called just once | |
259 | startNFC(); | |
260 | ||
261 | // The end |