синхронизация двух 8250 UART на отдельных часах (микроконтроллеры) - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь выяснить, какой алгоритм лучше использовать, чтобы мой клиентский микроконтроллер (8051) автоматически синхронизировал его UART с главным микроконтроллером (также 8051), чтобы обеспечить связь. Узким местом является то, что уартс может содержать только один байт. Микроконтроллеры на самом деле AT89S52, поэтому каждая инструкция выполняется за 1/2-1 микросекунды, так как я использую кристаллы 22.1184 МГц с конденсаторами NPO 33 пФ.

Это код, который у меня пока есть. P3.0 - это вывод приема на микроконтроллере (куда входят биты данных).

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

Значение для SPEED - это вычисленное число на 8051, которое определяет скорость передачи. Я использую значение 0FDh, потому что скорость UART составляет 38,4 Кбит / с. Калькулятор скорости передачи keil - это то, что я использую для лучшего определения значения SPEED.

redosync:
    jb P3.0,$ ;scan line twice to see if line is low (is this enough times?)
    jb P3.0,$
    ;Wait for the time of 8 bytes 
    mov TH1,#((256 - SPEED) * 8) 
    w:
      mov ACC,#06h
      djnz ACC,$
    djnz TL1,w 
  ;check end byte twice to see if its a 1
  ;if in any check its not a 1, then start the sync all over again
  jnb P3.0,redosync
  jnb P3.0,redosync
  ;Here the UART is in sync so set it up
  mov TL1,#SPEED
  mov PCON,#80h
  mov SCON,#50h
  setb TR1

Я на правильном пути с моей идеей синхронизации? Если так, то я сканирую биты достаточно раз? И все ли улучшилось бы, если бы я изменил данные?

В настоящее время формат данных выглядит следующим образом:

ffh, ffh для начальных байтов 15 байтов необработанных данных, а затем 1 байт, представляющий контрольную сумму из 15 байтов

...