29 ноября 2016 в 15:37

Реализация протокола MIL-STD-1553 на STM32

Однажды, появилась необходимость использования в нашем устройстве мультиплексного канала обмена информацией (МКИО), он же ГОСТ Р 52070-2003, он же MIL-STD-1553В. Первоначальный результат поисков несколько удивил: типовые решения выдаваемые поисковой системой, как правило, основывались на использовании ПЛИС. Поскольку решать проблему нужно было быстро, появилась мысль сделать конвертер протокола из MIL-STD-1553 в MODBUS RTU. При этом постараться использовать достаточно недорогие технические решения и микроконтроллер из семейства STM32.



На фото из Википедии: F16, на котором впервые был использована шина MIL-STD-1553В. Наши устройства не летают :), поэтому каких либо ограничений по применению элементной базы нет. Просто у Заказчика приборная сеть построена на основе этой шины. Первая часть статьи описывает прием и передачу по шине МКИО, вторая часть будет про конвертер в MODBUS.

Первый этап любой разработки: поиск информации и чтение документации. После этого этапа в голове сложилось следующее:

— протокол достаточно прост :)
— максимальный кадр 32 байта :)
— имеет довольно жесткий тайминг :(
— довольно дорогие микросхемы и модули :(

После некоторых размышлений остановился на использовании кодера — декодера HI-15530, фирмы HOLT, однако аналогов у это микросхемы достаточно много. Правда не все могут быть доступны в России за разумные деньги и сроки. :)

Вот примерная схема включения этой микросхемы. Правда взята из даташита аналога. :)



Дальше все просто :) Подключаем к портам микропроцессора 16 разрядные шины данных: PARALLEL IN и PARALLEL OUT и управляющие сигналы:

— VALID WORD (Принято корректное слово)
— ENCODER ENABLE (Начало передачи слова)
— COMMAND SYNC (Выбор команда/данные)

Вместо регистра 74LS164 пришлось использовать аналог ЭКФ1533ИР8. Кроме этого используются повторители SN74ALS1035 (ЭКФ1533ЛП17) с открытым коллектором для согласования сигналов 3.3В (STM32) до 5В (HI-15530).

После некоторой переписки с производителями и поставщиками был выбран приемо-передачик EL-15N фирмы ЕЛКУС.



Добавился еще один сигнал управления ST (Включение передатчика)

Получилась вот такая плата.



Началась отладка программного обеспечения. Для имитации обмена данных с каналом был приобретен USB модуль у компании «Модуль», который может быть, как оконечным устройством (ОУ), так и контроллером шины (КШ).



К модулю прилагается программа управления PURUMK. Программа приема и передачи получилась достаточно простой.

Прием 16 разрядного слова происходит по прерыванию от сигнала VALID WORD:

void EXTI9_5_IRQHandler (void) //Valid Word
{
    Ctrl_LED3_ON
    EXTI->PR|=0x0040; //Очищаем флаг
    STD1553_RX_buffer[recieve_count] = GPIOE->IDR;
    recieve_count++;
    frame_from_channel = 1; //флаг принятого слова
    Ctrl_LED3_OFF
}

Обработка флага принятого слова:

     if (frame_from_channel) 
     {
       frame_from_channel = 0;
      
       switch (Channel_state)
       {
       case 0: //обработка командного слова
         
         Device_address_recieved = STD1553_RX_buffer[0];
         Device_address_recieved = Device_address_recieved >> 11;
         
         if (Device_address_recieved == Device_address) //запрос по адресу
         {
           Command_recieved = STD1553_RX_buffer[0];           //сохранение команды в буфере
           Command_recieved = Command_recieved  & 0x001F; //выделение команды/количества слов
           Transmitt_direction = STD1553_RX_buffer[0];
       
           Transmitt_direction = Transmitt_direction & 0x0400;
           if (Transmitt_direction == 0x0400) //запрос информации в канал
           {
             TRANSMITTER_ENABLE_HIGH;
  
             //запуск таймера передачи данных
             TIM5->CR1 |= TIM_CR1_CEN;            //Bit 0 CEN: Counter enable
             TIM5->CNT = Transmitt_word_period;   // 
  
             Answer_word_flag = 1;
           }
           else                                 //прием данных из канала
           {
             Channel_state = 1; 
           }
         }
         else
         {
           recieve_count = 0;
         }
         break;
         
       case 1: //прием данных
          if (recieve_count == Command_recieved + 1)
          {
            //передача ответного слова
            TRANSMITTER_ENABLE_HIGH;
            Answer_word_flag = 1;
            Command_recieved = 0; 
            //запуск передачи
            TIM5->CR1 |= TIM_CR1_CEN;     //Bit 0 CEN: Counter enable
            TIM5->CNT = Transmitt_word_period;                // 
          }
         break;
       } //end of switch
     } //end of if

