|
msp430f5419 и msp430f1611, Полудуплекс |
|
|
|
Mar 31 2011, 14:26
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
1. Если вы пользуетесь прерываниями, то не нужно опрашивать флаги готовности. Если опрашиваете флаг UCTXIFGx или UTXIFGx, то запретите прерывания от передатчика. 2. Маски при инициализации регистров следует накладывать только после того, как вы записали туда вместо дефолтного значения (после POR) явное значение. 3. При переключении с приема на передачу не следует отключать сам модуль USART, достаточно только запретить/разрешить прерывание. Команда Код ME1 |= UTXE0; // Enabled UART0 TXD разрешает функцию пина P3.4 как TXD, но не разрешает функцию P3.5 как RXD. Возможно поэтому возникает конфликт на линии и сигнал "просаживается". Ведь значение P3DIR.bit5 вы явно нигде не задали. И P3OUT.bit5 по-умолчанию в нуле.
|
|
|
|
|
Apr 1 2011, 06:16
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Mar 31 2011, 17:26)  1. Если вы пользуетесь прерываниями, то не нужно опрашивать флаги готовности. Если опрашиваете флаг UCTXIFGx или UTXIFGx, то запретите прерывания от передатчика. 2. Маски при инициализации регистров следует накладывать только после того, как вы записали туда вместо дефолтного значения (после POR) явное значение. 3. При переключении с приема на передачу не следует отключать сам модуль USART, достаточно только запретить/разрешить прерывание. Команда Код ME1 |= UTXE0; // Enabled UART0 TXD разрешает функцию пина P3.4 как TXD, но не разрешает функцию P3.5 как RXD. Возможно поэтому возникает конфликт на линии и сигнал "просаживается". Ведь значение P3DIR.bit5 вы явно нигде не задали. И P3OUT.bit5 по-умолчанию в нуле. 1. Прерывания от передатчика запрещены в обоих процессорах, прерывания только по приему. 2. Не совсем понял. 3. P3.5 выбран как RXD (P3SEL |= BIT4 + BIT5) или ему еще нужно направление задать? Модули все включил, все вавно та же ситуация. Еще по поводу просаживания. Когда нет обмена, на линии высокий уровень, когда идет передача данных, тогда уровень меняется с высокого на низкий, в моей ситуации уровень не доходит до нуля, он только немного опускается, но этого не достаточно для вызова прерывания.
Сообщение отредактировал maxim_P - Apr 1 2011, 06:22
|
|
|
|
|
Apr 1 2011, 07:41
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(maxim_P @ Apr 1 2011, 12:16)  2. Не совсем понял. После подачи питания или сброса регистры периферии (не все!) принимают какое-то дефотное состояние. Я вам рекомендую не надеятся на это и прописывать все регистры используемой периферии явными значениями и только потом уже в коде программы накладывать маски, модифицируя отдельные биты. Цитата(maxim_P @ Apr 1 2011, 12:16)  3. P3.5 выбран как RXD (P3SEL |= BIT4 + BIT5) или ему еще нужно направление задать? Конечно нужно. Посмотрите внимательно схемотехнику (блок-схему) пинов в конце даташита. Цитата(maxim_P @ Apr 1 2011, 12:16)  в моей ситуации уровень не доходит до нуля, он только немного опускается А не может так случиться, что пин уже "битый"? Осциллографом, например, неудачно ткнулись. Кстати, осциллограф у вас заземлен? Проверьте это предположение (неисправности пина), запрограммировав его как входной пин GPIO. Также проверьте соответствующий подключению пин на другом кристалле, запрограммировав его как выходной пин GPIO, при этом сформируйте программно его переключение. Эти простые тесты помогут определиться с тем, где именно проблема - в аппаратуре или в программе?
|
|
|
|
|
Apr 1 2011, 08:35
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Apr 1 2011, 10:41)  После подачи питания или сброса регистры периферии (не все!) принимают какое-то дефотное состояние. Я вам рекомендую не надеятся на это и прописывать все регистры используемой периферии явными значениями и только потом уже в коде программы накладывать маски, модифицируя отдельные биты. Конечно нужно. Посмотрите внимательно схемотехнику (блок-схему) пинов в конце даташита. А не может так случиться, что пин уже "битый"? Осциллографом, например, неудачно ткнулись. Кстати, осциллограф у вас заземлен? Проверьте это предположение (неисправности пина), запрограммировав его как входной пин GPIO. Также проверьте соответствующий подключению пин на другом кристалле, запрограммировав его как выходной пин GPIO, при этом сформируйте программно его переключение. Эти простые тесты помогут определиться с тем, где именно проблема - в аппаратуре или в программе? Все порты РхDIR и РхOUT в начале программы обнуляются. А какое направление RXD еще нужно задать? Пины не битые. При разрыве линии между процессорами сигналы четкие с обоих сторон. А когда линию соединяю, послылаю команду, то сигнал тоже не опускается полностью до нуля, но по амплитуде он достаточно высокий, чтобы прочитать данные. Питание 3,3 вольта. Амплитуда команды примерно 2,7В, амплитуда ответа примерно 0,6В. В сумме они дают 3,3В. Осциллограф заземлен. Прикладываю осциллограмму.
Сообщение отредактировал maxim_P - Apr 1 2011, 08:38
Прикрепленные изображения
|
|
|
|
|
Apr 1 2011, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(maxim_P @ Apr 1 2011, 14:35)  Все порты РхDIR и РхOUT в начале программы обнуляются. Ну я же не профессиональный телепат, чтобы угадывать неопубликованные исходные тексты. Цитата(maxim_P @ Apr 1 2011, 14:35)  А какое направление RXD еще нужно задать? Для RXD вход, для TXD - выход. Пин RXD одного контроллера должен соединяться с TXD второго. Соответственно TXD первого с RXD второго. Цитата(maxim_P @ Apr 1 2011, 14:35)  Питание 3,3 вольта. Амплитуда команды примерно 2,7В, амплитуда ответа примерно 0,6В. В сумме они дают 3,3В. А выводы DVSS обоих контроллеров соединить не забыли случайно? Цитата(maxim_P @ Apr 1 2011, 14:35)  Осциллограф заземлен. Именно заземлен или подключен к трехпроводной сети? Рекомендую убрать заземляющий контакт у осциллографа. Особенно, когда к плате подключен эмулятор, подключенный в свою очередь к PC.
|
|
|
|
|
Apr 1 2011, 17:42
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Apr 1 2011, 18:30)  Для RXD вход, для TXD - выход. Пин RXD одного контроллера должен соединяться с TXD второго. Соответственно TXD первого с RXD второго. Я же настраиваю P3.4, P3.5 на UART, как настроены POUT, PDIR не имеет значения, так по крайней мере написано в конце даташита. Используется полудуплекс - RXD и TXD закорочены на обоих контроллерах. Цитата(rezident @ Apr 1 2011, 18:30)  А выводы DVSS обоих контроллеров соединить не забыли случайно? Именно заземлен или подключен к трехпроводной сети? Рекомендую убрать заземляющий контакт у осциллографа. Особенно, когда к плате подключен эмулятор, подключенный в свою очередь к PC. Земля между контроллерами есть. По поводу заземления точно сказать не могу. Как я уже выше писал, если линию разорвать, то импульсы имеют амплитуду 3,3В (что и требуется) на обоих контроллерах (измерял осциллографом в тех же условиях), то есть проблема не с осциллографом, а скорее с настройками обмена данных.
Сообщение отредактировал maxim_P - Apr 1 2011, 17:44
|
|
|
|
|
Apr 1 2011, 18:49
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Apr 1 2011, 21:40)  Поясните эту фразу. Что значит "закорочены"? Соединены между собой? У вас обмен между МК всего по одному проводу идет что ли?  ага
|
|
|
|
|
Apr 1 2011, 19:35
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Apr 1 2011, 21:58)  Вот же блин!  В таком случае вам нужно после передачи обязательно выключать функцию пина TXD, сбрасывая соответствующие биты в регистрах P3SEL и P3DIR. А устанавливать бит 4 в P3SEL можно только на время передачи. Иначе у вас получается конфликт, когда два выхода TXD одновременно пытаются управлять общей линией передачи. И нафига такие заморочки? Не проще ли было обычный дуплекс реализовать? Вам еще одну "лишнюю" дорожку на плате нарисовать было влом? Мне было бы не влом, а только в радость. Возникла необходимость замены устройства, на аналог, и это устройство "общается" с базовой платой через полудуплекс. Чтобы не менять базовую плату и программное обеспечение придется делать так. Вообще я пробовал такой вариант чуть раньше, как только 1611 передал команду, я переключаю его на прием с помощью P3SEL, 5419 после того как принял последний байт переключается на передачу. Картина та же. Я, конечно, еще раз попробую. Получится только в понедельник. RXD можно не трогать? Кстати, в 5419 есть такой бит USLISTEN, который закорачивает RXD и TXD внутри процессора, его случайно не нужно использовать?
|
|
|
|
|
Apr 1 2011, 19:50
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(maxim_P @ Apr 2 2011, 01:35)  Вообще я пробовал такой вариант чуть раньше, как только 1611 передал команду, я переключаю его на прием с помощью P3SEL, 5419 после того как принял последний байт переключается на передачу. Картина та же. У вас классическая картина конфликта двух логических выходов. Правда это выяснилось только после "допроса"  Вы надеюсь какие-то паузы ввели в протокол для исключения этого конфликта? Т.е. один передатчик должен выключать свой выход (сбрасывать бит в P3SEL) сразу после окончания передачи, а второй подключать выход к линии (устанавливать бит в P3SEL) только после некоторой паузы. Причем начало этой паузы должно определяться либо протоколом (символом окончания пакета), либо паузой в приеме пакета данных. Хоть это и тавтология, но смысл в том, что нужна пауза после паузы приема. Цитата(maxim_P @ Apr 2 2011, 01:35)  RXD можно не трогать? Нет RXD не мешает обмену. Но желательно на линии иметь pull-up резистор, чтобы исключить ложный старт-импульс и начало приема в момент паузы, когда оба передатчика будут отключены от линии. Цитата(maxim_P @ Apr 2 2011, 01:35)  Кстати, в 5419 есть такой бит USLISTEN, который закорачивает RXD и TXD внутри процессора, его случайно не нужно использовать? Нет. Этим битом можно только организовать "эхо". Зачем вам "эхо"?
|
|
|
|
|
Apr 1 2011, 20:23
|

