Jump to content

    
mantech

Как заставить работать UART 16550 в 9и битном режиме

Recommended Posts

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

Вопрос на засыпку)))  Нужно передавать первый байт с установленным 9м битом в 1, остальные в 0 (протокол MDB), но порт 16550 совместимый, как-то можно его заставить работать в таком режиме?  Может с четностью как-то "поиграть" можно? Пока до конца не понял, чем отличается ODD от EVEN режима...

Есть какие-мнения?

Edited by mantech

Share this post


Link to post
Share on other sites

Да, только с четностью играть. ODD и EVEN отличаются полярностью, но они вам не подходят, ибо зависят от содержимого передаваемого байта. Там есть еще два варианта - "принудительно 1" и "принудительно 0" - вот они вам подойдут. И с FIFO придется отключить как минимум на время передачи адресного байта.

Share this post


Link to post
Share on other sites
4 часа назад, Сергей Борщ сказал:

Там есть еще два варианта - "принудительно 1" и "принудительно 0" - вот они вам подойдут.

А можно по-подробнее, где это задается, не увидел...

4 часа назад, Сергей Борщ сказал:

ODD и EVEN отличаются полярностью, но они вам не подходят, ибо зависят от содержимого передаваемого байта

Ну в принципе, можно анализировать 0й бит передаваемого байта (0-четный 1 нечет) но если при четном байте поставить ODD, что будет в бите четности? Анализатора нет посмотреть.

Share this post


Link to post
Share on other sites
11 минут назад, mantech сказал:

Ну в принципе, можно анализировать 0й бит передаваемого байта (0-четный 1 нечет) но если при четном байте поставить ODD, что будет в бите четности? Анализатора нет посмотреть.

Чётным/нечётным должно быть не передаваемое число, а количество единичных бит в нём. UART считает это количество и дополняет его до чётного или нечётного (в зависимости от конфига - even/odd).

Share this post


Link to post
Share on other sites
1 минуту назад, jcxz сказал:

да

Понял, тогда " дополняет его до чётного или нечётного (в зависимости от конфига - even/odd)." в таком случае, при заданном ODD что будет в бите четности 0 или 1 ?

Share this post


Link to post
Share on other sites
25 минут назад, mantech сказал:

А можно по-подробнее, где это задается, не увидел...

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommstate

https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-dcb

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

Понял, тогда " дополняет его до чётного или нечётного (в зависимости от конфига - even/odd)." в таком случае, при заданном ODD что будет в бите четности 0 или 1 ?

Ну там же всё просто! Смотрите на картинку вверху страницы:  https://en.wikipedia.org/wiki/Parity_bit

Share this post


Link to post
Share on other sites
3 минуты назад, jcxz сказал:

Это здрово, конечно в регистрах бы это посмотреть...

The parity scheme to be used. This member can be one of the following values.

TABLE 4
Value Meaning
EVENPARITY
2
Even parity.
MARKPARITY
3
Mark parity.
NOPARITY
0
No parity.
ODDPARITY
1
Odd parity.
SPACEPARITY
4
Space parity.

 

MARKPARITY и SPACEPARITY имеется ввиду?

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

Ну там же всё просто! Смотрите на картинку вверху страницы:

Спасибо, да действительно все нарисовано)))

Share this post


Link to post
Share on other sites
1 минуту назад, mantech сказал:

Это здрово, конечно в регистрах бы это посмотреть...

В даташите на ваш чип должно быть.

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

MARKPARITY и SPACEPARITY имеется ввиду?

да. На https://en.wikipedia.org/wiki/Parity_bit  тоже это описано.

Share this post


Link to post
Share on other sites
1 минуту назад, jcxz сказал:

В даташите на ваш чип должно быть.

Да вот этого и не нашел. УАРТ в аллвиннере, пишут, что 16550 совместимый, может не так уж совместимый...

Share this post


Link to post
Share on other sites
4 минуты назад, mantech сказал:

Да вот этого и не нашел. УАРТ в аллвиннере, пишут, что 16550 совместимый, может не так уж совместимый...

совместимый != идентичный. Что-то может отсутствовать.

 

PS: С таким количеством ресурсов быстродействия как в аллвинере, можно и программно UART эмулировать.

Share this post


Link to post
Share on other sites
10 минут назад, jcxz сказал:

С таким количеством ресурсов быстродействия как в аллвинере, можно и программно UART эмулировать.

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

Share this post


Link to post
Share on other sites
1 час назад, jcxz сказал:

тоже это описано.

В догонку еще)))  Нет-ли какого-то простого и быстрого алгоритма определения четного\нечетного числа, или только по таблице?

Share this post


Link to post
Share on other sites

Может быть полезно посмотреть главу 5 в книге "Алгоритмические трюки для программистов", второе издание, Генри Уоррен, мл. , 2014

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.