И собственно передача данных в канал. Передача каждого слова в канал происходит по прерыванию таймера.

//передача данных по МКИО
void TIM5_IRQHandler (void)  //
{
  EXTI->IMR       &= ~EXTI_IMR_MR6;            //DISABLE Interrupt Mask on line 1
  
  if (Answer_word_flag)
  {
     SYNC_SELECT_COMMAND;
     Answer_word_flag = 0;
  }
  else
  {
    SYNC_SELECT_DATA;
  }
  
  GPIOD->ODR = STD1553_TX_buffer[transmitt_count];
  delay(5);      
  ENCODER_ENABLE_HIGH;    //запись данных в регистр
  delay(112);  
  transmitt_count ++;
  ENCODER_ENABLE_LOW;    //начало передачи данных в канал

  if (transmitt_count > Command_recieved) 
  {
    delay(700);    
    TIM5->CR1 &= ~TIM_CR1_CEN;              //Bit 0 CEN: Counter enable
    transmitt_count = 0;
    EXTI->IMR       |= EXTI_IMR_MR6;        //ENABLE Interrupt Mask on line 1
    Channel_state = 0;
    recieve_count = 0;
    TRANSMITTER_ENABLE_LOW;
    
  }
  TIM5->SR = 0;
  TIM5->CNT = 0;    
}

И вот результат.



Аббревиатуры ОУКШ и КШОУ означают, соответственно: оконечное устройство — контроллеру шины, контроллер шины — оконечному устройству. То есть в первом случае запрос на передачу данных от ОУ, а во втором передача данных оконечному устройству. И в том, и другом случае передается по 31 слову. Более 10000 слов принято и передано и ни одной ошибки. :)
@sanders1967
карма
10,0
рейтинг 16,8
Самое читаемое Разработка

