Наскільки критичні частоти UART?


17

Я буду використовувати 8 МГц-кристал, щоб запустити свій мікроконтролер на 16 МІПС (PLL 4x, 2 циклу інструкцій.) Однак 8 МГц не ділиться на будь-які частоти UART AFAIK ... так наскільки критичні ці частоти? Планую використовувати 115 200 бод.

Чи може UART працювати в межах ± 1%? Якщо це не працює, яку частоту я повинен використовувати? (Я хотів би максимально наблизитись до 16 MIPS для максимальної швидкості обробки.) Якщо це має значення, я використовую PIC24FJ64GA004.

Відповіді:


13

Якщо ви знаходитесь в межах 1%, ви повинні бути в порядку.

Припустимо, ваш UART використовує 16-кратний тактовий сигнал, наприклад, ви можете встановити його на 1843 200 Гц до 16-кратного зразка 115 200 біт / с. (пересимплінг, подібний до цього, є досить поширеним) Це дозволяє UART відраховувати 8 надмірних годин від падаючого краю стартового біта, тому він може знаходити центр бітових комірок протягом +/- одного періоду над годинником після що він відлічує 16 періодів понаднормових годин, щоб визначити, коли слід вибирати дані.

Якщо ви припускаєте, що він може потрапити в центр стартового біта, то для того, щоб зберігати вибіркові послідовні дані у правильних бітових комірках через 8 бітів даних, тактова частота повинна залишатися між (8-0,5) / 8 та (8 + 0,5) ) / 8, або +/- 6,25% від запланованої швидкості передачі бітів. Більш високий розгін наближається до ідеальної умови удару по центру стартового біта, але 8x або 16x зазвичай досить близькі, щоб можна було припустити, що 5% невідповідності спрацює.

Однак ви не можете розраховувати, що інша сторона може бути ідеальною за частотою. Якщо ви підключите пристрій, який швидко на 4%, до пристрою, який повільно на 4%, у вас виникне проблема. Я натрапив на принаймні один випадок, коли ПК працював трохи повільно, а пристрій трохи швидше, і два могли лише незначно спілкуватися, хоча той самий пристрій було чудово з іншими ПК, а ПК з іншими пристрої. (О-діапазон їх становить приблизно 112 кбіт / с і 119 кбіт / с). З цієї причини добре намагатися максимально наблизити до номінальної частоти. Я ніколи не бачив нічого в межах 2% від номіналу.

Звичайне, що потрібно зробити, це використовувати головну тактову частоту, яка забезпечує ціле число, кратне передбачуваної частоти перебігу вибірки UART, меншої від швидкості передачі. Наприклад, якщо ви хотіли, щоб процесор працював на частоті близько 8 МГц, ви можете використовувати осцилятор 7,3728 МГц, який можна розділити на 4, щоб отримати 1,8432 МГц, а це рівно в 16 разів 115200.


8 МГц можна розділити на 69, щоб отримати 115 942, що знаходиться в межах ± 1%. Мені цікаво, чи підтримує PIC такий тип поділу для його генератора швидкості передачі. Я так сподіваюся, але я не думаю, що так буде.
Томас О

PIC має генератор швидкості передачі даних. Він би працював добре, але тільки для нижчих бод, як 9600, він би не працював для високих бод, як 115200, це стає занадто неточним.
Томас О

Думаєте, я міг би використовувати кристал 7,3728 МГц? (Я не збираюся використовувати внутрішній осцилятор 7,37 МГц, тому що я б хотів точності.) Це дозволяє мені розділити на 64, щоб отримати частоту UART в 115200. Це найшвидше, що я можу пройти з високою толерантністю.
Томас О

1
якщо ваш UART підтримує його, бажано надати йому розгін (наприклад, 16x), щоб він міг перепробовувати початковий біт і знаходити центр бітової комірки, але отримання 16x для 115K в межах 1% може бути проблемою, якщо тільки ви використовуєте боді-кратний кристал.
JustJeff

4

Згадки 1% @JustJeff не потрібні. Більшість UART допускають половинну помилку на останньому біті. Більшу частину часу кадр складається з 1 стартового біта, 8 бітів даних і 1 стоп-біт, загалом 10 біт. Половина на 10 біт - це 5% (6,25% JustJeff не враховує біт старту та зупинки).


