Перейти к содержанию
    

Приветствую.

Вот нужно стало сделать на уарте сабжа работу протокола с 9м битом. Посмотрел в даташите, есть такой режим RS485 mode, можно задать 9 бит, НО

есть одна большая бяка - 

It is writable only when UART is not busy (UART_USR[0] is 0). 

Т.е. я могу менять этот бит только тогда, когда уарт закончил работу. Так-то это разумно, но вот такое дело, прерывания по завершению передачи в данной шляпе нет, т.е. я не смогу в прерывании менять этот бит, т.к. при входе в него он всегда будет в busy. Вопрос, как это делать тогда, уж очень не хочется выжидать пока он передаст первый байт с уст. 9 битом, а потом его сбрасывать и запускать остальную передачу в прерываниях...

Конечно, можно сделать изврат с помощью loopback и ловить этот байт на приеме и по прерыванию переключать бит, но во первых это гемор, во вторых прощай фулл дуплекс...

 

И второе 

image.thumb.png.235ec8e1616f90a522af9643cc379bbc.png

Кто подскажет, где этот флаг и в каком регистре нужно сбросить? (стр 899  T113-S3 datasheet)

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, mantech сказал:

Вопрос, как это делать тогда, уж очень не хочется выжидать пока он передаст

Чтобы не ждать передаста, можно просто всегда работать в 9-битном режиме. Только в нужных местах эмулировать 8-битный режим установкой единички в 8-м бите.

Если конечно бит чётности у вас не используется.

PS: Правда это только на передачу. 

PPS: А почему "не хочется"? Это вроде самый разумный вариант (за исключением вариантов задействования какой-то спец.периферии).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю что это все затеяно из-за необходимости состыковаться с чужой аппаратурой? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, jcxz сказал:

просто всегда работать в 9-битном режиме.

Конечно, я про то, что 9м битом-то как-то надо управлять))

3 часа назад, GenaSPB сказал:

из-за необходимости состыковаться с чужой аппаратурой?

Разумеется. Сам я уже давно 9и битные посылки не использую.

4 часа назад, jcxz сказал:

А почему "не хочется"? Это вроде самый разумный вариант

Нее, это гемор. Разумный вариант, это закинуть пакет в буфер и пнуть разок, чтоб потом сл байт цеплялся автоматом после прерывания, не отвлекая программу, ну или закинуть кусок пакета сразу в фифо...

4 часа назад, jcxz сказал:

PS: Правда это только на передачу. 

К счастью тут именно и нужна только передача, прием тоже в 9и битном режиме, но на 9 бит можно "положить"))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, mantech сказал:

Конечно, я про то, что 9м битом-то как-то надо управлять))

А я про то что - никто не мешает не управлять им в конфиге UART, а всегда работать в 9-битном режиме. Если конечно чётность не нужна.

15 минут назад, mantech сказал:

Нее, это гемор. Разумный вариант, это закинуть пакет в буфер и пнуть разок, чтоб потом сл байт цеплялся автоматом после прерывания, не отвлекая программу, ну или закинуть кусок пакета сразу в фифо...

Тогда нужно по Сеньке и шапку выбирать выбирать МК, периферия которого умеет такое.

15 минут назад, mantech сказал:

К счастью тут именно и нужна только передача, прием тоже в 9и битном режиме, но на 9 бит можно "положить"))

Тогда можно воспользоваться моим советом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, jcxz сказал:

никто не мешает не управлять им в конфиге UART

Да вот в том-то и дело, что мешает. Установить 9 бит я могу до запуска передачи пакета, а вот сбросить уже нет, как и писал, бит можно сбрасывать только в снятом флаге busy, что будет возможно только после передачи всего пакета...

It is writable only when UART is not busy (UART_USR[0] is 0). 

8 минут назад, jcxz сказал:

Тогда нужно по Сеньке и шапку выбирать выбирать МК, периферия которого умеет такое.

Эт понятно, но он умеет все это, но в 8и битном режиме, ну а из-за одного дурацкого протокола менять МК, который просто на 110% удовлетворяет всем остальным моим хотелкам - эт тоже не вариант.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, mantech сказал:

Да вот в том-то и дело, что мешает. Установить 9 бит я могу до запуска передачи пакета, а вот сбросить уже нет, как и писал, бит можно сбрасывать только в снятом флаге busy, что будет возможно только после передачи всего пакета...

Вы похоже никак не догоняете. Уже 3-й раз повторяю: Не надо его сбрасывать. Пусть всегда стоит. Зачем его сбрасывать если только передаёте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, jcxz said:

Не надо его сбрасывать. Пусть всегда стоит.

От себя добавлю с другой точки зрения) Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, jcxz сказал:

Вы похоже никак не догоняете. Уже 3-й раз повторяю: Не надо его сбрасывать. Пусть всегда стоит. Зачем его сбрасывать если только передаёте?

Потому что, как я понял, ТС хочет поддержать какой-то доморщенный протокол обмена, где один или несколько первых символов в посылке идут 9-битными, а остальные - 8 битными.
 

1 минуту назад, haker_fox сказал:

От себя добавлю с другой точки зрения) Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях.

Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная (т.е. записать туда что угодно - лог. 1, нельзя просто так)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, Arlleex сказал:

Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная

Это вы уже домысливаете. А ТС так ни разу и не ответил насчёт чётности, хоть вопрос задавался неоднократно.

36 минут назад, haker_fox сказал:

Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние

Это должно быть очевидно любому, кто знает что такое UART. Неужто ТС этого не понимает???  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, jcxz said:

А ТС так ни разу и не ответил насчёт чётности, хоть вопрос задавался неоднократно

Как я понял из чтения доки, фича с 9-м битом в t113-s3 работает вместо четности (т.е. сделать 10 бит всего не получится).
Если не нужен приём, почему бы не сформировать SPI выходом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная

Да нет, не четность, но по правилам протокола, в 1 байте он должен быть установлен, в остальных сброшен.

54 минуты назад, GenaSPB сказал:

Если не нужен приём, почему бы не сформировать SPI выходом?

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

1 час назад, haker_fox сказал:

т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях.

В смысле IDLE? Как 2й стоп бит эт я могу понять еще... И да, он не будет мешать при условии, что приемник не требует в посл байтах его анализ, но вот он требует, как я понял((

image.thumb.png.00d25e71fc3fbefefe2a378e70033e76.png

55 минут назад, GenaSPB сказал:

(т.е. сделать 10 бит всего не получится).

Ну только 2 стоп бита, если это можно назвать 10 бит, хотя по правилам это будет 11бит))

9 часов назад, mantech сказал:

Кто подскажет, где этот флаг и в каком регистре нужно сбросить? (стр 899  T113-S3 datasheet)

А вот по этому делу никто не подскажет? Чет не могу понять где этот флаг "кватрируется"))

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, mantech сказал:

Да нет, не четность, но по правилам протокола, в 1 байте он должен быть установлен, в остальных сброшен.

Тогда вообще непонятно - зачем вам режим 8 бит??? Если у вас там всегда 9....  :wacko2:

Картинка вообще непонятно зачем приложена. Сами пишете что чётности нет, а картинку с чётностью прикладываете...  :wacko2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, jcxz сказал:

Тогда вообще непонятно - зачем вам режим 8 бит??? Если у вас там всегда 9....

Ой, ну может объясняю недоходчиво, есть протокол, работает с 9и битными посылками ВСЕГДА. Я должен передавать пакеты с установленным 9 битом 1 байт и сброшенным остальные, принимаю тоже 9и битные посылки, но не анализирую принятый 9 бит.

Вопрос, как сбросить бит когда уже началась передача пакета, т.к. прерывание есть только по опустошению регистра передачи, а не по фактической передаче байта...

11 минут назад, jcxz сказал:

Сами пишете что чётности нет, а картинку с чётностью прикладываете...  

Ну китайцы они такие, лень рисовать другую картинку в режиме RS485

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, mantech сказал:

Да нет, не четность, но по правилам протокола, в 1 байте он должен быть установлен, в остальных сброшен.

Простого решения этой проблемы не существует.
Большинство аппаратных UART в МК или ПК не дают возможности оперативно "рулить" девятым битом.
Теоретически существует четыре стандартных режима использования девятого бита:
1) 9-й бит - бит четности;
2) 9-й бит - бит нечетности;
3) 9-й бит - всегда 0;
4) 9-й бит - всегда 1;
Переключение между этими режимами подразумевает завершение приема/передачи по UART и его повторную инициализацию в другом режиме.

Когда-то, столкнувшись с подобной проблемой, при стыковке с чужой аппаратурой, пришлось сделать специальный аппаратный повторитель (конвертор) RS485-RS485. При передаче, он выставлял 1 в 9-й бит первого байта каждой посылки. В последующих байтах - 9-й бит выставлялся нулевым. При приеме от устройства 9-й бит всегда устанавливался в 1. Со стороны ПК использоватся режим с 9-м битом, всегда установленным в 1. Либо режим с двумя стоп-битами.

3 часа назад, mantech сказал:

К счастью тут именно и нужна только передача, прием тоже в 9и битном режиме, но на 9 бит можно "положить"))

Не получится "положить". Стандартный UART будет выдавать ошибки в любом из четырех, перечисленных выше, режимов.

Прием, так же, придется обрабатывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...