Комментарии (24)

  • 0
    Заметно, что вы старались использовать отечественную элементную базу. Но почему не стали использовать микроконтроллеры от Миландра, у них и поддержка MIL-STD-1553 есть?
    • +1
      Их продукцию тоже рассматривал. Вот такой чип нашел 1986ВЕ1Т, с поддержкой MIL-STD-1553. Но поиск по Efind выдал, что стоит он около 20 000=, отладочная плата от 80 000=. Как то не очень бюджетно получается. Они прежде всего ориентированы на то, что летает. Соответственно и корпуса и приемка очень не дешевые. А мне нужно было именно бюджетное решение.
      • +1
        Скорее всего за 20 тысяч вы нашли версию в керамическом корпусе. Данный микроконтроллер имеет и версию в пластике под наименованием К1986ВЕ1QI, на сайте пишут цену 715,08 отладочный комплект 6545 рублей.
        • 0
          Это хорошая цена. В будущем можно рассматривать применение. Хотя очень надеюсь, что больше не придется использовать этот интерфейс. :)
    • 0
      А вы тему то на их форуме читали про мультиплекс? Он не соответствует ГОСТу. Вроде в 5ой или 6ой коррекции чипа обещали поправить, точно не помню.

      Хотя вопрос резонный. По приемопередатчикам та же тема. Странный подбор компонентов.
      • +1
        Запросы по приемо-передатчикам были разосланы по нескольким компаниям. Именно этот оказался за приемлемые деньги и сроки. Вообще на этой плате приемо-передатчик самый дорогой компонент. :)
  • +2
    Программа приема и передачи получилась достаточно простой.

    Протокол реализован частично, нет даже обработки ошибок.
    • +2
      Считывание принятого слова начинается по сигналу VALID WORD, который поднимает микросхема декодера. Вот как сказано в ДШ: A high on VALID WORD output indicates a successful reception of a word without any Manchester or parity errors. Если есть ошибки, значит не будет сигнала и, соответственно, прерывания на обработку слова.
      • +1
        А где обработка команд, подадреса, ошибок при передачи, поддержка резервирования и пр. — я понимаю, что может быть вам это не надо, но тогда не напишите что реализовали протокол.
        Если есть ошибки, значит не будет сигнала и, соответственно, прерывания на обработку слова.

        слово пропадет, в сообщении будет дырка, но мы об этом не узнаем, прекрасно.
  • 0
    Т.е. вы хотите сказать, что полностью реализовали протокол со всякими busy и командными словами?
    По мне, протокол по ГОСТ Р 52070-2003 самый дурацкий, с которым приходилось сталкиваться.
    • +2
      Т.е. вы хотите сказать, что полностью реализовали протокол со всякими busy и командными словами?

      Нет, конечно. :) Только тот функционал, который был нужен мне.

      По мне, протокол по ГОСТ Р 52070-2003 самый дурацкий, с которым приходилось сталкиваться.

      Полностью согласен. :)
    • 0
      Нормальный протокол, наверно наиболее близок к CAN. Есть свои особенности — контроль передачи каждого слова, детерминизм, в остальном все стандартно. ГОСТ тяжелый в силу непривычности терминов.
  • 0
    Ждем продолжения, когда заказчик попросит провести сертификацию.
    • 0
      Хорошо. Продолжение будет. :)
  • +1
    Ожидал, что будет что-то интересное типа эмуляции протокола, а оказалось, что показалось.
    — максимальный кадр 32 байта :)

    Не байта, а 16-битных слова

    В выбранной микросхеме только приёмо-передатчик? То есть обеспечивает лишь физику? Ответные слова и всё остальное кто должен формировать?

    Странно видеть отправку слов по таймеру: времянка при посылке данных очень строгая, задержки между словами данных не предусмотрено. По крайней мере задержка более 4 мкс не допускается.
    Может проще было бы добыть какой-нибудь модуль с буферной памятью для 1553?

    Это pet-проект или что-то из рабочего-то? :)
  • 0
    Вы правы — ошибочка вышла :) конечно 32 слова. В HI-1553 кодер и декодер манчестера и контроль четности. Прерывания по таймеру выдерживаются достаточно строго. Это из рабочего, управление высоковольтным выпрямителем.
    • 0
      Брутальненько… Тем более без контроля ошибок. У Вас есть хотя бы простейшая защита сообщений контрольной суммой?
      И я как-то не совсем понял, при чём тут STM32? Для заголовка? :)
      Таймер, отправляющий слова, должен иметь период не менее 20 мкс и не более 24 мкс, лучше ближе к 20 мкс. Но вообще брутально всё это. Неужели микруха не отдаёт прерывание по окончанию пересылки?
      • 0
        Какой контроль ошибок Вы имеете в виду? Кое чем STM32 все-таки занимается в этой схеме. :)
        • 0
          Контроль целостности передачи информации.
          Когда принимаете командное слово и собираете посылку, проверяете соответствие количества принятых слов длине из КС?
          Ещё раз повторю вопрос про то, кто формирует ответные слова.
          • 0
            Контроль четности делает HI-15530. Сравнение счетчика принятых слов и длины из КС пока не делал. Ответные слова формирует контроллер STM32.
            • 0
              Вам определённо надо реализовать ECSS-E-ST-50-13C на досуге :D
              • 0
                Когда-нибудь и до SpaceWire доберемся… :)
    • 0
      PS: а монитор шины-то есть у Вас нормальный? С ним жизнь становится куда приятнее.
      • 0
        В качестве монитора шины может работать МВ26.20. Но пока в этом режиме он не понадобился. Хватило осциллографа. :)

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.