реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Предача данных по RS485 c LPC2214
vesago
сообщение Mar 16 2006, 15:43
Сообщение #1


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Посоветуйте как мне обмениваться данными через 485 интерфейс. По привычке разрешение приема в драйвере посадил на землю - соответсвенно прием всегда идет. В 8-ми битниках при передаче всегда отключал приемник и проблем не было. В LPC такое не прокатило - отключаешь фифо соответственно передача прекращается. Как народ поступает в данном случае? Передача и прием ведутся через кольцевые буферы с которыми и сонованя прога работает. Может как-то извернуться не на уровне железа?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 16 2006, 16:07
Сообщение #2


Гуру
******

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



Цитата(vesago @ Mar 16 2006, 17:43) *
1.По привычке разрешение приема в драйвере посадил на землю - соответсвенно прием всегда идет.

2.В 8-ми битниках при передаче всегда отключал приемник и проблем не было. В LPC такое не прокатило - отключаешь фифо соответственно передача прекращается.

1. Абсолютно бесполезное действие, ибо никаких аппаратных завязок на RTS-CTS-DTR-DSR-CD
в 550 совметимых девайсах не предусмотрено.

2.Не забирать, а по окончании сбросить Tx FIFO.

Сообщение отредактировал zltigo - Mar 16 2006, 16:07


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 17 2006, 03:58
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(vesago @ Mar 16 2006, 20:43) *
Посоветуйте как мне обмениваться данными через 485 интерфейс. По привычке разрешение приема в драйвере посадил на землю - соответсвенно прием всегда идет. В 8-ми битниках при передаче всегда отключал приемник и проблем не было. В LPC такое не прокатило - отключаешь фифо соответственно передача прекращается. Как народ поступает в данном случае? Передача и прием ведутся через кольцевые буферы с которыми и сонованя прога работает. Может как-то извернуться не на уровне железа?


Вариантов много, например:
1. Запретить прерывания приема, перед разрешением выгрести фифо.
2. Иметь в обработчике прерывания флаг разрешения/запрещения приема. В зависимости от - обрабатывать/не обрабатыать принятые байты.
3.Отрезать нафиг землю от RE' и посадить туда пин контроллера (или объединиить с DE). Все равно плату переразводить, поскольку в ней куча других ошибок smile.gif


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Alex03
сообщение Mar 17 2006, 07:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Ну и как вариант - принимать всё, с контролем того что отправляете, ошибок, коллизий и т.д. smile.gif
Особо полезно мастер-девайсу. smile.gif
Кстати приём/передача где/как переключается?
Go to the top of the page
 
+Quote Post
vesago
сообщение Mar 17 2006, 08:16
Сообщение #5


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



2 Andy Mozzhevilov А какие ошибки кроме памяти - будьте так любезны? К сожалению опытная партия уже производится. В плате в принципе можно порезать дороги/проводками соединить. Многие я видел приемник драйвера 485 интерфейса включают постоянно - то есть управляющую ногу садят на землю. Предполагаю, что это действительно делается, как сказал Alex03, для контроля передачи. В общем спасибо за советы - буду перед передачей отключать прерывание на прием, а перед разрешением читать U0LSR и сбрасывать буфер приема. Кстати, немаловажный момент, получается, что отключить передатчик драйвера 485 в обработчике прерывания уарта нельзя, так как он контролирует освобождение буфера, но не сдвигового регистра. То есть приведенный код постоянно должен крутиться в основном цикле. Правильно я понимаю?

void UART0_CheckBuferEmty(void)
{
if(uart0.flags.tx_in_progress == 0)
{
if(U0LSR & (1<<U0LSR_TEMT_BIT))
{
IO0CLR |= (1<<RS485_TX); //Отключим передатчик RS485
U0IER |= (1<<U0IER_RBR_Interrupt_Enable_BIT);
U0FCR |= (1<<U0FCR_Rx_FIFO_Reset_BIT);
}
}
}
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 17 2006, 09:17
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(vesago @ Mar 17 2006, 13:16) *
2 Andy Mozzhevilov А какие ошибки кроме памяти - будьте так любезны?


По своему опыту скажу, что при первом проходе платы обычно вылавливается 3-5 ошибок и/или пожеланий. Для начала производства требуется 2-3 прохода. Так что не расстраивайтесь.


Цитата
Кстати, немаловажный момент, получается, что отключить передатчик драйвера 485 в обработчике прерывания уарта нельзя, так как он контролирует освобождение буфера, но не сдвигового регистра. То есть приведенный код постоянно должен крутиться в основном цикле. Правильно я понимаю?

Код
void UART0_CheckBuferEmty(void)
{
    if(uart0.flags.tx_in_progress == 0)
    {
        if(U0LSR & (1<<U0LSR_TEMT_BIT))
        {
            IO0CLR |= (1<<RS485_TX);        //Отключим передатчик RS485
                           U0IER |= (1<<U0IER_RBR_Interrupt_Enable_BIT);
                           U0FCR |= (1<<U0FCR_Rx_FIFO_Reset_BIT);
        }
    }            
}


предостерегу вас сразу от ошибки, связанной с оперированием регистром FCR:
http://electronix.ru/forum/index.php?showtopic=8032&hl=FCR

А так, я сейчас на вскидку не вспомню, в какой момент устанавливается THRE.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
vesago
сообщение Mar 17 2006, 11:41
Сообщение #7


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Спасибо. Про особенности FCR я знал, но про тонкости работы с ним не догадывался. Получается надо тогда просто писать
U0FCR = (1<<U0FCR_FIFO_Enable_BIT) | (1<<U0FCR_Tx_FIFO_Reset_BIT) | (1<<U0FCR_Rx_FIFO_Reset_BIT);

чтобы не было неоднозначностей.

Еще - не могу понять. Уарт в LPC полудуплексный или дуплексный? Я к тому клоню, что головы фифо на прием и передачу расположены по одному адресу. Не получится ли, что при передаче данных они через драйвер 485 будут возвращаться и портить общий фифо или это я бред несу?
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 17 2006, 11:52
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(vesago @ Mar 17 2006, 16:41) *
Спасибо. Про особенности FCR я знал, но про тонкости работы с ним не догадывался. Получается надо тогда просто писать
U0FCR = (1<<U0FCR_FIFO_Enable_BIT) | (1<<U0FCR_Tx_FIFO_Reset_BIT) | (1<<U0FCR_Rx_FIFO_Reset_BIT);

чтобы не было неоднозначностей.

да, именно так, нельзя использовыать чтение-модификацию-запись для этого регистра

Цитата
Еще - не могу понять. Уарт в LPC полудуплексный или дуплексный? Я к тому клоню, что головы фифо на прием и передачу расположены по одному адресу. Не получится ли, что при передаче данных они через драйвер 485 будут возвращаться и портить общий фифо или это я бред несу?

uart дуплексный, конечно.
вообще он прикидывается по регистрам пи-си-шным 16С550 (типа industry standart).
RBR и THR регистры ReadOnly и WriteOnly соотвесттвенно.

Сообщение отредактировал Andy Mozzhevilov - Mar 17 2006, 11:53


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 18 2006, 21:00
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Я поступаю обычно так: пины разрешения not RD и WR корочу на трансивере rs485 и сажу на один управляющий пин с МК, т.о. естественным путем выполняется блок приема при передаче. Проблем с ошибками приема в такой реализации никогда не испытывал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2006, 02:06
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Mar 19 2006, 00:00) *
Я поступаю обычно так: пины разрешения not RD и WR корочу на трансивере rs485 и сажу на один управляющий пин с МК, т.о. естественным путем выполняется блок приема при передаче. Проблем с ошибками приема в такой реализации никогда не испытывал.


Только еще pull-up резистор на RX надо повесить.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 19 2006, 14:12
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Mar 19 2006, 04:06) *
Только еще pull-up резистор на RX надо повесить.

в общем случае - да.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Mar 20 2006, 04:08
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(aaarrr @ Mar 19 2006, 07:06) *
Цитата(defunct @ Mar 19 2006, 00:00) *

Я поступаю обычно так: пины разрешения not RD и WR корочу на трансивере rs485 и сажу на один управляющий пин с МК, т.о. естественным путем выполняется блок приема при передаче. Проблем с ошибками приема в такой реализации никогда не испытывал.


Только еще pull-up резистор на RX надо повесить.


совершенно не обязательно, делайте правильные протоколы.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2006, 11:49
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andy Mozzhevilov @ Mar 20 2006, 07:08) *
совершенно не обязательно, делайте правильные протоколы.


Нет, я, конечно, понимаю, что правильный протокол должен
нормально воспринимать мусор на входе, но специально его
туда приводить зачем? Для экономии резистора, или чтобы
жизнь легкой не казалась?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 23:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016