M210 Protocol Spec v1-0-0
M210 Protocol Spec v1-0-0
3M RFID Reader
Model 210
Protocol Specification
June 1, 2009
Table of Contents
This reader protocol was designed for use with a variety of tag types including ISO
15693 tags and TI Tag-It™ tags. This document will explain how to use the RS-232
Serial Protocol.
The basic operation of the reader is as follows. The reader will wait until it receives a
valid command on the RS232 Port. Upon receiving a command the reader will complete
the requested task and send a response to the host. This can be any device capable of
sending and receiving RS232 data, such as a computer or PDA. The host should take
care to not send another command until a complete response has been received from the
RFID Reader. The reader will ignore a command sent while it is processing another
command.
1.2 Scope
The intended audience of this document is programmers creating software to interface
with 3M RFID Readers. The user should have general knowledge of what an RFID
Reader does and its basic functions. The reader should also have extensive knowledge of
RS232 communications.
Values prefaced with x or 0x are in hex. Example values in the left column of tables are
in hex.
2 Communication Scheme
The reader uses a standard USB to serial converter interface. Which means the reader
will appear and operate as a COM port to the host. The communication with the 3M
Reader shall be at 19200 baud, 8N1 (8 Data Bits, 1 Stop Bit, No Parity Bits).
All messages to and from the reader contain the following parts.
Start Byte 1 Byte in Length This is a 0xD6 hex number that is sent at the
beginning of all messages.
Length 2 Bytes in Length This is the total of all bytes that will be sent
following the transmission of the length
bytes themselves.
Command Code 1 Byte in Length Every Command has a unique identifier that
is placed at this point in the message.
Conditional Fields Variable in Length This is defined in each of the command
descriptions. There may not be any data at
all for a command.
BCC 2 Bytes in Length This is a CRC calculated on all of the bytes
proceeding with the exception of the Start
Byte.
4 BCC
The BCC is a CRC checksum found at the end of every message sent to, and received
from, the RFID reader. The BCC is calculated on all of the bytes in the message with the
exception of the Start Byte.
Example:
Outgoing Message: D6 00 09 03 00 02 00 00 00 03
Calculate CRC on all bytes but D6, resulting CRC = 12 E6
For a description of the other error code values, see the appendix.
Serial Numbers:
When transmitting a serial number of an ISO tag use the following manner:
MSB-LSB
E0 07 00 00 06 71 53 99
When transmitting the serial number of a TI tag fill the first 32 bits with 0’s
0’s -----------MSB---LSB
00 00 00 00 1A 23 B5 9F
This format is consistent with the 32-bit TI format of transmitting and receiving data.
7 Normal Commands
This section has detailed examples of all the standard commands implemented in the
protocol. Each section will have a description of what the purpose of the command is
and then will have an explanation of all the conditional fields used in this command.
Description: The primary purpose of this command is to identify all of the transponders
in the field. For each transponder found, various optional data will be returned given by
the Response Options Field. The operation of this command is affected by the Set Air
Interface command unless protocols are specific in the request fields. Depending on the
options set this command will return ISO tags, Tag-It tags or both.
Request Fields: AFI - Return only tags with this AFI value; 0 for all tags.
Response Options –
Bit 0: Address – return 8 byte serial number for each tag
Bit 1: DSFID – return 1 byte DSFID for each tag
(Note that DSFID is returned BEFORE the address)
Bit 2*: Ignored unless bit4 set
Bit 3*: used when bit4 set otherwise reserved (set 0)
Bit 5: Skip quiet and 2nd poll
Bit 6: Protocol(s) are included
Bit 7: Reserved (set 0)
Protocols – when bit above is set –
Bit0: Tag-It
Bit1: ISO
Bits 2-7: Reserved (set 0)
Response Fields: AFI – Requested AFI
Response Options – Requested response options
Number of Transponders – How many tags were found
[DSFID, Address] – optional data returned for each tag found
Error Codes:
0x31 – Response Option(s) not supported
0x02 – Command not implemented
Remarks: The AFI and the response options fields determine what tags are found and
what data is returned. TI Tag-It tags are NOT returned when a non-zero AFI is specified.
The DSFID byte, when requested, is returned before the 8 byte serial number. A DSFID
of 0 is returned for TI Tag-It tags which mirror what is returned by ISO tags that do not
support a DSFID. Reserved bits in the response options field should be set to 0 (note that
bit 2 has effectively been orphaned because older firmware interpreted 0x01 and 0x05 in
the same manner). Note that it is possible for the same address to be returned more
than once in a single Read Block UID response (e.g. if the tag does not hear the quiet
command it will respond in the 2nd poll and the reader does not remove duplicate
addresses).
Example of a Request:
Request: D6 00 05 FE 00 05 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 17 Length Bytes after this field Variable
FE Command Code Read Block UID Fixed
00 Error Code No Error 00 – No Error
00 AFI AFI from request Same as request
05 Response Options What is returned for Same as request
each tag found
02 Num Tags 2 tags were found Variable
00 00 00 00 Address UID of 1st tag Any Legal UID
00 AD 63 02
E0 07 00 00 Address UID of 2nd tag Any Legal UID
00 60 00 AE
XX XX BCC CRC checksum Calculated
Error Codes:
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 03 11 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 08 Length Bytes after this field Variable
11 Command Code Reader Version Fixed
00 Error Code No Error 00 – No Error
0A 03 02 06 Firmware Version 3M™ Reader Variable
Version 03.02.06
XX XX BCC CRC checksum Calculated
Description: This command allows low-level ISO air commands to be sent directly. It is
mainly for the use of manufacturer implemented custom ISO commands but it can also be
used to override the reader firmware’s default processing with specific tags. The reader
should be familiar with the ISO/IEC 15693-2 and 15693-3 specifications.
Request Fields: Send Data Size* – 2Byte size of ISO air command send data
Receive Size* – 2Byte size of air command response
Control Options – 2Bytes as follows:
Bit 0-10 / 11**: number of clock waits for response
Bit 11 set 1***: no intelligence when “raw receive” set
Bit 12 set 1**: override standard clock wait; use above
Bit 13 set 1**: send 100% EOF after wait to get response
Bit 14 set 1***: “raw receive” mode (minimal intelligence)
Bit 15: set 1 if RF Flags is included below
[RF Flags] – if bit15 in control options set, 1 byte as follows:
Bit 3: set 1 to stop receiving if no sof (“raw receive” only)
Bit 4: set 1 for t1 nominal timing, 0 for t1 max
Send Data* – ISO air command data
Response Fields: Result Flags – 1 byte for debugging purposes, low bits as follows:
Bit 0: the SOF was found
Bit 1: the EOF was found
Bit 2: there were code violation(s) in the data
Receive Size* – 2Byte size of air command response data
Receive Data* – ISO air command response data
Error Codes:
0x31 – Control option(s) not supported
0x02 – Command not implemented
* In normal use, send and receive sizes/data do NOT include the ISO spec CRC. The CRC is
added/checked automatically by the firmware. Also, the receive size should be the maximum expected
bytes (less may be returned). In “raw receive” mode, however, the receive size becomes the exact number
of bytes you want to receive.
** The override bit must be set for bits 0-11 to be used, otherwise the firmware uses a standard clock wait.
Typically for ISO air commands that read tag data you can pass 0x0000 for the control options. ISO air
commands that write tag data will probably need control options. For example, TI ISO tags required the
send EOF about 10ms after a command that writes data (block, afi, etc). Note that the clock waits are bits
0-10 when “raw receive” is set. “Clock waits” are 9.44uS clocks when using the “send 100% EOF”
method (i.e. TI tags) and 18.88uS clocks when this method is not used (i.e. NXP and ST tags).
*** “Raw receive” mode gives three options. Raw receive with no intelligences reads bits as they are read
over the air and returns exactly receive size bytes of them (so any SOF and EOF will be returned as bits).
No checking on anything is done so the returned Result Flags are undefined. Raw receive mode with
minimal intelligence (no intelligence bit set to 0) checks/discards the first 8 bits and last 8 bits for
SOF/EOF and sets the Result Flags appropriately. If RF Flags are included and the “stop if no sof” bit is
clear, then all bits between the expected SOF/EOF are de-manchestered until there are receive size bytes of
them, which are then returned. If the “stop if no sof” bit is set then reading stops if the sof was not found
but receive size bytes (of random values) are still returned so you need to check the returned Result Flags.
If there are code violations anywhere in the data stream, the Result Flag bit is set AND any bytes with code
violation(s) are returned as 0xFF. Note that in raw receive mode the clock waits are limited to bits 0-10.
Some reader platforms do not support the “no intelligence” bit – you can check for the option not
supported error code in this command or use the Extended Info with Reader Platform Flags ID to
find out before-hand.
Example of a Request:
Example of a Response:
Request: D6 00 14 41 00 0B 00 06 00 00 23 20 93 69 73 12 00 00 07 E0 00 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
14 Command Code ISO Pass thru Fixed
00 Error Code No Error 00 – No Error
83 Result Flags For debugging see above
0005 Receive Size Bytes received from Variable
tag
00 Receive Data ISO response flags Variable
per ISO spec
55555555 Receive Data 4byte contents of Variable
block 0
XX XX BCC CRC checksum Calculated
7.4 Quiet
Description: This function will quiet a specific tag so that it does not respond during a
ReadBlockUID command.
Error Codes:
0x02 – Command Not Implemented
Example of a Request:
Example of a Response:
Request: D6 00 0B 01 E0 07 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
01 Command Code Quiet Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function is used to retrieve data from the memory of a specific tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – at least one block number is invalid
0x15 – Mem Not Read – error reading block data
0x31 – Option Not Supported – probably a bad Response Options byte
0x02 – Command not implemented
** The no_lock bit modifies the returned data to exclude the lock information for each block, reducing the
returned data to 4 or 5 bytes per block. However, see above when used with the return all data bit. Note
also that not all firmware versions support the no_lock bit.
Remarks: The reader will assume the Response Options are zero if the request does not
contain enough data.
Example of a Request (old style with no response options):
Example of a Response:
Request: D6 00 0D 02 00 00 00 00 01 23 45 67 00 02 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 19 Length Bytes after this field Variable
02 Command Code Read Multiblock Fixed
00 Error Code No Error 00 – No Error
00 00 00 00 Address UID of tag Same as request
01 23 45 67
02 Number of Blocks 2 Blocks read Same as request
Read
00 Block Number Block 0 0-255
00 Lock / Error Unlocked 00 – Unlocked
01- User locked
02 – Factory locked
03 – Both locks
> 03 are error codes
00 11 22 33 Block Data Data Variable
01 Block Number Block 1 0-255
00 Lock Status Unlocked See above
00 11 22 33 Block Data Data Variable
XX XX BCC CRC checksum Calculated
Description: This function is used to write data to the memory of a specific tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – at least one block number is invalid
0x16 – Mem Not Put – error writing block data (not enough power?)
0x12 – Mem Locked – at least one block is locked and cannot write new data
0x31 – Option Not Supported – probably a bad reserved byte
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 16 04 00 00 00 00 01 23 45 67 00 02 00 12 34 AB CD 55 66 77 88 XX
XX
Description: This function is used to write data to the memory of one block in a specific
tag. This command is maintained for legacy applications. New applications should use
Write Multiblock for better performance.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available –block number is invalid
0x16 – Mem Not Put – error writing block data (not enough power?)
0x12 – Mem Locked – block is locked and cannot write new data
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 10 05 00 00 00 00 01 23 45 67 00 12 34 AB CD XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
05 Command Code Write Block Fixed
00 Error Code No Error 00 – No Error
00 00 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function is used to write data to the memory of one block in a specific
tag and then lock the data. The block data cannot be changed after this command has
been issued.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available –block number is invalid
0x16 – Mem Not Put – error writing block data (not enough power?)
0x12 – Mem Locked –block is locked and cannot write new data
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 10 07 00 00 00 00 01 23 45 67 00 12 34 AB CD XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
07 Command Code Write & Lock Block Fixed
00 Error Code No Error 00 – No Error
00 00 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function is used to lock data within a single block on a specific tag.
The block data cannot be changed after this command has been issued.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available –block number is invalid
0x16 – Mem Not Put – error locking block (not enough power?)
0x12 – Mem Locked – block is already locked
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0C 08 00 00 00 00 01 23 45 67 00 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
08 Command Code Lock Block Fixed
00 Error Code No Error 00 – No Error
00 00 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function will return the value of the application family identifier (AFI)
of a specific tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – AFI is not available
0x30 – Not Supported
0x02 – Command Not Implemented
Example of a Request:
Example of a Response:
Request: D6 00 0B 0A E0 07 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0D Length Bytes after this field Variable
0A Command Code Get AFI Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
DA AFI Value of the AFI 0-255
XX XX BCC CRC checksum Calculated
Description: This function is used to modify the AFI value in a particular tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – AFI is not available
0x16 – Mem Not Put – error writing AFI (not enough power?)
0x12 – Mem Locked – AFI is locked and cannot write new data
0x30 – Not Supported
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0C 09 E0 07 00 00 01 23 45 67 D7 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
09 Command Code Write AFI Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function is used to lock the AFI value in a particular tag. The AFI
value cannot be changed after this command has been issued.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – AFI is not available
0x16 – Mem Not Put – error locking AFI (not enough power?)
0x12 – Mem Locked – AFI is already locked
0x30 – Not Supported
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0B 06 E0 07 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
06 Command Code Lock AFI Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function will return the value of the EAS bit of a specific tag. EAS
functionality is a NXP proprietary function so only certain ISO tags will be able to
respond to an EAS command.
Tags Supported: ISO 15693 tags that support addressed EAS commands (NXP)
Error Codes:
0x06 – No Transponder
0x30 – Not Supported
0x02 – Command Not Implemented
Remarks: Currently, only tags that have an EAS of 1 will respond to the low-level air
command. This means that there is no way to tell the difference between “tag has an EAS
of 0” and “No Transponder Found.” Therefore you will have to interpret an error code of
0x06 as an EAS value of 0. In addition, the firmware will send the command to tags that
may not support EAS at all. If these tags do not respond, you will receive the No
Transponder Found error.
Example of a Request:
Request: D6 00 0B 03 E0 04 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0D Length Bytes after this field Variable
Request: D6 00 0B 03 E0 04 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0D Length Bytes after this field Variable
03 Command Code Check EAS Fixed
06 Error Code No Transponder 06 – No
Found Transponder Found
E0 04 00 00 Address UID of tag Same as request
01 23 45 67
00 EAS Probable Value of 0
the EAS
XX XX BCC CRC checksum Calculated
Description: This function is used to modify the EAS bit in a particular tag. EAS
functionality is a NXP proprietary function so only certain ISO tags will be able to
respond to an EAS command. Tags with an EAS set to 1 would typically be considered
tags with security ON (e.g. checked-in items).
Tags Supported: ISO 15693 tags that support addressed EAS commands
(NXP is supported)
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – EAS is not available
0x16 – Mem Not Put – error writing EAS (not enough power?)
0x30 – Not Supported
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0C 0C E0 04 00 00 01 23 45 67 01 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
0C Command Code EAS Control Fixed
00 Error Code No Error 00 – No Error
Description: This function will return the value of the data storage format identifier
(DSFID) of a specific tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – DSFID is not available
0x30 – Not Supported
0x02 – Command Not Implemented
Example of a Request:
Example of a Response:
Request: D6 00 0B 0F E0 07 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0D Length Bytes after this field Variable
0F Command Code Get DSFID Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
31 DSFID Value of the DSFID 0-255
XX XX BCC CRC checksum Calculated
Description: This function is used to modify the DSFID value in a particular tag.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – DSFID is not available
0x16 – Mem Not Put – error writing DSFID (not enough power?)
0x12 – Mem Locked – DSFID is locked and cannot write new data
0x30 – Not Supported
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0C 0B E0 07 00 00 01 23 45 67 31 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
0B Command Code Write DSFID Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Description: This function is used to lock the DSFID value in a particular tag. The
DSFID value cannot be changed after this command has been issued.
Error Codes:
0x06 – No Transponder
0x11 – Mem Not Available – DSFID is not available
0x16 – Mem Not Put – error locking DSFID (not enough power?)
0x12 – Mem Locked – DSFID is already locked
0x30 – Not Supported
0x02 – Command not implemented
Example of a Request:
Example of a Response:
Request: D6 00 0B 0E E0 07 00 00 01 23 45 67 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0C Length Bytes after this field Variable
0E Command Code Lock DSFID Fixed
00 Error Code No Error 00 – No Error
E0 07 00 00 Address UID of tag Same as request
01 23 45 67
XX XX BCC CRC checksum Calculated
Remarks: This command attempts to mimic the ISO “get system info” air command in
allowing you to get a lot of things in one air command. For Tag-IT tags, it is less useful
but can return MemSize and ICRef. Unlike other commands, you typically will not get an
error returned when a tag does not support a piece of information. Instead, you must
compare the Info returned with what you requested; if requested information is missing,
then the tag does not support it. The firmware is smart enough to return information for
some ISO tags that do not support “get system info” but other tags that do not support the
air command will result in an error returned (typically No Transponder Found).
Request: D6 00 0C 0D E0 07 C1 00 01 23 45 67 03 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0E Length Bytes after this field Variable
0D Command Code Tag Info Fixed
00 Error Code No Error 00 – No Error
E0 07 C1 00 Address UID of tag Same as request
01 23 45 67
02 Info Avail What you got See bits above
DA AFI The AFI value 0-255
XX XX BCC CRC checksum Calculated
Request: D6 00 0C 0D 00 00 00 00 01 23 45 67 03 XX XX
Example Value Name Description Values
D6 Start Start Byte Fixed
00 0D Length Bytes after this field Variable
0D Command Code Tag Info Fixed
00 Error Code No Error 00 – No Error
00 00 00 00 Address UID of tag Same as request
01 23 45 67
00 Info Avail You got nothing See bits above
XX XX BCC CRC checksum Calculated
*These used to be Block Not Available, etc. but have been re-used over time for AFI, DSFID and other
things so they are renamed to be more generic.
Description Code
ST 0x02
NXP 0x04
Texas Instruments 0x07
POLYNOMIAL = 0x1021
PRESET = 0xFFFF
A = MSB of CRC
B = MSB of BYTE
If [ (A xor B) > 0 ]
{
CRC = CRC xor POLYNOMIAL
}
return CRC