#LyX 2.0 created this file. For more info see http://www.lyx.org/ \lyxformat 413 \begin_document \begin_header \textclass article \begin_preamble \usepackage[long]{datetime} \usepackage[toc]{multitoc} \renewcommand\tableofcontents{% \@starttoc{toc}% } \usepackage{fancyhdr} \pagestyle{fancy} \chead{Sense/Net Bus Specification} \lhead{} \rhead{} \end_preamble \use_default_options true \maintain_unincluded_children false \language english \language_package default \inputencoding auto \fontencoding global \font_roman lmodern \font_sans lmss \font_typewriter lmtt \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \float_placement h \paperfontsize default \spacing single \use_hyperref true \pdf_bookmarks true \pdf_bookmarksnumbered false \pdf_bookmarksopen false \pdf_bookmarksopenlevel 1 \pdf_breaklinks false \pdf_pdfborder true \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \papersize default \use_geometry true \use_amsmath 1 \use_esint 1 \use_mhchem 1 \use_mathdots 1 \cite_engine basic \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \use_refstyle 1 \index Index \shortcut idx \color #008000 \end_index \leftmargin 2cm \topmargin 2cm \rightmargin 2cm \bottommargin 2cm \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \quotes_language english \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Title Sense/Net Bus Specification \end_layout \begin_layout Author Nick Ames \begin_inset Formula $\cdot$ \end_inset Revision 0 \begin_inset Newline newline \end_inset Copyright 2015 Oregon State University \end_layout \begin_layout Standard \begin_inset Box Frameless position "t" hor_pos "c" has_inner_box 1 inner_pos "t" use_parbox 0 use_makebox 0 width "100col%" special "none" height "1in" height_special "totalheight" status open \begin_layout Plain Layout \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \end_layout \end_inset \end_layout \begin_layout Section Overview \end_layout \begin_layout Standard The Sense/Net bus is an inexpensive system for retrieving data from large numbers of environment sensors. It provides power and two digital buses: RS-485 and 1-Wire. The 1-Wire bus is used over short distances (TODO) to connect 1-wire sensors, such as thermometers. The RS-485 bus is used over longer distances to connect more sophisticated sensors. \end_layout \begin_layout Standard An individual Sense/Net bus is composed of a single controller, many nodes (sensors), an optional terminator, and optional power injectors. The controller initiates all communication on the bus, and gathers data from the nodes. \end_layout \begin_layout Section Physical Layer \end_layout \begin_layout Subsection Wiring \end_layout \begin_layout Standard Connections are made using modular jacks (RJ-12) and six conductor cable. (If no 1-wire devices are present, RJ-11 jacks and four-conductor cable may be employed.) Cables should be wired \begin_inset Quotes eld \end_inset straight-through \begin_inset Quotes erd \end_inset , meaning they have the same connections on both ends. \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status collapsed \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \begin_inset Box Frameless position "c" hor_pos "c" has_inner_box 1 inner_pos "t" use_parbox 0 use_makebox 0 width "3cm" special "none" height "1in" height_special "totalheight" status open \begin_layout Plain Layout \begin_inset Graphics filename images/RJ-12 Pinout.eps width 3cm \end_inset \end_layout \end_inset \begin_inset space \hspace{} \length 1cm \end_inset \family sans \size small \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \family sans \size small \emph on Signals \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small \emph on 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small Unused \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small \emph on 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small 5V Power \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small \emph on 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small RS-485 B \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small \emph on 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \family sans \size small RS-485 A \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Gnd \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1-Wire I/O \end_layout \end_inset \end_inset \family default \size default \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Connector signals and pinout \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Subsection Topology \end_layout \begin_layout Standard To prevent signal degradation, a Sense/Net bus should be arranged as a line, not as a tree. It must end with a terminator at the end opposite the controller. \end_layout \begin_layout Standard TODO: Power limitations \end_layout \begin_layout Subsection Power \end_layout \begin_layout Standard Power to sensors is provided by a +5V and ground lines in the cable. \end_layout \begin_layout Section Protocol (RS-485) \end_layout \begin_layout Standard At the lowest level, bytes are transmitted on the RS-485 bus at 19200 baud with eight data bits, one stop bit, and no parity (8N1). Data on the Sense/Net bus is exchanged in packets. Packets can be sent from the controller to a single node, from the controller to all nodes, or from a node to the controller. Each node has a unique ID that is discovered by the controller during enumerati on. \end_layout \begin_layout Standard To request data, or perform an action, the controller sends a packet to a node. If required, that node will send a packet back to the controller. In between sending the command packet and receiving the reply, the controller should not send packets to other nodes. Nodes may not send a packet except when requested by the controller, and may only send a single packet for each request. \end_layout \begin_layout Standard Enumeration allows the controller to discover the nodes on the bus. TODO \end_layout \begin_layout Subsection Packet Structure \end_layout \begin_layout Standard Each packet has the follow fields: header, node ID, data length, data, and CRC. Multi-byte values are sent least significant byte first (little-endian). The maximum size of a Sense/Net packet is 141 bytes. \end_layout \begin_layout Standard \begin_inset Float table wide false sideways false status open \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \emph on (Start) \emph default \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Header \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Node ID \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Data Length \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Data \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout CRC \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 byte \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 9 bytes \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 byte \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0-128 bytes \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 bytes \end_layout \end_inset \end_inset \emph on (End) \emph default \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Packet structure. \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Subsubsection Header \end_layout \begin_layout Standard The header describes the direction of data transfer and contains commands common to all node types (nodes may implement additional commands in the data field). Packets do not contain any data for standard commands, but nodes may implement additional commands that require data. \end_layout \begin_layout Standard \begin_inset Float table wide false sideways false status open \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \emph on Controller to Node: \emph default \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \emph on Bit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Value \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Command \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \end_inset \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \emph on Node to Controller: \emph default \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \emph on Bit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 6 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 5 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Value \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Status \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \end_inset \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Header structure. \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Subsubsection* Command Codes \end_layout \begin_layout Subsubsection* \begin_inset Formula $000_{2}$ \end_inset -- Get Data \end_layout \begin_layout Standard Tells the node to send a sensor data packet. The format of the data packets is defined by the node. \end_layout \begin_layout Subsubsection* \begin_inset Formula $001_{2}$ \end_inset -- Enumerate \end_layout \begin_layout Standard Tells all nodes to perform an enumeration. All nodes respond to this command, regardless of the node ID in the packet. (Although the node ID is not checked, the CRC must match the contents of the packet.) \end_layout \begin_layout Standard During an enumeration, each node waits a random length of time (up to 2 seconds) before sending an enumeration reply packet to the controller. If the bus is busy when a node is ready to send, it will wait until the bus is free. The enumeration process allows the controller to discover the nodes connected on the bus. \end_layout \begin_layout Standard An enumeration reply packet contains two bytes of data, giving the type code of the node replying. All types codes except 0x0000 are potentially valid. \end_layout \begin_layout Subsubsection* \begin_inset Formula $010{}_{2}$ \end_inset -- Fast Enumerate \end_layout \begin_layout Standard Tells the node to immediately send an enumeration reply. All nodes respond to this command, regardless of the node ID in the packet. (Although the node ID is not checked, the CRC must match the contents of the packet.) \end_layout \begin_layout Standard This command is for testing purposes, and must only be used on a bus containing a single node. \end_layout \begin_layout Subsubsection* \begin_inset Formula $011{}_{2}$ \end_inset -- Blink \end_layout \begin_layout Standard Tells the node to blink its status LED, if it has one. No reply will be returned. \end_layout \begin_layout Subsubsection* \begin_inset Formula $100{}_{2}-111_{2}$ \end_inset -- Node Defined \end_layout \begin_layout Standard Nodes may define additional commands. \end_layout \begin_layout Subsubsection* Status Codes \end_layout \begin_layout Subsubsection* \begin_inset Formula $000_{2}$ \end_inset -- Data \end_layout \begin_layout Standard This packet contains data requested by the controller. \end_layout \begin_layout Subsubsection* \begin_inset Formula $001_{2}$ \end_inset -- Enumeration Reply \end_layout \begin_layout Standard This packet is a reply to an enumeration command. \end_layout \begin_layout Subsubsection* \begin_inset Formula $010{}_{2}$ \end_inset -- Invalid Command Error \end_layout \begin_layout Standard The node received an invalid command from the controller. \end_layout \begin_layout Subsubsection* \begin_inset Formula $011_{2}$ \end_inset -- Internal Error \end_layout \begin_layout Standard The node encountered an internal error that prevents it from returning data. \end_layout \begin_layout Subsubsection* \begin_inset Formula $100{}_{2}-111_{2}$ \end_inset -- Node Defined \end_layout \begin_layout Standard Nodes may define additional responses. \end_layout \begin_layout Subsubsection Node ID \end_layout \begin_layout Standard The node ID is the unique ID burned into the microcontroller of the node. \end_layout \begin_layout Subsubsection Data Length \end_layout \begin_layout Standard The length of the data field. Valid values are 0--128. \end_layout \begin_layout Subsubsection Data \end_layout \begin_layout Standard Packet data. The structure and meaning of this data is defined by the particular type of node being addressed. For enumeration reply packets, this field contains the two-byte type code of the node replying. \end_layout \begin_layout Subsubsection CRC \end_layout \begin_layout Standard Data corruption during transmission is detected by computing a CRC (16-bit, polynomial 0x1021, initial value 0xFFFF) of all the bytes in the packet up to the CRC, and comparing it with the CRC at the end. If they do not match, the packet has been corrupted, and is discarded without a response. The following C code can be used to calculate the CRC: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout #include \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout /* Calculate CRC of a Sense/Net packet. packet[0] is the header. \end_layout \begin_layout Plain Layout * If this function is computed over a whole packet, including the \end_layout \begin_layout Plain Layout * CRC at the end, a return value of 0 indicates a valid packet. */ \end_layout \begin_layout Plain Layout uint16_t calc_crc(uint8_t *packet, int packet_length){ \end_layout \begin_layout Plain Layout uint16_t remainder = 0xFFFF; \end_layout \begin_layout Plain Layout for (int i = 0; i < packet_length; i++){ \end_layout \begin_layout Plain Layout remainder ^= packet[i] << 8; \end_layout \begin_layout Plain Layout for (int bit = 8; bit > 0; bit--){ \end_layout \begin_layout Plain Layout if (remainder & 0x8000){ \end_layout \begin_layout Plain Layout remainder = (remainder << 1) ^ 0x1021; \end_layout \begin_layout Plain Layout } else { \end_layout \begin_layout Plain Layout remainder = (remainder << 1); \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout } \end_layout \begin_layout Plain Layout return remainder; \end_layout \begin_layout Plain Layout } \end_layout \end_inset \end_layout \begin_layout Subsection Enumeration \end_layout \begin_layout Standard The enumeration process enables the controller to discover the nodes connected to it. After sending the enumeration command, each node randomly chooses one of 500000 time slots, each 4us long, with the first (0th) time slot occurring 5ms after the enumeration command. When its time slot arrives, the node sends an enumeration reply packet to the controller. Because the time slots are chosen randomly, and each node's reply packet occupies 1750 time slots, collisions between nodes are possible. To prevent this, each node listens to the reply bytes of the other nodes. If the next possible byte in the conflicting node's packet would overlap a node's time slot, it reschedules its transmission to 256 plus a random number (up to 512) of time slots later. \end_layout \begin_layout Subsection Timing \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status collapsed \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \begin_inset Graphics filename images/Timing.png lyxscale 10 width 12cm \end_inset \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Timing \begin_inset CommandInset label LatexCommand label name "timing" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Some timing requirements are imposed on packets and frames within a packet (fig. \begin_inset CommandInset ref LatexCommand ref reference "timing" \end_inset and table \begin_inset CommandInset ref LatexCommand ref reference "tab:Timing" \end_inset ). The ends of packets are detected using the packet spacing ( \begin_inset Formula $t_{ps}$ \end_inset ). When a byte arrives, a timer is started. When the timer expires, the packet is check for consistency (using the CRC) and validity. If valid, it is processed, and the buffer index is reset for the next packet. \end_layout \begin_layout Standard \begin_inset Float table wide false sideways false status open \begin_layout Plain Layout \begin_inset space \hfill{} \end_inset \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \emph on Description \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Symbol \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Min \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Max \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \emph on Unit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Frame Spacing \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $t_{fs}$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 400 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout us \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Packet Spacing \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $t_{ps}$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1500 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $\infty$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout us \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Request Latency \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $t_{rl}$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $t_{ps}$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 5000 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout us \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Enumeration Time \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Formula $t_{enum}$ \end_inset \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0.7 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout s \end_layout \end_inset \end_inset \begin_inset space \hfill{} \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Timing \begin_inset CommandInset label LatexCommand label name "tab:Timing" \end_inset \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Besides the packet timing requirements, each node is allowed a one-second \begin_inset Quotes eld \end_inset warm-up \begin_inset Quotes erd \end_inset time between power-on and when it begins listening to the Sense/Net bus. For most controllers, the time required to boot up will exceed the warm-up time. \end_layout \end_body \end_document