Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART в 9-ти битном режиме
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Д_М
Здравствуйте!
Я AVR работаю давно и успешно. Про 9-ти битный режим знал давно, но на AVR ранее никогда не использовал.
В программе в инициализации одни раз делаю следующее:
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;
MPCM_1 = 1;
TXB8_1 = 0;

Процессор является ведомым устройством. При ответе он выдаёт только 8 бит, а не 9, как хотелось бы. К такому заключению я прищёл после того, как установил 2 стоп-бита, и ведущее устройство стало воспринемать запросы от ведомого устройства. Ведущее устройство не анализирует состояние 9-го бита при ответах от ведомого устройства. Лишь бы был. Для него не важно - только бы было всего 11 бит.
Получается, что 9-ти битный режим не включился. Что делаю не так? Объясните, пожалуйста, почему по умолчанию, если не инициализировать UCSZ получается 8-ми битный формат, а не 5-ти?
Спасибо!
alag57
TXB8n is the ninth data bit in the character to be transmitted when operating with serial frames with nine data bits.
Must be written before writing the low bits to UDRn.
Палыч
Цитата(Д_М @ Jan 13 2014, 12:29) *
Объясните, пожалуйста, почему по умолчанию, если не инициализировать UCSZ получается 8-ми битный формат, а не 5-ти?

Потому, что по сбросу в регистр UCSRnC заносится не нулевое значение (UCSZn1=1, UCSZn0=1).
Д_М
Цитата(alag57 @ Jan 13 2014, 12:53) *
TXB8n is the ninth data bit in the character to be transmitted when operating with serial frames with nine data bits.
Must be written before writing the low bits to UDRn.


Если в этот бит ничего не записать, то передаваться он будет всёравно, но с нулевым значением. У меня же не передаётся 9-й бит совсем. Правильно ли я понимаю, что для того чтобы передавалось 9 бит достаточно включить UCSZ2 в единицу? UCSZ1 и UCSZ0 уже установлены после сброса процессора.
Палыч
Цитата(Д_М @ Jan 13 2014, 16:07) *
Правильно ли я понимаю, что для того чтобы передавалось 9 бит достаточно включить UCSZ2 в единицу? UCSZ1 и UCSZ0 уже установлены после сброса процессора.

Для того, чтобы передавались 9 информационных бит достаточно установить в единицу UCSZ2, UCSZ1 и UCSZ0. Всё равно каким способом.
У Вас зачем-то ещё включен режим мультипроцессорной связи (MPCM), однако на работу передатчика он не влияет - только на работу приёмника.
Д_М
Спасибо за поддержку! Нашёл свою ошибку! Теперь процессор формирует 9-ти битные посылки. Даже игнорирует посылки с нулевым 9-м битом в режиме MPCM. Но не отбраковывает 8-ми битные посылки. Добавил обратку бита FE, но эффекта не дало. Что ещё посоветуете?
Alex11
А как Вы хотите, чтобы он отбраковывал 8-битные посылки? В последовательности нет бита с третьим состоянием, который бы говорил - посылка кончилась. Если приемник в 9-битном режиме, то он будет брать 9 бит, и то, что последний бит при 8-битовой посылке в передатчике будет стоповым, приемник никак смутить не может. В лучшем случае после нескольких посылок напоретесь на отсутствие стоп-бита.
Палыч
Цитата(Д_М @ Jan 13 2014, 22:11) *
Но не отбраковывает 8-ми битные посылки. Добавил обратку бита FE, но эффекта не дало. Что ещё посоветуете?

Восьмибитные данные с двумя стоп-битами biggrin.gif
Цитата
If the receiver is set up to receive frames that contain 5 to 8 data bits, then the first stop
bit indicates if the frame contains data or address information. If the receiver is set up for
frames with 9 data bits, then the ninth bit (RXB8) is used for identifying address and
data frames. When the frame type bit (the first stop or the 9th bit) is one, the frame contains
an address. When the frame type bit is zero the frame is a data frame
Д_М
Есть нужда поднять эту тему. Так и не получается у меня 9-ти битный режим. Смотрел работу передатчика по осциллографу. Если передавать 0xFF, то при нулевом TXB8 была бы видна "иголка", подобная старт-биту. Но при передаче 0xFF видна только одна "иголка" - старт бит. Пробовал смотреть по осциллографу передачу со включенным битом чётности. Его видно на осциллографе чётко. Одна "иголка" старт бит, другая "иголка" - бит чётности. Как мне кажется, 9-ти биный режим должне включаться также легко и бесхитростно, как и контроль чётность. Но так он и не включается. Пробовал так
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;
И пробовал включать только UCSZ2_1 = 1;
Не работает и всё!

Кто-то использовал 9-ти битный режим на практике?

Заранее благодарен!
Палыч
Цитата(Д_М @ Jul 28 2014, 12:31) *
Смотрел работу передатчика по осциллографу.

Вероятно, Вы не туда смотрели... Ещё в январе я вам давал цитату из DS, где "английским по белому" написано: девятый бит данных передаётся вместо первого стоп-бита!
Kompot
Цитата(Д_М @ Jul 28 2014, 12:31) *
Так и не получается у меня 9-ти битный режим.
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;

Не работает и всё!

Кто-то использовал 9-ти битный режим на практике?


Да, использовал. И даже работало.
С конфигурационными битами там есть нюанс - они хоть и названы единообразно и последовательно, но находятся в РАЗНЫХ физических управляющий регистрах. Подробностей не помню - давно не брал в руки шашек. Но наш горе-программист чуть не поседел с этим девятым битом, пока я не указал ему на неверную инициализацию. Ключ к успеху - внимательное прочтение даташита.
Д_М
Цитата(Палыч @ Jul 28 2014, 13:25) *
Вероятно, Вы не туда смотрели... Ещё в январе я вам давал цитату из DS, где "английским по белому" написано: девятый бит данных передаётся вместо первого стоп-бита!


Спасибо! Попробовал. Не помогло. И на осциллографе картина не поменялась. Не увидел я ожидаемой "иголки" между данными и стоп-битом.

Цитата(Kompot @ Jul 28 2014, 14:15) *
Да, использовал. И даже работало.
С конфигурационными битами там есть нюанс - они хоть и названы единообразно и последовательно, но находятся в РАЗНЫХ физических управляющий регистрах. Подробностей не помню - давно не брал в руки шашек. Но наш горе-программист чуть не поседел с этим девятым битом, пока я не указал ему на неверную инициализацию. Ключ к успеху - внимательное прочтение даташита.


Тут то всей инициализации одна команда
UCSZ2_1 = 1;
Ещё посоветовали сделать два стоп бита - USBS_1 = 1;, но эффекта нет
Kompot
Цитата(Д_М @ Jul 28 2014, 15:19) *
Тут то всей инициализации одна команда
UCSZ2_1 = 1;


Битового процессора в АВР нет. Такое выражение НЕ сработает.
Вам дали достаточно информации.

Для справки:

/* Set frame format: 9data, 1stop bit */
UCSR1B = (1<<UCSZ12); // for UART1 Atmega644

Кстати UCSZ2_1 быть не может. Ибо UCSZn2, n=0,1.
Опять же, внимательно читайте даташит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.