\documentclass[a4paper,10pt, titlepage]{article}
%\documentclass[a4paper,10pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[english, russian ]{babel}
\usepackage{cmap}
\usepackage{array}
\usepackage[pdftex, unicode, final, colorlinks, linkcolor=blue, bookmarksnumbered]{hyperref}


\oddsidemargin=5.0mm     % +10mm -25.4mm
\evensidemargin=-10mm   % -10mm
\textwidth=150mm
\topmargin=-10mm
\textheight=250mm

\emergencystretch=50pt
%задаем сколько минимально букв можно переносить
\righthyphenmin=2




\newcommand{\cmddescr}[3]{\begin{tabular}{|m{8.2cm}|m{1cm}|m{3.5cm}|}
			   \hline
                           команда & код & данные \\\hline
                           #1 & #2 & #3 \\\hline
                          \end{tabular}\\}






\title{Протокол LTR-модулей}
\author{Борисов Алексей}

\pdfinfo{%
  /Title    ()
  /Author   ()
  /Creator  ()
  /Producer ()
  /Subject  ()
  /Keywords ()
}


\begin{document}
  Большинство команд имеет следующий формат: \\
  dddddddd dddddddd 1000MMMM 11pccccc \\

  \begin{itemize}
   \item d - параметр команды
   \item p - бит четности, вычисляемый по полям С и D
   \item d - параметр команды
  \end{itemize}

  Для большинства команд ответ повторяет переданную команду, либо изменяет параметр команды (если это команда чтения неких параметров)
  Существуют так же отдельные коды команд для ответов для указания ошибок, например ошибки четности.
  Часть команд имеет свои коды подтверждения при успешном выполнении.
  Часть команд должны передаваться блоком заданного размера. Подтверждение может приходить на целый блок.

  \section{Команды модуля LTR212}
  \begin{tabular}{|m{2.3cm}|m{1.3cm}|m{1cm}|m{2.5cm}|m{2cm}|m{3cm}|}
  \hline
  команда     & код & кол-во & параметр & подтверждение & описание \\\hline
  LOAD\_IIR   & 10000 & 5 & коэффициент & 1 & Загрузка коэффициентов фильтра \\\hline
  LOAD\_FIR   & 01111 & FirOrder + 1 & dddddddd ffffffff & 1 & В первом слове передается порядок фильтра и коэффициент децимации, в следующих - коэффициенты \\\hline
  LOAD\_CHANNEL & 01101 & LChCnt & cccu000f rsss000g & LChCnt & Параметры логического канала - s - scale, u - униполярный режим (всегда при Scale > 3), f --- 1, если включен фильтр и используется 24-битный режим, c - физический канал, g - группа каналов (1 для каналов 4--7, 0 - 0=-3), r - reference (0---2.5V, 1---5V)\\\hline
  LOAD\_DAC   & 10011 & LChCnt & 0000cccc ssssssss & LChCnt & Загрузка DAC shift (S) для канала C\\\hline
  SET\_REF    & 01110 & 1 & 00000000 0000000r & 1 & Установка опорного напряжения 2.5 или 5 Вольт \\\hline
  CALIBR\_4CH & 01010 & 1 & 0000cccc mmmmmmmm & 1 & Калибровка канала C в 4-канальном режиме (m-mode)\\\hline
  CALIBR\_8CH & 11000 & 1 & 0000cccc mmmmmmmm & 1 & Калибровка канала C в 8-канальном режиме (m-mode)\\\hline
RESET\_CODECS & 00001 & 1 & -                 & 1 & Сброс АЦП \\\hline
  SEL\_CODEC  & 00010 & 1 & 00000000 000000cc & 1 & выбор кодека (0-3) \\\hline
  WRITE\_8REG & 00011 & 2/1 & 00000000 000crrrr & 2/1 & Перед любой записью или чтением регистра сперва записывается с помощью этой команды адрес регистра (r) и направление передачи (c, c = 0- запись, c = 1 - чтение). Данные записываются/читаются соответствующими командами с нужной битностью \\\hline
  READ\_8REG & 00100 & 1 & - & 1 & Чтение 8-битного регистра, адрес которого был передан командой WRITE\_8REG \\\hline
WRITE\_16REG & 00101 & 1 & данные & 1 & Запись 16-битного регистра \\\hline
 READ\_16REG & 00110 & 1 & - & 1 & Чтение 16-битного регистра \\\hline
WRITE\_24REG & 00111 & 2 & данные & 1 & Запись 24-битного регистра - сперва старший байт, затем 2 младших \\\hline
 READ\_24REG & 01000 & 1 & - & 2 & Чтение 24-битного регистра. В ответе - сперва старший байт, затем 2 младших \\\hline
 WRITE\_SN\_CHECK & 10110 & 1 & Code & 1 & Команда разрешения записи серийного номера, разрешает только при правильном коде \\\hline
 TEST\_BIOS & 10010 & 1 & Code & 1 & Проверка прошивки \\\hline
 GET\_SW\_VER & 10111 & 1 & - & 1 & В ответе получаем версию прошивки (младший байт - минорная, старший - можорная) \\\hline
GET\_SW\_DATE & 11000 & 1 & - & 2 & В ответ --- два слова, в первом --- год создания прошивки, во втором --- в старшем байте \\\hline

  \end{tabular}

  \begin{tabular}{|m{5cm}|m{1cm}|m{4cm}|}
   \hline Адрес             & Размер & Название \\\hline
   7*PhyCh+0                & 3 & Offset \\\hline
   7*PhyCh+3                & 3 & Gain \\\hline
   7*PhyCh+6                & 1 & DacShift \\\hline
   60                       & 20 & Serial \\\hline
   80                       & 20 & Name \\\hline
   100+Scale*48+PhyCh*6     & 3 & InternalCalibrOffset \\\hline
   100+Scale*48+PhyCh*6 + 3 & 3 & InternalCalibrOffset \\\hline
   510                      & 2 & Crc \\\hline
  \end{tabular}



\section{Команды модуля LTR22}
Модуль LTR22 не использует бит четности в командах, в качестве кода команды используются 6 бит.
На команды в качестве подтверждения возвращается слова с данными, равными коду подтверждаемой команды.
Некоторые команды можно передавать во время сбора данных, тогда на них не возвращается ответа.
\begin{enumerate}
    \item Установка конфигурации модуля. Передается 4 команды, в ответ на каждую приходит подтверждение. Имеет смысл только с остановленным АЦП.\\
    \cmddescr{LTR22CMD\_SET\_ADC1234\_REGISTER}{14}{00000000 p000m0za}
    \begin{itemize}
      \item a --- Признак, используется DC режим (0) или AC режим (1)
      \item z --- Признак, используется ли режим измерения нуля (0), или штатный режим (1)
      \item m --- Признак, является ли модуль мастером при многомодульной синхронизации
      \item p --- Признак, запущен ли сбор данных
    \end{itemize}    
    \cmddescr{LTR22CMD\_SET\_ADC\_FREQ\_REGISTER}{15}{00000000 a000dddd}    
    \begin{itemize}
      \item a --- Признак, какой используется дополнительный делитель (если 1 => 3, 0 => 2)
      \item d --- Значение делителя частоты
    \end{itemize}    
    \cmddescr{LTR22CMD\_SET\_ADC\_SCOPE\_REGISTER}{16}{gggggggg gggggggg}
    \begin{itemize}
      \item g --- слово с диапазонами 4-х каналов (младшие 4 бита для нулевого канала, старшие - для 3-го)
    \end{itemize}
    \cmddescr{LTR22CMD\_SET\_ADC\_CH\_SYNC\_REGISTER}{17}{00000000 00sseeee}
    \begin{itemize}
      \item e --- Признак, разрешен канал или нет (младший бит для 0-го, старший - 3-го)
      \item s --- Рижим синхронизации (0 - внутренний старт, 1 - фазировка, 2 - внешний старт)
    \end{itemize}
 \item Получение текущей конфигурации модуля: \\
      \cmddescr{LTR22CMD\_GET\_MODULE\_CONFIG}{6}{-}
      В ответ приходит подтверждение и 4 команды с командами 31,32,33,34 (без признака команды INSTR --- 0xC0) и данными, соответствующими данным в командах для установки конфигурации. Имеет смысл только при остановленном сборе.
  \item Получение калибровочных коэффициентов\\
      \cmddescr{LTR22CMD\_GET\_CALIBR\_COEFS}{7}{-}
      В ответ возвращается подтверждение и 4800 слов в формате\\
      \cmddescr{-}{??????}{iiiiiiii dddddddd}
      \begin{itemize}
	\item i --- Номер возвращенного байта от 0 до 4799
	\item d --- Байт массива коэффициентов. Каждый коэффициент - 4 байта в формате float. 2 коэффицента (сперва смещение, затем шкала) на 6 диапазонов на 25 часов на 4 канала АЦП.
      \end{itemize}
  \item Получение текущей информации о модуле: \\
      \cmddescr{LTR22CMD\_GET\_MODULE\_DESCRIPTION}{8}{-}
      В ответ приходит подтверждение и 128 слов в формате, аналогичном формату калибровочных коэффициентов
  \item Установка режима мастер/подчиненный\\
      \cmddescr{LTR22CMD\_SET\_SYNC\_PRIORITY}{19}{00000000 0000000m}
      \begin{itemize}
        \item m --- 1, если устанавливается режим мастера, иначе 0
      \end{itemize}
      В ответ возвращается подтверждение, но только если не запущен сбор данных
  \item Запуск фазировки\\
      \cmddescr{LTR22CMD\_SYNC\_PHAZE}{18}{00000000 00000000}
      По приему команды модуль переходит в состояние ожидания сигнала фазировки, с выдачей сигнала в случае, если модуль является мастером. Сразу возвращается один ответ на команду.
      Второй ответ на команду приходит после завершения фазировки.
  \item Запуск сбора данных по АЦП\\
      \cmddescr{LTR22CMD\_START\_ADC}{40}{00000000 0000000s}
      \begin{itemize}
        \item s --- если 0, то запуск будет произведен по приходу команды, иначе - по внешнему сигналу
      \end{itemize}
      В ответ возвращается подтверждение сразу, даже если задана внешняя синхронизация.
  \item Включение режима измерения нуля.\\
      \cmddescr{LTR22CMD\_MEASURE\_ADC\_ZERO}{1}{00000000 0000000z}
      \begin{itemize}
        \item z --- инвертированный признак режима измерения нуля (0-измерение нуля, 1 - нормальный режим)
      \end{itemize}
      Доступно только при остановленном сборе. В ответ приходит подтверждение.
  \item Установка частоты сбора АЦП. Устанавливается двумя командами (основной делитель и вспомогательный), на каждую высылается подтверждение. Доступно только когда нет сбора данных.\\
  \cmddescr{LTR22CMD\_SET\_ADC\_MAIN\_DIV}{4}{00000000 dddddddd}
  \cmddescr{LTR22CMD\_SET\_ADC\_EXTRA\_DIV}{5}{00000000 0000000a}
   \begin{itemize}
      \item d --- основной делитель частоты
      \item a --- дополнительный делитель частоты: 2 (a=0) или 3 (a=1)
    \end{itemize}
  \item Установка режима измерения АЦП (AC или AC+DC). Теоретически возможно выполнять во время         сбора (тогда без ответа)\\
    \cmddescr{LTR22CMD\_AC\_AC\_DC\_STATE}{2}{00000000 0000000d}
    \begin{itemize}
      \item d --- режим (1 --- AC+DC, 0 --- AC)
    \end{itemize}
   \item Установка диапазона для канала АЦП. Теоретически возможно выполнять во время сбора (тогда без ответа)\\
    \cmddescr{LTR22CMD\_SET\_ADC\_RANGE}{3}{000000cc 00000rrr}
    \begin{itemize}
      \item c --- номер канала (0-3)
      \item r --- диапазон измерения (0-5)
    \end{itemize}
   \item Включение/выключение канала АЦП. Теоретически возможно выполнять во время сбора (тогда без ответа)\\
   \cmddescr{LTR22CMD\_SET\_ADC\_CHANNEL}{12}{000000cc 0000000e}
    \begin{itemize}
      \item c --- номер канала (0-3)
      \item e --- признак, должен быть канала включен (е=1) или выключен (е=0)
    \end{itemize}
    

  
      
 
\end{enumerate}

        
  
  
  
  
  
  
  
  
  
  






Команды: \\
  00ts0000 00000000 1000MMMM 00000000  <- синхрометки LTR41/42/43 \\
  00ts0000 00000000 11111111 00010000  <- синхрометки LTR EU \\

  0000ZZZZ ZZZZZZZZ 1000MMMM 110ExxxF  <- status от LTR34 \\
  DDDDDDDD DDDDDDDD 1000MMMM 111ECCCF  <- echo от LTR34 \\

LTR41, LTR42, LTR43 (коды команд для LTR42 сдвинуты на 1, из-за отсутствия команды read word..., коды подтверждений вообще разные для всех модулей):
  00000000 00000000 1000MMMM 11001111  -> init (first dummy command) \\
  0000000a 00tt00ss 1000MMMM 11p00010  -> config marks (t - start mark mode, s - second mark mode, a - ack\_en - LTR42) \\
  00tt00ss 0000dddd 1000MMMM 11p00010   -> config LTR43 (d - io dir, остальное как в Config marks)
  ssssssss rrrrrrrr 1000MMMM 11p01011  -> config rate  (s -scaler, p - prescaler) \\
  00000000 00000000 1000MMMM 11p00001  -> read word \\
  00000000 00000000 1000MMMM 11p01001  -> start stream read \\
  00000000 00000000 1000MMMM 11p01010  -> stop stream read \\
  00000000 00000000 1000MMMM 11p00011  -> start second mark \\
  00000000 00000000 1000MMMM 11p00100  -> stop second mark \\
  00000000 00000000 1000MMMM 11p00101  -> make second mark \\
  aaaaaaaa aaaaaaaa 1000MMMM 11p00110  -> Write EEPROM (a - address)
  00000000 dddddddd 1000MMMM 11p00110  -> Write EEPROM (d - data) Команды одинаковые - в первой передается адрес а во второй - данные, ответ приходит на две команды одинаковый. Решение кривое конечно, но ничего уже не изменить.\\
  aaaaaaaa aaaaaaaa 1000MMMM 11p00111  -> Read EEPROM (a - address, в ответе в данных возвращается считанный байт) \\
  00000000 00000000 1000MMMM 11p00100  -> read config record (в ответ приходит 44 слова с информацией о модуле и CRC16)
  xxxxxxxx xxxxxxxx 1000MMMM xxp10111  <- parity error (в ответ на команду с неверной чётностью) для LTR42 - 11110\\
  xxxxxxxx xxxxxxxx 1000MMMM xxp11101  <- data confirm (если включены подтверждения - то высылается на каждое слово)
  xxxxxxxx xxxxxxxx 1000MMMM xxp11111  <- transfm error (высылается при неудаче вывода данных)
LTR43 Only:
  bbbbbbbb bbbbbbbb 1000MMMM 11p00110  -> RS485 config 1 (b - слово, определяющее частоту передачи по RS485)
  00000srr 00000fff 1000MMMM 11p00110  -> RS485 config 2 (s - ниличие stop-бита, rr - четность, fff - размер кадра: 7 => 9, 0-3 => 5-8)
  ssssssss rrrrrrrr 1000MMMM 11p00110  -> RS485 config 3 (s/r - send/receive timeout multipler) (ответ только на третий)
  ssssssss rrrrrrrr 1000MMMM 11p00111  -> RS485 Send byte (в первом пакете указано: s - сколько байт на передачу, r - сколько на приём, далее должно следовать s команд с данными в старшем слове)

  00000000 dddddddd 1000MMMM 11p00111  <- RS485 recv byte - первый байт ответа - содержит младшие 8 принятых бит
  00000000 rf00000d 1000MMMM 11p00111  <- RS485 recv byte 2 - второй байт ответа - содержит 9-й бит и признаки ошибок (r - четности, f - кадра)

LTR212:
  000000aa aaaaaaa 1000MMMM 11p001100 -> read EEPROM (a - адрес байта, в ответе - полученный байт)






\end{document}
