Реализация протокола 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 слов принято и передано и ни одной ошибки. :)
    Метки:
    Поделиться публикацией
    Комментарии 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. Но пока в этом режиме он не понадобился. Хватило осциллографа. :)

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