Как по UART реализовать специальную посылку, называемую Break

Тема в разделе "Проводная и беспроводная связь", создана пользователем Pavel8564, 4 ноя 2019.

  1. Pavel8564

    Pavel8564 Нуб

    Всем привет!
    Подскажите как реализовать в скетче ардуино данную задержку Break ? (в моем случае необходимо 14 битовых интервалов, из которых 13 бит это лог 0, и 1 бит лог 1).

    Break (Материал из Википедии)
    Некоторые UART обладают возможностью посылать и принимать специальную посылку, называемую Break. Она состоит из непрерывного нулевого состояния линии длительностью заведомо больше минимальной посылки, обычно 1,5 минимальных посылки (для 8N1 это 15 битовых интервалов). Некоторые коммуникационные протоколы используют это свойство, например, протокол LIN использует Break для обозначения нового кадра.


    WhatsApp Image 2019-11-04 at 15.16.35.jpeg


    Написал вот такой примитивный скетч... как мог

    byte Sync[] = {0x55}; // байт синхронизации
    byte ID[] = {0x9C}; // байт адреса устройства
    #define rxPin 0
    #define txPin 1


    void setup()
    {
    pinMode(rxPin, INPUT);
    pinMode(txPin, OUTPUT);
    digitalWrite(txPin, LOW);
    delayMicroseconds(675);
    // расчет из 52 мкс длина бита х 13 бит длины
    Serial.begin(19200);
    delayMicroseconds(135);
    Serial.write(Sync, 1);
    delayMicroseconds(565);
    Serial.write(ID, 1);
    }


    void loop()
    {

    }


    Далее подключив лог анализатор получил вот такую картинку...
    вроде бы все по настоящему, но лог. анализатор не расшифровывает как протокол, исчезли Sync, ID:0x1C
    пробовал по разному, задержка между байтов и тд.. результатов нет, и устройство на шине тоже не откликается.

    наверное дело в правильной программной реализации Break?

    DsLogic эмуляция запоса ID 1C.png

    frame-slot.png
    master-header-sync-break.png
     
  2. parovoZZ

    parovoZZ Гуру

    ну, на верхней осциллограмме сразу после break идет "1" длительностью два бита. На нижней такого нет.
     
  3. Pavel8564

    Pavel8564 Нуб

    Я делал и такую длительность, разницы никакой...
     
  4. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Код (C++):
    ...
    digitalWrite(txPin, LOW);
    delayMicroseconds(675); // расчет из 52 мкс длина бита х 13 бит длины
    digitalWrite(txPin, HIGH);
    delayMicroseconds(52);   // там сколько вам надо ???
    Serial.begin(19200);
    Serial.write(Sync, 1);
    ...
    не ?
    По логике - после команды Serial.begin(19200) - прямое дрыганье (Бит-Бенг) выводом Тх не возможно. Будет конфликт в программе. Поэтому надо заранее "отдрыгать".. На рисунках - двунаправленный обмен по ОДНОМУ проводу. Ваше устройство тоже такое ? Тогда сначала над железом думать надо. Чтобы освобождать линию вовремя.
     
    Последнее редактирование: 8 ноя 2019
  5. parovoZZ

    parovoZZ Гуру

    не будет. И дрыганья не будет))
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну коль дрыганья не будет - это и есть конфликт. Зависанья, мордобоя и стрельбы не будет.
     
    Последнее редактирование: 8 ноя 2019
  7. parovoZZ

    parovoZZ Гуру

    Регистр порта дрыгаться будет. Но так как нога физически отключена от регистра, то дальше регистра это не уйдет.
     
    Ariadna-on-Line нравится это.