Последовательная передача UART с PIC16F18326 - Пропущенные байты - PullRequest
2 голосов
/ 14 марта 2019

Я использую PIC16F18326 для передачи некоторых данных через UART (асинхронный, скорость передачи 250 кбод).MCU работает на частоте 32 МГц с фактической частотой команд 8 МГц.

Я использую следующий код сборки для отправки 4 байтов (от 0xAA до 0xAD - не обращайте внимания на бесполезный повторный BANKMASK):

movlw   0xAA
banksel TX1REG
movwf   BANKMASK(TX1REG)
movlw   0xAB
banksel TX1REG
movwf   BANKMASK(TX1REG)
movlw   0xAC
banksel TX1REG
movwf   BANKMASK(TX1REG)
movlw   0xAD
banksel TX1REG
movwf   BANKMASK(TX1REG)
goto $

В результате работы логического анализатора было отправлено только 0xAA и 0xAD (первый и последний байт).

Я знаю, что не могу отправить 4 байта подряд(без каких-либо задержек или каких-либо проверок регистров UART), но я бы ожидал отправить 0xAA и 0xAB (первые 2 байта).

Согласно данным таблицы, если регистры TX1REG и TSR пусты (это мой случай, так как я никогда ничего не передавал), я могу написать в TX1REG, чтобы начать отправку первого байта, а затем, по крайней мере, через 1 тактовый цикл, я могу поставить в очередь второй байт.Согласно приведенному ниже коду, между двумя записями существует 3 такта.

Итак, что же не так?

Ответы [ 2 ]

4 голосов
/ 14 марта 2019

Посмотрите на странице 367 из это о списке функций:

  • Полнодуплексный асинхронный прием и передача
  • Двухсимвольный входной буфер
  • Односимвольный выходной буфер
  • Программируемая 8-битная или 9-битная длина символа
  • Обнаружение адреса в 9-битном режиме
  • Обнаружение ошибки переполнения входного буфера
  • Обнаружение ошибки кадрирования принятого символа
  • (и т.д.).

Проблема, с которой вы столкнулись, действует как переполнение буфера. Если речь идет о правильном USART, то вы получите именно то, чего ожидаете.

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

1 голос
/ 15 марта 2019

Нашел причину. Запись в TX1REG перезаписывает все содержимое регистра. Запись проходит независимо от любого бита состояния (в данном случае TXIF).
Когда UART готов к передаче, он просто извлекает содержимое TX1REG и отправляет его.

В моем примере выше:

Write 0xAA
0xAA is sent immediately
Write 0xAB
0xAB is stored, but not sent because the first send has not finished yet
Write 0xAC
0xAC is stored, but not sent because the first send has not finished yet
Write 0xAD
0xAD is stored, but not sent because the first send has not finished yet

Через некоторое время передача 0xAA заканчивается, и в этот момент UART отправляет 0xAD, потому что это (последний) контент TX1REG.

...