Участник

Группа: Участник
Сообщений: 39
Регистрация: 14-06-07
Из: Минск, Беларусь
Пользователь №: 28 436

|
Цитата(rezident @ Apr 1 2011, 22:50)  У вас классическая картина конфликта двух логических выходов. Правда это выяснилось только после "допроса"  Вы надеюсь какие-то паузы ввели в протокол для исключения этого конфликта? Т.е. один передатчик должен выключать свой выход (сбрасывать бит в P3SEL) сразу после окончания передачи, а второй подключать выход к линии (устанавливать бит в P3SEL) только после некоторой паузы. Причем начало этой паузы должно определяться либо протоколом (символом окончания пакета), либо паузой в приеме пакета данных. Хоть это и тавтология, но смысл в том, что нужна пауза после паузы приема. Нет RXD не мешает обмену. Но желательно на линии иметь pull-up резистор, чтобы исключить ложный старт-импульс и начало приема в момент паузы, когда оба передатчика будут отключены от линии. Нет. Этим битом можно только организовать "эхо". Зачем вам "эхо"? Основной режим 1611 - передача, то есть при инициализации контроллер настраиваю на передачу, как только был отправлен последний байт, сразу же переключаю на прием (Сбрасываю флаг RXIFG, разрешаю прерывания по приему), затем делал паузу, но я ее почему-то закомментировал, восстановлю. Основной режим 5419 - прием, при инициализации настроен на прием. Как только был принят последний байт, далее переключение на передачу, затем формирование ответа, вычисление CRC ответа, передача ответа. Как я понял, необходимо делать задержки после каждого переключения на прием/передачу?
|
|
|
|
|
Apr 1 2011, 21:25
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(maxim_P @ Apr 2 2011, 02:23)  Как я понял, необходимо делать задержки после каждого переключения на прием/передачу? Да, тут такая же ситуация как при использовании трансиверов RS-485 и полудуплексной линии связи чеоез RS-485. После окончания передачи пакета запроса трансивер ведущего переходит в режим приема. Но ведомый не начинает передачу сразу же после приема даже, если он готов ответить через 1мкс. Выдерживается оговоренная протоколом пауза (обычно порядка 1-1,5 длительностей одного символа на используемой скорости обмена, например, для 115200, 8, n, 1 пауза должна быть порядка 1,5*(1+8+1)/115200= 130мкс или больше) и только затем ведомый переключает трансивер RS485 на передачу, но пока еще не передает. Еще одна пауза, когда трансивер ведомого удерживает линию в состоянии передачи, нужная для того, чтобы линия зарядилась и закончились все переходные процессы в ней. И если переходный процесс вызвал ложный старт-бит, то приемник ведущего успел отработать ошибочно принятый байт, отсеяв его. И только по истечении второго 1,5-го интервала длительности символа ведомый начинает передачу пакета с ответом на запрос. Вам вторая пауза в принципе и не нужна, т.к. у вас нет трансивера RS485 и длинной линии связи. Но пауза перед включением выхода UART на передачу весьма желательна. Также как и pull-up резистор на линии.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|