ksig.md 4.1 KB

~={green}Проект для тестирования стержней.=~

~={yellow}Таймеры=~

  • TIM_2 - вход в режиме ETR
  • TIM_3 - вход в режиме ETR
  • TIM_4 - вход в режиме ETR
  • TIM_6 - uptime
  • TIM_8 - вход в режиме ETR
  • TIM_12 - передача данных по USB
  • TIM_14 - статистика FreeRTOS

~={yellow}Остальное=~

  • USART_3 - терминал
  • Опрос датчиков. Протокол обмена.

Фиксация значений счетчиков и дискретных входов происходит с интервалом 1мс. В этот момент заполняется следующая структура данных:

typedef struct
{
    uint32_t    pack_counter; 
    uint16_t    vertical;
    uint16_t    horizontal;
    uint32_t    dpl_1;
    uint32_t    dpl_2;
    uint8_t     flag;
      
} signals_t;

/*
pack_counter - увеличивается на 1 каждый раз при заполнении новой структуры
vertical - вертикальный детектор (значения не накапливаются)
horizontal - горизонтальный детектор (значения не накапливаются)
dpl_1 - первый инкрементальный датчик (значения накапливаются)
dpl_2 - второй инкрементальный датчик (значения накапливаются)
flag - байт дискретных датчиков
	0-ой бит - датчик начала измерения (НИ)
	1-ый бит - датчик конца измерения (КИ)
	2-ой бит - датчик Д1000
*/

Для передачи данных используется протокол Wake. Структуры упаковываются в пакеты. Пакет может содержать одну или более целых структур. Частично структуры не передаются.

Пакет состоит из заголовка, полезных данных и контрольной суммы.

Заголовок пакета: |------ Байт 1 ------|------ Байт 2 ------|------ Байт 3 ------|------ Байт 4 ------|------ Байт 5 ------| |--- WAKE_FEND ---|------- Адрес -----|-- Номер пакета--|------Размер данных в байтах--------|

WAKE_FEND - признак начала пакета - 0x0C, Адрес - адрес устройства - 0x81 Байты 4 и 5 содержат длину только полезных данных без учета заголовка и контрольной суммы. Номер пакета увеличивается на 1 с каждым новым пакетом. Контрольная сумма располагается в конце пакета и занимает один байт. Контрольная сумма рассчитывается для всего пакета, включая заголовок и блок полезных данных.

uint8_t Wake::crc_8(uint8_t *data, int length)
{
    uint8_t crc = 0x00;
    uint8_t extract;
    uint8_t sum;
    
    for (int i = 0; i < length; i++) {
        extract = *data;
        for (uint8_t tmp = 8; tmp; tmp--) {
            sum = (crc ^ extract) & 0x01;
            crc >>= 1;
            if (sum)
                crc ^= 0x8C;
            extract >>= 1;
        }
        data++;
    }
    return crc;
}

Для передачи пакетов по USB используется буфер размером 512 байт. В буфер такого размера помещается порядка 29 структур, завернутых в пакет в один протокола Wake.

Пример чтения данных из тестового скрипта:

def receiver_test(self):
	while True:
	    msg = self.serial.read(512)
	    if msg:
			self.recv_chank(msg)
		else:
			print("USB receive timeout")

Скрипт usb_receiver.py находится tools/