1
не помиляйтеся, не цитуйте мене; повторно "1%", моє твердження було, що цього може бути важко досягти. "6,25%" передбачав, що ви потрапили в центр стартового біта, і це було б максимально допустимою різницею в тактових частотах приймач проти передавача за таких умов.
JustJeff

1

JustJeff забув про стартовий біт, але Стівен додав стоп-біт. Якщо припустити загальний протокол з 8 бітів даних, 1 стартовий біт і жодного біту парності, (кількість стоп-бітів не має значення), то від переднього краю стартового біта до центра останній біт даних. Як правило, ви хочете, щоб одержувач відібрав цей останній біт протягом 1/4 бітного часу. Зауважте, що 1/2 біт - це гарантований поріг відмови. Все, що поблизу, стає ненадійним, оскільки завжди виникає електричний шум і тремтіння.

1/4 ділиться на 8 1/2 = 2,94%.

Як згадував JustJeff, більшість реалізацій UART насправді відбирають вхідні дані за допомогою асинхронного 16-годинного годинника. Це додає ще 1/16 бітової невизначеності в часі, оскільки це помилка, з якою можна виміряти передній край стартового біта. 1/16 бітового часу з 8 1/2 біт - це інший .74%. Це виходить із бюджету помилок, обчисленого раніше. Ви отримуєте 2,2% дозволеної невідповідності тактового сигналу для приймача для вибірки останнього біта протягом 1/4 бітного часу від його центру.

Як говорили інші, використання кристала 7,3728 МГц є звичайною практикою, коли потрібна точна швидкість передачі даних. Зазвичай ви можете домовитись запустити центральний процесор біля його максимальної швидкості, одночасно натискаючи на швидкість передачі даних UART в межах кристалічної помилки.


Я не згоден, що стоп-біти не мають значення. У цьому питанні зв’язок не вдався, оскільки стоп-біт був помилково встановлений на низькому рівні.
stevenvh

Біт зупинки повинен бути там, щоб загальна комунікація працювала, але вона не входить у розрахунок бюджету помилок для більшості UART. Для UART буде потрібно деякий мінімальний час після останнього біта даних до наступного переднього краю наступного початкового біта. Ось для чого потрібен час зупинки. Якщо цей час не виконано, ви отримуєте "помилку обрамлення". Можливо, це вибірково, як біт даних, але я знаю випадки, коли з ними по-різному оброблялися. Старі телетайпи потребували 2 стоп-біта, щоб дати механічному механізму час бути готовим схопити наступного символу.
Олін Латроп

Я три рази посилався на старт, чи не так?
JustJeff

@OlinLathrop: стоповий біт потрібно , щоб гарантувати , що при відправці байта , чий старший біт дорівнює нулю , буде мати спадаючий фронт для наступного стартового біта. Різні пристрої поводяться по-різному в тих випадках, коли рядок даних знижується до того, як це належить, але якби не було стоп-біту, передана послідовність нульових байтів не містила б корисної інформації про синхронізацію. Таку вимогу можна було б задовольнити за допомогою інших засобів із фіксованим накладним накладним покриттям менше 25%, але я не знаю, чи хто це робить.
supercat

1

Ще не зазначений момент - це те, що деякі пристрої розраховують передати байт даних для кожного байту отриманих даних. Якщо такий пристрій подаватиме дані постійно, його швидкість передачі даних навіть на 0,1% повільніше, ніж у передавального пристрою, і він не має можливості надсилати трохи стиснуті стоп-біти, його вихід буде опускатися на байт кожні 1000 поспіль байтів, що надходять. Якщо пристрій обмежено 16 байтами буферизації, він скине байт даних після проходження приблизно 16000 і опуститься приблизно один байт на тисячу після цього. Варто зазначити, що так звані «1200 бод» модемів насправді працюють зі швидкістю трохи вище 1200 біт / секунду (я думаю, це приблизно 1202) саме з цієї причини (так що навіть якщо передавач на 0,15% швидший, ніж повинен бути бути,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.