Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Дополнительный UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
dmyl
Устройство на ARM7 от филипса. Кристаллы 2214 и 2138.
Нужно 2xRS232 и 1хRS485, получается нужен третий UART, на кристаллах только пара. Как бы попроще и покрасивее сделать?
Есть вроде конвертеры SPI-UART или подобные. Может решал кто похожую задачу.
rezident
А программный UART не устраивает (вопрос чисто теоретический)?
beer_warrior
Подцепить 8-битку подешевле с SPI и UART, ту же Мегу8.
При желании накрутить на нее дополнительную функциональность - типа динамической индикации или опроса клавиатуры.
Из Меги161 можно вообще получить шикарный периферийный контроллер с двумя UART/
dmyl
Цитата(rezident @ Jun 21 2006, 17:40) *
А программный UART не устраивает (вопрос чисто теоретический)?

Ну честно говоря даже на задумывался. Делал раньше его, но тогда и UARTa на крисиалле не было совсем. Не думал что когда-то придется к этому вернуться. В принципе если есть возможность найти на LPC готовый код программного УАРТа, который с небольшими переделками реально воткнуть, то вообщем это хороший вариант.

Насчет SPI->UART, есть готовые типа MAX3100, но с ними не работал. Смотрю я на них - они вроде бы включены слэйвом - так что получается их опрашивать постоянно надо - не лучше чем программый.
aaarrr
Цитата(dmyl @ Jun 21 2006, 17:09) *
Насчет SPI->UART, есть готовые типа MAX3100, но с ними не работал. Смотрю я на них - они вроде бы включены слэйвом - так что получается их опрашивать постоянно надо - не лучше чем программый.

У MAX3100 на прием есть FIFO и прерывание, так что опрашивать постоянно не придется. С передачей несколько хуже, так как буферизация отсутствует, но если не нужно гнать большой поток - вполне нормальный вариант.
dmyl
Цитата(aaarrr @ Jun 21 2006, 18:15) *
У MAX3100 на прием есть FIFO и прерывание, так что опрашивать постоянно не придется. С передачей несколько хуже, так как буферизация отсутствует, но если не нужно гнать большой поток - вполне нормальный вариант.

Сорри, IRQ не заметил. Кстати буферизация выходная на один байт все равно получается есть? Регистра то два - буфер и шифтер. Значит непрерывная передача возможна.
rezident
Цитата(dmyl @ Jun 21 2006, 19:09) *
Ну честно говоря даже на задумывался. Делал раньше его, но тогда и UARTa на крисиалле не было совсем. Не думал что когда-то придется к этому вернуться. В принципе если есть возможность найти на LPC готовый код программного УАРТа, который с небольшими переделками реально воткнуть, то вообщем это хороший вариант.

Я указал "чисто теоретически" потому, что непосредственно с ARM я не работал. Но на MSP430 делал UART, используя функции Capture и Compare в режиме PWM таймера. Может тут тоже нечто подобное (аппартно-полупрограммное) замутить? ИМХО имеет смысл для RS485, т.к. все равно там полудуплекс.
aaarrr
Цитата(dmyl @ Jun 21 2006, 17:37) *
Кстати буферизация выходная на один байт все равно получается есть? Регистра то два - буфер и шифтер. Значит непрерывная передача возможна.

Как-то мутно этот момент документирован. С одной стороны, вроде как есть буфер, с другой - не вполне понятны условия установки бита T. На железе я этот момент не проверял, т.к. сплошной поток не был нужен.
Romario
ну вот мой софтверный уарт на 9600 при 4 сэмплах на бит. для LPC2138. алгоритм типа оверсемплинга.
что там что уже не помню (давно делал и больше не возвращался), выдрал из проекта если заинтересует или чтото будет непонятно отвечу конкретно.

p.s. там что-то лишнее, что может смутить - не обращай вниманияsmile.gif

p.p.s да, все переменные там 32 битные
dmyl
Цитата(rezident @ Jun 21 2006, 18:50) *
Я указал "чисто теоретически" потому, что непосредственно с ARM я не работал. Но на MSP430 делал UART, используя функции Capture и Compare в режиме PWM таймера. Может тут тоже нечто подобное (аппартно-полупрограммное) замутить? ИМХО имеет смысл для RS485, т.к. все равно там полудуплекс.

Да хватило бы таймера, можно и сделать. А разницы на 485 или 232 большой нет. Тем более что у меня и на 232 похоже будет полудуплекс. Вопрос теперь что проще - запрограммировать SPI или написать программный УАРТ.
dmyl
Цитата(Romario @ Jun 21 2006, 19:08) *
ну вот мой софтверный уарт на 9600 при 4 сэмплах на бит. для LPC2138. алгоритм типа оверсемплинга.
что там что уже не помню (давно делал и больше не возвращался), выдрал из проекта если заинтересует или чтото будет непонятно отвечу конкретно.

p.s. там что-то лишнее, что может смутить - не обращай вниманияsmile.gif

p.p.s да, все переменные там 32 битные

