Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9XE512-SIMXXX
Не совсем тривиальное дерганье ногой
Wayfarer
Добавлено 16.05.2012 13:19
0
Сообщение: 1
Wayfarer
0

Пункты: 318
Регистрация: 03.03.2010
Пол: Мужчина
Доброго времени суток, форумчане!
Имеется следующая проблема.
Разрабатываю stand-alone приложение под процессор AT91SAM9XE512, IDE - IAR Embedded Workbench версия 6.21.1.2846.
Сделал собственную реализацию стека протоколов TCP/IP, на плате поднят TCP-сервер. (Производительность uIP не устраивала)
В зависимости от запроса с клинетского компьютера необходимо дернуть ногой процессора (сделать отрицательный строб). Задача сама по себе тривиальная, на уровне "Hello, world!".
Но у меня возникла проблема...приблизительно в 10% случаев строб отсутствует, смотрю осциллографом, непосредственно на ноге процессора.
Проблема не в реализации стека протоколов TCP/IP, все пакеты обрабатываются без сбоев.
Пин дергаю следующей парой команд:
Код
AT91C_BASE_PIOA->PIO_CODR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_SODR = OE_PIN_MASK;

Соответственно, скорфигурирован этот пин следующим образом:
Код
AT91C_BASE_PIOA->PIO_PER = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_IDR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_MDDR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_OWDR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_IFDR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_PPUDR = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_OER = OE_PIN_MASK;
AT91C_BASE_PIOA->PIO_SODR = OE_PIN_MASK;


Объявление OE_PIN_MASK:
Код
#define OE_PIN_MASK 0x01000000


Самое интересное, что вычитав значение AT91C_BASE_PIOA->PIO_PDSR я увидел что значение регистра соответствует правде, то есть соответствующим бит сброшен в 0... а на выходе сигнал как был в единице так и остался. И это я наблюдаю в 10% случаев, в остальных 90% - строб формируется замечательно.
AT91C_BASE_PIOA->PIO_CODR = OE_PIN_MASK;
printf("%x\r\n", AT91C_BASE_PIOA->PIO_PDSR);
AT91C_BASE_PIOA->PIO_SODR = OE_PIN_MASK;


В реализации TCP/IP стека я использовал прерывания от RTT и от EMAC, грешу на них, но не понимаю как это возможно.

Если кто с подобным сталкивался, прошу помощи! В такие чудеса не верю=)
Буду очень признателен за дельные советы.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 16.05.2012 13:42 Сообщение: 2
Pavel Ivanchenko
Admin
4.39

Пункты: 91430
Регистрация: 24.03.2009
Пол: Мужчина
Обратите внимание на multidrive ...
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.05.2012 13:43 Сообщение: 3
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Самое интересное, что вычитав значение AT91C_BASE_PIOA->PIO_PDSR я увидел что значение регистра соответствует правде, то есть соответствующим бит сброшен в 0... а на выходе сигнал как был в единице так и остался.

для чистоты картины выведите содержимое всех регистров "причастных" к этому GPIO - может "случайно" происходит перепрограммирование режима пина..
и нет ли другой периферии, которая может использовать этот пин, допустим в режиме multifunction?

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Wayfarer
Добавлено 16.05.2012 14:57 Сообщение: 4
Wayfarer
0

Пункты: 318
Регистрация: 03.03.2010
Пол: Мужчина
Цитата
Обратите внимание на multidrive ...

Цитата
и нет ли другой периферии, которая может использовать этот пин, допустим в режиме multifunction?

Вы имели ввиду muliplexing? Я правильно Вас понял?
На этот пин мультиплексировано периферийное устройство, но данная периферия не используется, точнее используется в другом режиме, где данный пин не задействован.
Подобное поведение я наблюдал на разных портах GPIO: А, В, С, так что маловероятно что это из-за периферийных устройств.
Да, само собой PMC сконфигурирован для работы с PIO.
Цитата
для чистоты картины выведите содержимое всех регистров "причастных" к этому GPIO - может "случайно" происходит перепрограммирование режима пина..

