|
UART с управлением паритета, Опциональная передача символа Mark и Space |
|
|
|
Apr 16 2009, 14:02
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-01-06
Пользователь №: 13 058

|
Доброе время суток! Кто сталкивался в LPC210x с необходимостью управления битами паритета Mark и Space, для эмуляции 9-битного варианта передачи данных? Пробовал делать путем ручного переключения этих битов и вылазит такая картина. В пошаговом режиме байты пересылаются нормально (отслеживаю по осцилу). Как только переходит в сплошной поток - то ли LPC не успевает переключаться, то ли еще что-то, но Mark и Space не изменяются.
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 35)
|
Apr 16 2009, 15:06
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-01-06
Пользователь №: 13 058

|
Но ведь не хочется огород городить. В обычном COM порте работает такая штука. Даже в MSP есть. А тут вот такой "Кузьмич".
|
|
|
|
|
Apr 17 2009, 16:57
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Мне эта тема тоже интересна. Филипс как всегда "прорвался" и сделал офигенный супер - пуппер чип с UART по какому-то там стандарту, в результате чего сделал недоступными функции независимого управления девятым битом. Как результат, этот чип, похоже, нельзя использовать для реализации шины MDB, а как хотелось бы. Очень интересно, если из этого что-нибудь получится. Я делал подобные вещи на более простом UART на микроконтроллерах P16F628 Microchip. Правда, это не имеет отношения к ARM. Кстати, насчёт сделать UART самому - если хотите изобретать велосипед, готовьтесь быть аутсайдером  Этот форум не для Вас.
|
|
|
|
Guest_@Ark_*
|
Apr 17 2009, 17:45
|
Guests

|
Цитата(IgorMarx @ Apr 17 2009, 20:57)  ... Я делал подобные вещи на более простом UART на микроконтроллерах P16F628 Microchip. Правда, это не имеет отношения к ARM. Кстати, насчёт сделать UART самому - если хотите изобретать велосипед, готовьтесь быть аутсайдером  Этот форум не для Вас. По моему, Вы много на себя берете... Для нормального программиста на МК - UART есть всегда. Вне зависимости от того, есть соответствующий аппаратный модуль или нет. Есть кварцевый генератор или используется встроенный, либо некалиброванный внешний. Программная реализация, нередко, занимает меньше места и работает надежнее, чем обслуживание встроенного UART-а. На тех же PIC-х я делал программый UART для всей линейки: PIC10-PIC12-PIC16, с автоподстройкой под текущую частоту генератора и c автоопределением скорости обмена от 4800 до 115200... P.S. Если Вы никогда этого не делали и не знаете как (или делали один раз), то я бы на Вашем месте воздержался от оценок и советов на этом форуме.
|
|
|
|
|
Apr 17 2009, 19:00
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(@Ark @ Apr 17 2009, 21:45)  P.S. Если Вы никогда этого не делали и не знаете как (или делали один раз), то я бы на Вашем месте воздержался от оценок и советов на этом форуме. Я это делал на том же PIC16F628. Мне нужно было 2 порта. Второй порт я сэмулировал, используя второй таймер и внешнее перывание. По старт биту срабатывает внешнее прерывание, затем в обработчике запускается второй таймер, дальше защёлкивание битов идёт уже по таймеру. Второй таймер очень удобен, если хотите, чтобы вообще что-то получилось. Помучался долго и сумел реализовать скорость 115200 при частоте кварца 18.432 MHz, причем задача стояла, чтобы это работало именно в прерываниях. В своё время я писал аппаратные реализации драйверов загрузки с магнитной лентой, причем с необходимостью синхронного вывода графики на некий экран. У меня есть собственные реализации алгоритма шифрования AES-128, который при чтении с COM порта расшифровывает поток "на лету". Тему я хорошо знаю, поэтому не советую заниматься этой ботвой, если только вообще нечем заняться. Один раз, хм... А сколько раз нужно на швабру наступать, если не один? aerolog, не мучайтесь с этим UARTом, @Ark прав, используйте CAPTURE регистры. Здесь готовое решение: http://www.nxp.com/acrobat_download/applic...s/AN10689_1.pdf
Сообщение отредактировал IgorMarx - Apr 17 2009, 19:13
|
|
|
|
Guest_@Ark_*
|
Apr 17 2009, 19:16
|
Guests

