Как проверить процедуру сборки Bit-Banged-коммуникации - PullRequest
0 голосов
/ 20 апреля 2019

Для одного MCU я написал несколько процедур сборки, выполняющих RX и TX по проприетарному протоколу (на основе UART) в стиле бит-бэнг.Как я могу их проверить?

TX может быть проверен путем отправки данных и в то же время с помощью логического анализатора, проверяющего правильность всех выборочных таймингов (вручную или с помощью некоторых сценариев).

RX, с другой стороны, сложнее.С одной стороны, я могу проверить, получаю ли я то, что отправляет кто-то другой, но с другой стороны, как я узнаю, что выборка RX происходит правильно (по времени)?
Например, моя процедура RX может вернутьсяправильные данные путем выборки на краю «битового окна» вместо середины.
Я думал о переключении «булавки отладки», чтобы указать, когда фактически происходит выборка, но это приводит к задержкам в процедуре выборки, поэтомуЯ бы не стал тестировать свою первоначальную процедуру.

Некоторые вещи, которые стоит уточнить после прочтения комментариев:

  • Я знаю, что аппаратный UART лучше (это зависит, однако), но я могуНе используй это.Дело не в том, «вы пробовали это ...?»;
  • Я знаю, как выполнять битовую привязку (я уже написал процедуры сборки);
  • Я могу 't соединить TX с RX, потому что я использую только 1 провод (связь полудуплексная);
  • Я спрашиваю, как проверить время выборки RX, а не как реализовать UART.

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Я думал о переключении "булавки отладки", чтобы указать, когда выборка на самом деле происходит, но это приводит к задержкам в выборке процедура, следовательно, я не буду проверять мою первоначальную рутину.

Проведите тестирование с помощью кода инструментов, а затем оставьте инструментарий - или почти эквивалентный код, который фактически не изменяет аппаратное обеспечение - на месте .

0 голосов
/ 20 апреля 2019

Вам понадобится что-то для отправки данных в MCU, возможно, второе MCU. Я работал над похожим кодом для 6502 и Z80 для старых 8-битных периферийных устройств Atari. Это полудуплексные протоколы, поэтому, когда устройство не используется, оно запрашивает стартовый бит. После обнаружения начального бита он задерживается в 1,5 бита, а затем получает 8 бит с интервалом в 1 бит между битами. Как прием, так и отправка данных подпрограмм кодируются для получения точного количества циклов для синхронизации. Это были старые устройства, и даже самая быстрая скорость передачи данных была относительно медленной - 19 микросекунд на бит ~ = 52600 бод.


Вопрос был обновлен. Если инструкции ввода и вывода выполняются в одно и то же время (счетчик циклов), вы можете изменить код приема для передачи данных, чтобы проверить битовое время и точно подтвердить, насколько быстро работает процессор.

Для определения времени, необходимого для определения начального бита и для ожидания времени в 1,5 бита, вам потребуется рассчитать минимальное и максимальное количество циклов для определения начального бита. Максимальное число циклов будет входной инструкцией, которая просто пропускает задний фронт начального бита, тестовую инструкцию и цикл обратно на вход, после чего следует еще один тест и затем падение цикла, чтобы продолжить прием. Минимальный счетчик циклов будет входом, который едва улавливает передний фронт стартового бита, выполняет тест, а затем проходит через цикл. Затем оставшаяся часть полученного кода должна выбирать как можно ближе к середине битовых периодов данных.

Вот пример кода для 480 Гц Z80, который получает данные за 19 микросекунд == 76 циклов на бит данных. Комментарии включают количество циклов для каждой инструкции. Идеальное время ожидания от начального бита до 1-го бита данных составляет 114 циклов. Минимальное, максимальное время цикла для начального битового цикла составляет 20,50 циклов. Используется дополнительная задержка плюс вход первого бита данных из 79 циклов, поэтому минимальное, максимальное время цикла для определения начала приема 1-го бита данных составляет 99 129 циклов, в пределах минимальных, максимальных границ 76 152 циклов. Остальные биты данных считываются точно с 76 циклами на бит.

        LD      E,0             ;SET UP
;                               ;       START BIT TO DATA BIT=114
NRXF0:  LD      A,(FBS)         ;(13)   WAIT FOR START BIT
        AND     FBSRXD          ;(7)
        JP      NZ,NRXF0        ;(10)
;                               ;       NOTE: 20 MIN, 50 MAX, 35 AVG
        EX      (SP),HL         ;(19)   DELAY 
        EX      (SP),HL         ;(19)
        LD      A,(HL)          ;(7)
NRXF1:  LD      A,(HL)          ;(7)
        LD      A,(HL)          ;(7)
        LD      D,8             ;(7)    8 BITS PER BYTE
;                               ;       76 CYCLES PER DATA BIT
NRXF2:  LD      A,(FBS)         ;(13)   GET DATA BIT
        AND     FBSRXD          ;(7)
        ADD     A,0FFH          ;(7)
        RR      C               ;(8)
        PUSH    BC              ;(11)   DELAY
        POP     BC              ;(10)
        NOP                     ;(4)
        DEC     D               ;(4)    LP TIL BYTE DONE
        JR      NZ,NRXF2        ;(12/7)
        RET     NZ              ;(5)    DELAY
NRXF4:  LD      A,(FBS)         ;(13)   WAIT FOR NEXT START BIT
        AND     FBSRXD          ;(7)
        JP      NZ,NRXF4        ;(10)
;                               ;       START BIT TO DATA BIT=114
        LD      (HL),C          ;(7)    STORE BYTE
        LD      A,C             ;(4)    DO CKSUM
        ADD     A,E             ;(4)
        ADC     A,0             ;(7)
        LD      E,A             ;(4)
        INC     HL              ;(6)    ADV ADR
        DJNZ    NRXF1           ;(13/8) LP IF MORE BYTES
...