вариант, только маловероятно, конечно, вечером обязательно проверю, сейчас платы под рукой нету к сожалению....
Может быть есть еще какие то идеи?
Очень признателен за помощь!
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.05.2012 15:30 Сообщение: 5
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
если посмотреть на пример из даташита - стр 404
то вас должны интересовать две младшие тетрады - выход с OK и обычный..
на мой вкус у вас вот тут бы:
Код
AT91C_BASE_PIOA->PIO_OWDR = OE_PIN_MASK;

поменять на OWER

насколько я помню - у меня подобных проблем не возникало, пины работали адекватно..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Wayfarer
Добавлено 19.05.2012 14:20 Сообщение: 6
Wayfarer
0

Пункты: 318
Регистрация: 03.03.2010
Пол: Мужчина
Только вчера смог добраться до платы...
Цитата
для чистоты картины выведите содержимое всех регистров "причастных" к этому GPIO - может "случайно" происходит перепрограммирование режима пина..

Вывел, все значения соответствуют правде, перепрограммирования нет.
Цитата
если посмотреть на пример из даташита - стр 404
то вас должны интересовать две младшие тетрады - выход с OK и обычный..
на мой вкус у вас вот тут бы:
Код
AT91C_BASE_PIOA->PIO_OWDR = OE_PIN_MASK;

поменять на OWER

Попробовал, картина осталась неизменной...
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 19.05.2012 21:55 Сообщение: 7
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Попробовал, картина осталась неизменной...

ну тогда я в задумчивости..
вот тут, по линку пример, где нога дрыгается гарантированно, хоть и линукс, но апликуха автономная, 9g45 и хе512 по регистрам д.б. совместимы, только офсеты разные..
кстати, раз у вас стандалоне, то за свои хидеры вы уверены? там все смещения и регистры правильно прописаны?

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Wayfarer
Добавлено 20.05.2012 15:49 Сообщение: 8
Wayfarer
0

Пункты: 318
Регистрация: 03.03.2010
Пол: Мужчина
Ногой я дрыгал из stand-alone и из линуха, все замечательно получается... До тех пор пока не прикрутил TCP/IP.
По поводу заголовочных файлов - атмеловские "классические" хидеры для xe512.
Вот думаю, что где то есть глюк с работой с памятью. Помню было такое что если привести адрес выровненный не по 0x4 к int то получалась очень не стабильная работа приложения, особенно если в компиляторе включал оптимизацию. Но для этого придется расковырять все и вся
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 21.05.2012 12:41 Сообщение: 9
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
До тех пор пока не прикрутил TCP/IP.

тогда надо "копать" в эту сторону.. если порассуждать логически - раньше работало стабильно, после изменения стабильность пропала - значит что-то изменилось в этот промежуток..
железо из поисков можно отбросить - оно исправно, остается программная часть
сделайте отладочную версию - перед стробированием пина сбрасывайте в лог состояние блока PIOA и проконтролируйте что число обращений к п/п строба совпало с числом ее реального вызова
может тут поможет низкоуровневая отладка (я не владею технологией)
(имхо) чудес - не бывает - должно работать

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Wayfarer
Добавлено 21.05.2012 15:42 Сообщение: 10
Wayfarer
0

Пункты: 318
Регистрация: 03.03.2010
Пол: Мужчина
Уже порезал как только мог проект, убрал весь стек протоколов, баг остался на уровне обработчика EMAC прерывания, формирование строба я перенес непосредственно в обработчик.
Железо имеет смысл отложить, но не отбросить, потому что и там бывают глюки;)
Для отладки использую JTAG, блок формирования строба отрабатывает нормально, в смысле команды выполняются последовательно без сбоев.
Как я и говорил в регистры все пишется, контрольная вычитка регистров статуса говорит что все записывается в регистр замечательно....
По поводу чудес с Вами согласен, по крайней мере таких точно не бывает))

Сейчас еще порежу лишние конструкции в проекте... может натолкнусь на проблему...
Если Вы работаете со средой IAR и у Вас есть "немного";) времени могу выложить исходники урезанного проекта, может быть Вы увидите ляп какой?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-AT91SAM9XE512-SIMXXX