|
Цитата(IgorMarx @ Apr 17 2009, 23:00)  Я это делал на том же PIC16F628... Тему я хорошо знаю... Я Вам еще раз предлагаю воздержаться от оценок и советов, поскольку тему реализации программного UART-а Вы не знаете (без обид). В экстремальном случае все делается и на 4МГц и даже без использования таймеров... Но это крайний случай... Я просто Вам ответственно могу заявить - для нормального программера не бывает такой ситуации - нет UART-а. UART есть всегда! По определению.
|
|
|
|
|
Apr 17 2009, 19:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(aerolog @ Apr 16 2009, 17:02)  В пошаговом режиме байты пересылаются нормально (отслеживаю по осцилу). Как только переходит в сплошной поток - то ли LPC не успевает переключаться, то ли еще что-то, но Mark и Space не изменяются. Дело скорее всего в том, что там имеется FIFO, в которое попадают данные, но не бит управления четностью. Когда вы отлаживаете пошагово, байт успевает передаться и влияние FIFO незаметно. Надо отключить FIFO.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 17 2009, 19:59
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Споры - дело дурное. Каждый в любом случае останется при своём мнении. Очень интересно, получится ли управлять девятым битом. Сейчас мне заняться этим просто некогда, но если что-то выйдет, поделюсь. Соответственно, надеюсь, что тут будет опубликован результат, если у кого что получится. P.S. А может, любезный @Ark найдёт решение? Спец же по портам  Будем ему благодарны aerolog, попробуйте, как говорит Сергей, отключить фифо и перед записью в THR выставлять требуемые значения битов Parity Select регистра LCR со включенным Parity Enable. Возможно перед этим нужно дожидаться, чтобы освободился буфер передатчика (установился бит THRE или TEMT (какой конкретно нужнопроверять).
|
|
|
|
|
Apr 17 2009, 20:36
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(Сергей Борщ @ Apr 17 2009, 23:25)  Надо отключить FIFO. Зачем же Вы плохое советуете? Код UART0 FIFOs are disabled. Must not be used in the application.
|
|
|
|
|
Apr 17 2009, 20:46
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(meister @ Apr 17 2009, 23:36)  Зачем же Вы плохое советуете? Код UART0 FIFOs are disabled. Must not be used in the application. Имеется в виду установить Trigger level 0 (1 character or 0x01). Неоднократо обсуждалось.
|
|
|
|
Guest_@Ark_*
|
Apr 17 2009, 22:48
|
Guests

|
Цитата(IgorMarx @ Apr 17 2009, 23:59)  ... А может, любезный @Ark найдёт решение? Спец же по портам  Будем ему благодарны  Если верить тому, что написано в ДШ на этот камень, его UART совместим по регистрам со стандартом 16550. В PC такой же UART стоит на COM-портах (точнее, стоял). Известная вещь. Берем описание и читаем... Перед выбором режима управления четностью рекомендуется очистить очередь приемника и передатчика - установкой 1-го и 2-го бита соответственно в регистре управления буферизацией... Кстати, управлять напрямую значением девятого бита нельзя, можно лишь выбрать один из режимов - контроль четности, контроль нечетности, нет контроля. Если в последнем случае задать 2 стоп бита, то девятый бит всегда будет 1... Итого: если хотите самостоятельно управлять девятым битом, придется FIFO отключить совсем. Перед передачей каждого байта выбирать режим четность/нечетность таким образом, чтобы девятый бит принимал нужное значение... Короче - геморрой. Проще сделать программно...
|
|
|
|
|
Apr 18 2009, 06:05
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(@Ark @ Apr 18 2009, 02:48)  Кстати, управлять напрямую значением девятого бита нельзя, можно лишь выбрать один из режимов - контроль четности, контроль нечетности, нет контроля Стоп... а как же вот это?:  Разве это не задание значения бита напрямую? Зачем 2 стоп-бита?
|
|
|
|
Guest_@Ark_*
|
Apr 18 2009, 06:53
|
Guests

|
Цитата(IgorMarx @ Apr 18 2009, 10:05)  Стоп... а как же вот это?: ... Разве это не задание значения бита напрямую? Зачем 2 стоп-бита? По моим данным (из описания 16550) значения битов 5-3 задают следующие режимы: XX0 - нет контроля четности 001 - контроль четности 011 - контроль нечетности отстальные значения зарезервированы. По Вашей информации получается: 101 - девятый бит =1 111 - девятый бит =0 Противоречия нет. Есть возможность - задавате 9-й бит напрямую. Только я не уверен, что можно переключать режимы "на ходу". Скорее нет. Ведь для приема используется то же формат, что для передачи, и от него зависит ошибка четности и тест стоп-бита в конце. P.S. Режим "2 стоп-бита без контроля четности" аналогичен 9-битному режиму с одним стоп-битом и с постоянным значением девятого бита 1.
|
|
|
|
|
Apr 18 2009, 08:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(@Ark @ Apr 18 2009, 09:53)  По моим данным (из описания 16550) Выбросте это 'описание' и возьмите даташит. Эти режимы поддерживают не только 550 и клоны но и прадедушка 8250 с самого рождения. Цитата(@Ark @ Apr 18 2009, 01:48)  Проще сделать программно... Дергать ножками самое глупое решение из всех возможных вне зависимости от решаемой задачи. Нельзя пользоваться FIFO так на зло National Semiconductor не будем пользоваться и аппаратным сдвиговым регистром .... Цитата(@Ark @ Apr 18 2009, 09:53)  P.S. Режим "2 стоп-бита без контроля четности" аналогичен 9-битному режиму с одним стоп-битом и с постоянным значением девятого бита 1. Не аналогичен, ибо еще есть прием.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 18 2009, 09:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(meister @ Apr 17 2009, 23:36)  Зачем же Вы плохое советуете? Код UART0 FIFOs are disabled. Must not be used in the application. Честно говоря я совершенно не понял, откуда взялся процитированный вами кусок текста. Я же вроде бы достаточно подробно расписал - бит управления четностью не буферизуется в FIFO, поэтому FIFO надо выключить. Цитата(Andy Mozzhevilov @ Apr 18 2009, 12:02)  На самом деле при передаче там должно все получиться установкой для Fifo передачи trigger level 1. А разве этот параметр не для приема? На передачу можно или включить все FIFO, или выключить.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 18 2009, 09:57
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(@Ark @ Apr 18 2009, 10:53)  По Вашей информации получается:
101 - девятый бит =1 111 - девятый бит =0 Это не по моей информации. Это по данным документации на конкретный чип, о котором здесь идёт речь, UM10161 rev 3.
|
|
|
|
Guest_@Ark_*
|
Apr 18 2009, 10:02
|
Guests

|
Цитата(zltigo @ Apr 18 2009, 12:57)  Дергать ножками самое глупое решение из всех возможных вне зависимости от решаемой задачи. Нельзя пользоваться FIFO так на зло National Semiconductor не будем пользоваться и аппаратным сдвиговым регистром .... Да пользуйтесь хоть ШИМ-мом. Лишь бы результат был. Технические решения не бывают "глупыми" или "умными". Бывают простыми и сложными, эффективными и не эффективными, дорогими и дешевыми, и т.д. А Ваше личное отношение к ним - это Ваше личное дело... Цитата(zltigo @ Apr 18 2009, 12:57)  Не аналогичен, ибо еще есть прием. Физические сигналы на линии будут аналогичны. Этого достаточно. Можете взять два UART-а в этих двух, формально различных, режимах и соединить между собой. Оба будут нормально работать и на прием и передачу.
|
|
|
|
|
Apr 18 2009, 10:28
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(@Ark @ Apr 18 2009, 13:02)  Физические сигналы на линии будут аналогичны. Этого достаточно. Этого НЕ достаточно, ибо в этом режиме на приеме бит parity не обрабатываетя вообще. Цитата(@Ark @ Apr 18 2009, 13:02)  Бывают простыми и сложными, эффективными и не эффективными, дорогими и дешевыми, и т.д. Использование тех, которые начинаются c "не", а также дорогие и сложные и называюмся одним словом ГЛУПЫЕ (есть еще несколько синонимов, но этт помягче).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 18 2009, 10:29
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Любезный @Ark, возможно Вы и правы. только Ваш UART на 4-х мегагерцах должен тупо ждать стартового бита, а мой, хоть и на 18-и, но работает в фоне наверное в более сложных, по сравнению с Вашей, системах (не одной, заметьте!), переносим в другие проекты и является законченным универсальным решением. Может я, по Вашим словам, и не разбираюсь в этой теме, но читаю документацию и нахожу там то, чего Вы почему-то не видите (или читаете не то).
Если делать как попало, то легко ошибиться, кроме того, переносимость таких решений практически нулевая. Это имеет смысл только в очень больших партиях, где реально такое решение окупит труд программиста. В данном случае, если нет дуплекса, то можно посылать побайтно через имеющийся уарт, предварительно выставляя четность вручную. на приём придётся анализировать бит Parity Error и вычислять, какой же был 9 бит на самом деле.
|
|
|
|
Guest_@Ark_*
|
Apr 18 2009, 10:40
|
Guests

|
Цитата(zltigo @ Apr 18 2009, 14:28)  Этого НЕ достаточно, ибо в этом режиме на приеме бит parity не обрабатываетя вообще. Этого достаточно, так как бит четности всегда установлен 1. И как он формально обрабатывается - как 9-й бит или один из стоп-битов - принципиального значения не имеет. Цитата(zltigo @ Apr 18 2009, 14:28)  Использование тех, которые начинаются c "не", а также дорогие и сложные и называюмся одним словом ГЛУПЫЕ (есть еще несколько синонимов, но этт помягче). Воздержусь от дальнейшего спора на эту тему. У супермодераторов, конечно, есть право считать только свои решения УМНЫМИ.
|
|
|
|
Guest_@Ark_*
|
Apr 18 2009, 11:08
|
Guests

|
Цитата(IgorMarx @ Apr 18 2009, 14:29)  Любезный @Ark, возможно Вы и правы. только Ваш UART на 4-х мегагерцах должен тупо ждать стартового бита, а мой, хоть и на 18-и, но работает в фоне наверное в более сложных, по сравнению с Вашей, системах (не одной, заметьте!), переносим в другие проекты и является законченным универсальным решением... Ну и что? Когда можно и нужно использовать универсальные решения - я их использую, как и Вы. Есть встроенный UART и всем нас устраивает - замечательно! Используем его. А если его нет, что Вы будете делать? Или кварц нежелательно ставить в устройство из-за условий эксплуатации? Откажетесь от проекта? Я, в отличие от Вас, свободен в выборе технических решений, как универсальных, так и узкоспециализированных. В этом вся разница... Цитата(zltigo @ Apr 18 2009, 14:53)  Опять глупость  Видимо, взаимная...
|
|
|
|
|
Apr 18 2009, 11:23
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(@Ark @ Apr 18 2009, 15:08)  А если его нет, что Вы будете делать? Или кварц нежелательно ставить в устройство из-за условий эксплуатации? Откажетесь от проекта? Я, в отличие от Вас, свободен в выборе технических решений, как универсальных, так и узкоспециализированных. Я, конечно, извиняюсь перед всеми за оффтоп (это не тема обсуждения), но кто сказал, что я не свободен в выборе технических решений? Делать глупые вещи (придётся согласиться с супермодератором) - это такая свобода что ли? Да это хрень полная. Ну давайте писать Windows на ассемблере, дрыгать ногами чипов, вместо того, чтобы зайти в интернет, и увидеть, что в продаже уже появился новый чип в 5 раз дешевле и с количеством портов в 3 раза больше. Я считаю себя свободным, потому что вместо того, чтобы заниматься ботвой, смотрю, что вокруг. Я уже предлагал ссылку выше на готовое решение. Не нравится, давайте сначала разберёмся хотя бы с тем, что есть на борту. Почитаем даташит. Если тут не о чем больше говорить, предлагаю тему закрыть. Единственная причина этого не делать - всё же дождаться автора темы, может у него вопросы какие.
|
|
|
|
|
Apr 21 2009, 09:17
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-01-06
Пользователь №: 13 058

|
Большое спасибо за такое бурное обсуждение. Пробовал отключать ФИФО и ставить размер 1 - все равно при RealTime выполнении если я в начале установил Бит Mark - то он потом не сбрасывается, хотя явным видом вызывается сброс тех самых битов управления. Интересная ситуация наблюдается когда разрешается проверка четности, порт пердачи уходит в 1, и зависает??? До сих пор не могу найти адекватного ответа. Вот такие результаты проверки всех предложений. Какие будут еще варианты? А софтовое решение никто не рубает на корню, просто хотелось использовать внутренние свойства. А 9-й бит действительно используется при работе с MDB протоколом, там необходимо с единицей в 9-м бите посылать адрес, а с нулем идут данные.
|
|
|
|
|
Apr 21 2009, 15:36
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
aerolog, к сожалению у меня сейчас осцильник подох, сам проверить не могу.
Нужно делать так:
Передача:
1. Программируем порт на 8 бит и т.д. 2. Цикл: - в LCR выставляем бит 3 (разрешение 9-го бита) и комбинацию битов 4,5 Forcedstick parity, которая должна соответствовать последующему байту. - записываем последующий байт в THR - ждём, когда в регистре LSR бит 6 станет 1 3. переход на пункт 2, если данные не кончились.
Приём: 1. Программируем FIFO trigger level = 1, контроль четности Forced "0" stick parity. 2. Принимаем байт (жём бит 0 в LSR). Если видим ошибку "Parity error", то это означает, что 9-й принятый бит равен 1, иначе 0. 3. переход на 2, если нужны ещё данные.
Забыл добавить: при отладке НЕЛЬЗЯ наблюдать регистры UART в отладчике (т.к. отладчик будет считывать регистры UART сам, чтобы отобразить на экране, и при продолжении выполнения программы результат будет совсем другой). Это означает, что их нужно исключить регистры UART с вкладки Watch и не отображать на вкладку UART0 (или UART1) отладчика. Возможно, что-то не работает именно из-за этого?
Сообщение отредактировал IgorMarx - Apr 21 2009, 15:38
|
|
|
|
|
Apr 22 2009, 09:35
|
Группа: Новичок
Сообщений: 4
Регистрация: 11-01-06
Пользователь №: 13 058

|
Жаль IgorMarx, но такой вариант тоже не прокатыает. Может это проц глюкнутый?
|
|
|
|
|
Apr 22 2009, 16:00
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(aerolog @ Apr 22 2009, 13:35)  Жаль IgorMarx, но такой вариант тоже не прокатыает. Может это проц глюкнутый?  А можете сделать небольшой тестовый проект и показать, как Вы делаете?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|