mantech 53 19 апреля, 2023 Опубликовано 19 апреля, 2023 (изменено) · Жалоба Приветствую. Вот нужно стало сделать на уарте сабжа работу протокола с 9м битом. Посмотрел в даташите, есть такой режим RS485 mode, можно задать 9 бит, НО есть одна большая бяка - It is writable only when UART is not busy (UART_USR[0] is 0). Т.е. я могу менять этот бит только тогда, когда уарт закончил работу. Так-то это разумно, но вот такое дело, прерывания по завершению передачи в данной шляпе нет, т.е. я не смогу в прерывании менять этот бит, т.к. при входе в него он всегда будет в busy. Вопрос, как это делать тогда, уж очень не хочется выжидать пока он передаст первый байт с уст. 9 битом, а потом его сбрасывать и запускать остальную передачу в прерываниях... Конечно, можно сделать изврат с помощью loopback и ловить этот байт на приеме и по прерыванию переключать бит, но во первых это гемор, во вторых прощай фулл дуплекс... И второе Кто подскажет, где этот флаг и в каком регистре нужно сбросить? (стр 899 T113-S3 datasheet) Изменено 19 апреля, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 1 час назад, mantech сказал: Вопрос, как это делать тогда, уж очень не хочется выжидать пока он передаст Чтобы не ждать передаста, можно просто всегда работать в 9-битном режиме. Только в нужных местах эмулировать 8-битный режим установкой единички в 8-м бите. Если конечно бит чётности у вас не используется. PS: Правда это только на передачу. PPS: А почему "не хочется"? Это вроде самый разумный вариант (за исключением вариантов задействования какой-то спец.периферии). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба Я правильно понимаю что это все затеяно из-за необходимости состыковаться с чужой аппаратурой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 4 часа назад, jcxz сказал: просто всегда работать в 9-битном режиме. Конечно, я про то, что 9м битом-то как-то надо управлять)) 3 часа назад, GenaSPB сказал: из-за необходимости состыковаться с чужой аппаратурой? Разумеется. Сам я уже давно 9и битные посылки не использую. 4 часа назад, jcxz сказал: А почему "не хочется"? Это вроде самый разумный вариант Нее, это гемор. Разумный вариант, это закинуть пакет в буфер и пнуть разок, чтоб потом сл байт цеплялся автоматом после прерывания, не отвлекая программу, ну или закинуть кусок пакета сразу в фифо... 4 часа назад, jcxz сказал: PS: Правда это только на передачу. К счастью тут именно и нужна только передача, прием тоже в 9и битном режиме, но на 9 бит можно "положить")) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 15 минут назад, mantech сказал: Конечно, я про то, что 9м битом-то как-то надо управлять)) А я про то что - никто не мешает не управлять им в конфиге UART, а всегда работать в 9-битном режиме. Если конечно чётность не нужна. 15 минут назад, mantech сказал: Нее, это гемор. Разумный вариант, это закинуть пакет в буфер и пнуть разок, чтоб потом сл байт цеплялся автоматом после прерывания, не отвлекая программу, ну или закинуть кусок пакета сразу в фифо... Тогда нужно по Сеньке и шапку выбирать выбирать МК, периферия которого умеет такое. 15 минут назад, mantech сказал: К счастью тут именно и нужна только передача, прием тоже в 9и битном режиме, но на 9 бит можно "положить")) Тогда можно воспользоваться моим советом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 апреля, 2023 Опубликовано 19 апреля, 2023 (изменено) · Жалоба 7 минут назад, jcxz сказал: никто не мешает не управлять им в конфиге UART Да вот в том-то и дело, что мешает. Установить 9 бит я могу до запуска передачи пакета, а вот сбросить уже нет, как и писал, бит можно сбрасывать только в снятом флаге busy, что будет возможно только после передачи всего пакета... It is writable only when UART is not busy (UART_USR[0] is 0). 8 минут назад, jcxz сказал: Тогда нужно по Сеньке и шапку выбирать выбирать МК, периферия которого умеет такое. Эт понятно, но он умеет все это, но в 8и битном режиме, ну а из-за одного дурацкого протокола менять МК, который просто на 110% удовлетворяет всем остальным моим хотелкам - эт тоже не вариант. Изменено 19 апреля, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 33 минуты назад, mantech сказал: Да вот в том-то и дело, что мешает. Установить 9 бит я могу до запуска передачи пакета, а вот сбросить уже нет, как и писал, бит можно сбрасывать только в снятом флаге busy, что будет возможно только после передачи всего пакета... Вы похоже никак не догоняете. Уже 3-й раз повторяю: Не надо его сбрасывать. Пусть всегда стоит. Зачем его сбрасывать если только передаёте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 15 minutes ago, jcxz said: Не надо его сбрасывать. Пусть всегда стоит. От себя добавлю с другой точки зрения) Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 188 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 18 минут назад, jcxz сказал: Вы похоже никак не догоняете. Уже 3-й раз повторяю: Не надо его сбрасывать. Пусть всегда стоит. Зачем его сбрасывать если только передаёте? Потому что, как я понял, ТС хочет поддержать какой-то доморщенный протокол обмена, где один или несколько первых символов в посылке идут 9-битными, а остальные - 8 битными. 1 минуту назад, haker_fox сказал: От себя добавлю с другой точки зрения) Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях. Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная (т.е. записать туда что угодно - лог. 1, нельзя просто так)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 33 минуты назад, Arlleex сказал: Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная Это вы уже домысливаете. А ТС так ни разу и не ответил насчёт чётности, хоть вопрос задавался неоднократно. 36 минут назад, haker_fox сказал: Выставленный 9-й бит не будет мешать передаче, т.к. воспринимается приёмником как IDLE-состояние Это должно быть очевидно любому, кто знает что такое UART. Неужто ТС этого не понимает??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 23 minutes ago, jcxz said: А ТС так ни разу и не ответил насчёт чётности, хоть вопрос задавался неоднократно Как я понял из чтения доки, фича с 9-м битом в t113-s3 работает вместо четности (т.е. сделать 10 бит всего не получится). Если не нужен приём, почему бы не сформировать SPI выходом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 апреля, 2023 Опубликовано 19 апреля, 2023 (изменено) · Жалоба 1 час назад, Arlleex сказал: Думаю, 9 бит используется как 8 + четность, и четность реальная, а не фиктивная Да нет, не четность, но по правилам протокола, в 1 байте он должен быть установлен, в остальных сброшен. 54 минуты назад, GenaSPB сказал: Если не нужен приём, почему бы не сформировать SPI выходом? Почему не нужен, нужен, причем желательно фулл дуплекс... Просто на приеме не нужно анализировать 9й бит. 1 час назад, haker_fox сказал: т.к. воспринимается приёмником как IDLE-состояние линии при оговоренных выше условиях. В смысле IDLE? Как 2й стоп бит эт я могу понять еще... И да, он не будет мешать при условии, что приемник не требует в посл байтах его анализ, но вот он требует, как я понял(( 55 минут назад, GenaSPB сказал: (т.е. сделать 10 бит всего не получится). Ну только 2 стоп бита, если это можно назвать 10 бит, хотя по правилам это будет 11бит)) 9 часов назад, mantech сказал: Кто подскажет, где этот флаг и в каком регистре нужно сбросить? (стр 899 T113-S3 datasheet) А вот по этому делу никто не подскажет? Чет не могу понять где этот флаг "кватрируется")) Изменено 19 апреля, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 15 минут назад, mantech сказал: Да нет, не четность, но по правилам протокола, в 1 байте он должен быть установлен, в остальных сброшен. Тогда вообще непонятно - зачем вам режим 8 бит??? Если у вас там всегда 9.... Картинка вообще непонятно зачем приложена. Сами пишете что чётности нет, а картинку с чётностью прикладываете... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 7 минут назад, jcxz сказал: Тогда вообще непонятно - зачем вам режим 8 бит??? Если у вас там всегда 9.... Ой, ну может объясняю недоходчиво, есть протокол, работает с 9и битными посылками ВСЕГДА. Я должен передавать пакеты с установленным 9 битом 1 байт и сброшенным остальные, принимаю тоже 9и битные посылки, но не анализирую принятый 9 бит. Вопрос, как сбросить бит когда уже началась передача пакета, т.к. прерывание есть только по опустошению регистра передачи, а не по фактической передаче байта... 11 минут назад, jcxz сказал: Сами пишете что чётности нет, а картинку с чётностью прикладываете... Ну китайцы они такие, лень рисовать другую картинку в режиме RS485 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quark 48 19 апреля, 2023 Опубликовано 19 апреля, 2023 · Жалоба 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 будет выдавать ошибки в любом из четырех, перечисленных выше, режимов. Прием, так же, придется обрабатывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться