ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: RS 485  (Прочитано 12946 раз)

0 Пользователей и 1 Гость просматривают эту тему.

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: RS 485
« Ответ #15 : 20 Августа, 2010, 13:16:23 »

> куда лучше воткнуть управление сигналом

drivers/serial/pxa.c достаточно
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #16 : 26 Августа, 2010, 14:45:04 »

Наконец-то проследил цепочку вызовов - в результате вставил в transmitt_chars () установку и сброс сигнала RTS

mcr |= TIOCM_RTS;
serial_out (up, UART_MCR, mcr);

//передача данных

mcr &= ~TIOCM_RTS;
serial_out (up, UART_MCR, mcr);

В результате тестовые программы приема/передачи работают, но когда пытаюсь сделать так, что сначала программа что-то передает, а затем принимает, то передача идет успешно, а принять ничего не могу. С помощью добавления множества отладочных сообщений удалось выяснить, что в таком случае просто не происходит прерывания на прием. Такое впечатление, что после передачи данных сбрасывается/устанавливается какой-то бит, который не дает возникнуть этому прерыванию, но определить, что это за бит, мне пока не удается.
Возможно, вы сталкивались с подобной проблемой.
Буду признателен за любую помощь.
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #17 : 30 Августа, 2010, 14:49:00 »

Разобрался сам.
Надо было делать так:

serial_pxa_set_mctrl (&up->port, TIOCM_OUT2 | TIOCM_DTR);

передача данных

serial_pxa_set_mctrl (&up->port, TIOCM_OUT2 | TIOCM_DTR | TIOCM_RTS);

Может кому-нибудь пригодится...
Правда, быстродействия для меня предсказуемо не хватает, хотя работает шустрее, чем в wince 6.
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: RS 485
« Ответ #18 : 30 Августа, 2010, 14:51:13 »

> Может кому-нибудь пригодится...

Если сделаете патч, тогда кому-то может и пригодиться.
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #19 : 31 Августа, 2010, 12:55:14 »

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

Но сейчас складывается впечатление, что если я, например, в функции uart_write (файла drivers/serial/serial_core.c) не поставлю что-нибудь типа
printk ("uart_write\n"),
то эта функция вообще не вызывается. Возможно, вы сталкивались с подобным на каком-либо этапе разработки.
Хотелось бы услышать какие-нибудь советы по этому поводу, потому что сам я пока вообще слабо понимаю, как такое возможно.
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: RS 485
« Ответ #20 : 31 Августа, 2010, 13:08:39 »

Цитировать
Сейчас возникла вообще очень странная ситуация - убрал все отладочные сообщения и все перестало работать. Вернул какую-то часть - все опять заработало.

Учитывайте, что после подачи сигнала DE микросхеме нужно какое-то время (макс. 25 нс по документации) для включения передатчика (при отключении ждать нет смысла, не успел, так не успел).

Цитировать
Но сейчас складывается впечатление, что если я, например, в функции uart_write (файла drivers/serial/serial_core.c) не поставлю что-нибудь типа
printk ("uart_write\n"),

Нет, такого не может быть. Вероятно дело в задержках, которые добавляют printk, уберите console с последовательного порта (задержки будут меньше) и посмотрите как будет при коде с printk.
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #21 : 31 Августа, 2010, 13:28:28 »

Спасибо за оперативный ответ. Вероятнее всего, проблема возникала именно из-за того, что не учитывал необходимость задержки для переключения микросхемы. Сейчас попробую добавить задержку...
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #22 : 01 Сентября, 2010, 13:12:59 »

в конечном итоге, дело было даже не в этой задержке. Требовалось установить задержку для "действительной" передачи байтов (может коряво описываю, но других слов подобрать не могу). Опытным путем узнал, что на передачу одного байта уходит порядка 83 мкс (у меня получилось 83.(3), но это весьма приблизительная цифра). Таким образом, поставив после кода передачи байтов задержку в (83 * кол-во байт), и сразу после этого реализовав переключение RTS, удалось добиться того, что успешно считываю ответ от своего устройства.

Если кому-либо понадобится решать схожую проблему, выкладываю во вложении вывод diff для файла pxa.c. В других файлах я вроде ничего не трогал...
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: RS 485
« Ответ #23 : 01 Сентября, 2010, 13:27:31 »

На какой скорости открыт порт?
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #24 : 01 Сентября, 2010, 13:29:17 »

115200
Записан

asv

  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 1405
Re: RS 485
« Ответ #25 : 01 Сентября, 2010, 13:50:56 »

83 мкс -- это приблизительное время на передачу байта на скорости 115200.

При 8-ми битах данный, одном старт и одном стоп бите, без чётности:
115200 бит/с / (8 + 1 + 1) = 11520 байт/с
1/11520 = 86.8 мкс
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #26 : 01 Сентября, 2010, 14:40:19 »

Ну, в общем да....
Тогда по хорошему надо будет конечно при выставлении задержки учитывать параметры порта, но у нас все на 115200 8n1, поэтому пока будет работать так. Потом может перепишу по-нормальному.
Записан

Ivan

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 88
Re: RS 485
« Ответ #27 : 08 Сентября, 2010, 18:16:18 »

В общем, я таки набросал патч... Желающие могут ознакомиться во вложении.
Записан