Взял. Посмотрю. А почему 4? Я делал на 3 с мажоритарным выбором. Все равно 8дата+старт+стоп=10, с четностью 11, ну стартовый опрашивается в начале, в данные не попадает, пусть 9..10, умножить на 4=36...40 в 32 не помещаются? Или стоповый тоже надо проверять отдельно. Четность наверное тоже нужна.
Romario
Цитата
Взял. Посмотрю. А почему 4? Я делал на 3 с мажоритарным выбором. Все равно 8дата+старт+стоп=10, с четностью 11, ну стартовый опрашивается в начале, в данные не попадает, пусть 9..10, умножить на 4=36...40 в 32 не помещаются? Или стоповый тоже надо проверять отдельно. Четность наверное тоже нужна.


- почему 4? да так захотелосьsmile.gif можно было 2 но опасно. Мажоритарный сэмплинг и то что у меня там
(а вернее модификация аппликухи от чипкона) немного разные вещи. При мажоритарной выборке не сохраняется предыстория (3 выборки, выбрал, определил бит и забыл) а алгоритм оверсемплинга ее требует.

- твои цифры я не понял. 32 битные потому, что если, например, взять 8 битные то в операция сравнения
компилер будет делать ненужные and 0xff а это всетаки ISR smile.gif вобщем пяток 32 битных переменных наверное не будет жалкоsmile.gif.

p.s. еще оптимизацию включить обязательно и тогда эта isr'ка довольно компактная - я пытался переписать ее на asm но замучался и понял что выиграю совсем тьфу.
GetSmart
Все три уарта для ввода/вывода?
acex2
Если нет боязни пропустить важные данные или предусматривается работа запрос-ответ, то самым дешевым способом будет внешний мультиплексор.
Andy Mozzhevilov
Цитата(dmyl @ Jun 21 2006, 20:08) *
Цитата(rezident @ Jun 21 2006, 18:50) *

Я указал "чисто теоретически" потому, что непосредственно с ARM я не работал. Но на MSP430 делал UART, используя функции Capture и Compare в режиме PWM таймера. Может тут тоже нечто подобное (аппартно-полупрограммное) замутить? ИМХО имеет смысл для RS485, т.к. все равно там полудуплекс.

Да хватило бы таймера, можно и сделать. А разницы на 485 или 232 большой нет. Тем более что у меня и на 232 похоже будет полудуплекс. Вопрос теперь что проще - запрограммировать SPI или написать программный УАРТ.


Вопрос тиражности изделия. Если изделие единичное, можно поставить дополнительную периферию. Хотя еще не факт, что програмно с ней проще будет работать, чем с программным uart.
На LPC 60МГц можно сделать программный uart до скоростей 19200 достаточно просто. Для облегчения задачи завести Rx на пин, который может детектировать прерывание по заднему фронту.
Можно uart сделать в fiq, а прерывания готовности приемника/передатчика сделать через программные прерывания и irq. Тогда критические секции не будут влиять на работу uart и добавлять джиттер.

Цитата(acex2 @ Jun 21 2006, 23:01) *
Если нет боязни пропустить важные данные или предусматривается работа запрос-ответ, то самым дешевым способом будет внешний мультиплексор.


Имхо, самый дешевый способ - програмный uart. Стоимость ~ == строимости 3-4 часов работы программиста, единовременно.
aforestman
Philips недавно анонсировал I2C/SPI => RS-232
Называется SC16IS740/750/760

Нажмите для просмотра прикрепленного файла
VIRt
Работал Я с MAX3140 на сигнале С8051F120. Получилось реализовать через макс но только програмно, так как MAX входит в прерывание и сидит в нем пока все условия сброса не выполнятся. Т.е. прерывание по уровню. Изза этого и получалось что он и не вылазил с внешнего прервания. А СПИ имел приоритет ниже. Выходит что нужно ловить и по заднему и по переднему фронтам. + проводить в момент самого прерывания контроль и устанавливать флаги сброса. С8051F120 мог отлавливать только по заднему. А переразводить плату уже некогда было.
AKimbo
Используем мост SPI<=>UART SC16IS752, проблем никаких со скоростями и процедурой связи нет, есть встроенное FIFO как на прием так и на передачу. Планируем перейти на SC16C754 с параллельным интерфейсом, по причине нехватки UARTов. Интерфейс последнего не особо удобный - шина имеет такие сигналы выбора, которые на интерфейс внешней памяти (с учетом нахождения на шине еще и памяти) без внешней логики красиво не ложатся. Плюс каждый канал из четырех UARTов имеет свое прерывание, что тоже не удобно.
Вам рекомендую посмотреть на SPI<=>UART или I2C<=>UART серии SC16IS7xx, что больше нравится smile.gif
gormih
Цитата(acex2 @ Jun 21 2006, 17:01) *
Если нет боязни пропустить важные данные или предусматривается работа запрос-ответ, то самым дешевым способом будет внешний мультиплексор.


Причем данные можно и не потерять при соответсвующем подходе. Например зацепить переключатель каналов двухнаправленного мультиплексора к свободной ноге контроллера, и коммутировать каналы по прерыванию таймера с достаточной скоростью. При этом сообщая внешней программе текущий канал.

Однако не уверен, что подобное решение будет дешевле с точки зрения производства изделия, нежели программный метод реализации. Аппаратные решения как правило дороже программных, если речь идет о серийном производстве. (И соответственно дешевле, если изделие еденичное или мелкосерийное)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.