View difference between Paste ID: Ex7LRnd6 and szf33WVF
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