<h4>Modbus</h4>
<h6>Определение конца пакета.</h6>
- Если скорость передачи данных больше 19200, то нужно использовать фиксированное время 1750 мкс. В противном случае время должно быть в 3,5 больше времени символа.
- Таймер настраивается на частоту 50 мкс.
- В данном проекте управление переключением режима передачи происходит не стороне контроллера. Между включением передатчика и отправкой первого байта пакета необходима задержка. Задержка необходима и между отправкой последнего символа и выключением передатчика. Задержка реализована с помощью аппаратного таймера TIM6. Время задержки соответствует времени передачи двух символов с учетом текущей скорости USART.
<h6>Функции</h6>
- **0x01 (1)** - чтение значений из нескольких регистров флагов - Read Coil Status.
- **0x02 (2)** - чтение значений из нескольких дискретных входов - Read Discrete Inputs.
- **0x03 (3)** - чтение значений из нескольких регистров хранения - Read Holding Registers.
- **0x04 (4)** - чтение значений из нескольких регистров ввода - Read Input Registers.
- **0x05 (5)** - запись значения одного флага - Force Single Coil.
- **0x06 (6)** - запись значения в один регистр хранения - Preset Single Register.
- **0x07 (7)** - чтение сигналов состояния - Read Exception Status.
- **0x08 (8)** - диагностика - Diagnostic.
- **0x0B (11)** - чтение счетчика событий - Get Com Event Counter.
- **0x0C (12)** - чтение журнала событий - Get Com Event Log.
- **0x0F (15)** - запись значений в несколько регистров флагов - Force Multiple Coils.
- **0x10 (16)** - запись значений в несколько регистров хранения - Preset Multiple Registers.
- **0x11 (17)** - чтение информации об устройстве - Report Slave ID.
- **0x14 (20)** - чтение из файла - Read File Record.
- **0x15 (21)** - запись в файл - Write File Record.
- **0x16 (22)** - запись в один регистр хранения с использованием маски "И" и маски "ИЛИ" - Mask Write Register.
- **0x18 (24)** - чтение данных из очереди - Read FIFO Queue.
- **0x2B (43)** - Encapsulated Interface Transport.
<h6>Команды и регистры для теста</h6>
Проверить функции для чтения и записи:
* (0x03) Read Holding Registers. Чтение N регистров управления и уставок.
* (0x10) Write Multiple registers Запись N регистров управления и уставок (0x10).
Адреса тестовых регистров для чтения и записи:
0x30 - лежит значение 123456789 тип uint32_t (4 байта)
0x32 - лежит значение 32768 тип uint16_t (2 байта)
0x34 - лежит значение 1.23456 тип float (4 байта)
<h6>Карта памяти</h6>
0x0800 0000 - 0x0801 FFFF (128кБт) - **IAP**  
0x0802 0000 - 0x0802 07FF (2кБт) - **Основные настройки (SETTINGS)**  
0x0802 0800 - 0x0802 0FFF (2кБт) - **Системные настройки (SETTINGS_SYS)**  
0x0802 1000 - 0x080F FFFF (кБт) - **FW**

<h6>Настройки</h6>
```c
// Адрес CRC системных настроек
#define SYS_CRC_ADDRESS                 0x08020FFC

// Контрольное слово системных настроек
#define SETTINGS_CONTROL_WORD           123456789

// Структура системных настроек
typedef struct
{
    uint16_t model;			    // Модель
    char sn[SN_LEN];            // Серийный номер
    char proddate[PROD_LEN];	// Дата производства
    char testState[16];         // Статус тестирования
    uint32_t controlword;       // Контрольное слово
    uint32_t crc;               // CRC
    
} sys_settings_t;

```

<h6>Таймеры</h6>
- TMR_7 - основной modbus таймер
- TMR_6 - дополнительный modbus таймер
- TMR_10 - uptime
- TMR_12 - таймер функции антидребезга
- TMR_9 - для выходов PWM (10 Гц частота прерывания)
<h6>TODO</h6>
- Выход из IAP по таймауту после получения первого пакета с ключом и размером.
- Перенести вызов функции очисти флеш-памяти под FW.
- Добавить проверку CRC.

<h6>Логика</h6>
**Безопасный режим**
При включении или обрыве связи по RS-485 интерфейсу дискретные выходы должны переходить в безопасный режим или выставлять последнее полученные настройки для выходов.
Включение безопасного режима должно задаваться настройкой. В случае если безопасный режим отключен, то на входах при старте работы модуля или обрыве связи должны выставляться последнее полученные настройки для выходов.
<h6>ADC MS5192T (16 бит)</h6>
* Настроить в режиме с включенным буфером.
* По умолчанию включается режим непрерывного преобразования.
*
**Разное:**
* MS5192T/MS5193T при усилении 1 или 2 работают в режиме без буфера. При увеличении усиления буфер автоматически включается. В режиме с буфером абсолютное входное напряжение ограничено от GND + 100 мВ до AVDD - 100 мВ. При увеличении усиления до 4 или более, включается приборный усилитель. При использовании приборного усилителя абсолютное входное напряжение ограничено от GND + 300 мВ до AVDD - 1.1B. При установке общего режима напряжения пользователь должен учитывать вышеперечисленные ограничения, чтобы не превысить указанные значения и избежать снижения линейной и шумовой характеристики устройства.
* 
**Коммуникационный регистр**
- Бит 7. (1 - будет запись. 0 - чтение).
- Бит 6. (0 - следующая операция запись в указанный регистр. 1 - чтение).
- Биты 5, 4, 3. (биты адреса, какие регистры выбраны для обмена).
- Бит 2. (вкл/выкл режим непрерывного чтения. Смотри примеры ниже)
- Биты 1, 0. (всегда 0)

**Биты 5, 4, 3:**
0 0 0 - Запись в устройство осуществляется в 8и битный коммуникационный регистр
0 0 0 - Чтение из устройства производится из 8-битного регистра состояния
0 0 1 - Регистр режима 16 бит
0 1 0 - Конфигурационный регистр 16 бит
0 1 1 - Регистр данных 16 бит (MS5193T) / 24 бит (MS5192T)
1 0 0 - Регистр ID 8 бит
1 0 1 - Регистр IO 8 бит
1 1 0 - Регистр смещения 16 бит (MS5193T) / 24 бит (MS5192T)
1 1 1 - Регистр полной шкалы 16 бит (MS5193T) / 24 бит (MS5192T)

**Примеры:**
- 01011100 - включить режим непрерывного чтения
- 01011000 - выключить режим непрерывного чтения (при записи сигнал RDY должен быть низким)
**Регистр состояния**
Для получения регистра состояния нужно записать в регистр связи: 01000000
В режиме непрерывного чтения до записи инструкции линия DIN должна быть в низком состоянии.