|
|
  |
USB своими руками для sam7x256, или проблемы с которыми я столкнулся. |
|
|
|
Jan 28 2011, 08:54
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Доброе время суток всем. Имеем sam7x256, интерфейс USB, и небольшой опыт (3 проекта я не считаю опытом) работы с этим кристалом. С AVR и MC51 опыт достаточно большой, но с ARM-ом сталкнулся год назад. RS, CAN, ADC, SPI, TWI, AIC ну, в общем вся переферия кристалла поддалась о особых трудностей с этим не возникло. Но, ниразу мне не приходилось делать что либо для USB. Однако интересовался, читал (и это форум в том числе), смотрел, слушал... Я вообще долго не задаю вопросы пока уже совсем не упрусь в стенку. Понимаю, что те, кто разобрался в вопросе сечас могут закричать, что "там все просто" или "возьми примеры и не парься", но я человек дотошный и пытаюсь разобраться в каждой мелочи. При этом никогда не отказываю в объяснениях... Однако сейчас объяснить надо мне, да и другим думаю тоже будет интересно. Я может буду задавать ламерские вопросы, но прошу отнестись ко мне с лояльной стороны и не судить за это строго. И так. 1. Судя из того, что я вычитал и прочитал. Работа UDP в background-е меня не устраивает и хотелось бы настроить работу через AIC. Но сталкнулся с такой проблемой: Как задать первоначальные настройки для UDP? Просто задали тактирование и все? А потом пытаемся ловить ENDBUSRES? или же надо запретить передатчик TXDIS перед настройкой? 2. При простой подаче тактирования (ну, частоту я соблел  ), UDP_ISR чистый (т.е. равен 0) как белый лист, какие бы "приседансы" не делались. и посему ENDBUSRES я просто не вижу. Ни включение ни выключение резисторя на D+ не приводят никчему. Хотя посылки от хоста осцилографом я вижу прекрасно. Пересброс питания, reset и включение выключения кабеля эфект нулевой. 3. Несколько раз контроллер UDP таки запускался и я даже залетал по вектору прерывания в обработку прерываний от UDP, но ниодин из битов регистра UDP_ISR не детектируется. Создавалось впечатление, что я залетел туда случайно, но из прерывания он не выходит. Т.е. крутится там и все. Я принудительно в конце процедуры вставил очистку всех прерываний от UDP как в AIC так и в UDP_ICR. А прерывание все равно вызывается и непонятно чем  4. Из-за всего этого я не могу идти дальше, посему вопросов связанных с самим протоколом я задать не смогу. Однако хочу задать вопрос по поводу отладки самого контроллера UDP. В keil нет ничего, что с ним связано. Для отладки другой переферии мне было достаточно keil debuger, а тут..? С UDP пришлось устанавливать "светодиодные метки" но, это жутко неудобно. Как и чем проверять работу кода для UDP в keil ? Понимаю, что вопросы может быть даже немного к "стыду моему", но еще раз прошу отнестить снисходительно к ним. PS Я специально не привожу и не хочу, чтобы приводили куски кода, потому как хочу понять сам процесс и принцип.
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 28 2011, 09:41
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(kovigor @ Jan 28 2011, 11:09)  1, 2, 3. Вместе с Кейлом поставляются разные примеры для атмеловских АРМ. Годятся любые - как для ARM7, так и для ARM9. Они-то как раз и работают по прерываниям, а не по опросу. Попробуйте разобраться, ничего сверхсложного там нет. Ответы на 90% своих вопросов вы найдете там. Ну, и спецификацию на USB изучить придется, и книжку Гука почитать тоже будет совсем не лишним ...
4. а что вы хотели там увидеть ? Я в свои проекты вставляю вывод интересующий меня информации через Debug Port (UART). Ну и светодиоды + осциллограф подчас помогают лучше любого отладчика ... 1.2.3. Знаете, может я совсем старомоден в принципах написания програмного обеспечения, но я не понимаю того, что пишут другие на СИ еще и сприменением каких-то там библиотек, каких-то макросов, которые кем-то когда-то были написаны и потм вылавливать в них глюки... Я больше на ASM. Уж простите за столь старомодный подход. Посему и привык весь нижний уровень писать самостоятельно. Не то, чтобы СИ я не понимаю, а просто если взять кусок кода приведенного на СИ и попытаться разобраться то начинается, что нехватает *.h или других *.с файлов, чтобы понять от куда и как ростут ноги. Убивается куча времени а итог - 0. Я могу вам "до битика"/"до милливольта" рассказать и объяснить работу CAN, RS(232/485/422/489) , ARING, и прочие. И до всего доходил сам слушая и читая (как тут выразились - "курю даташиты")... Спецификация USB 2.0 "выкурена полностью"  Но вопрос заключался не в Спецификации USB, а в контроллере UDP и его первичной инициализации... Этого к сожалению нигде не описано. месный PS Отправить дальше читать даташиты я и сам умею  4. Скажем для отладки собственно самого кода для ADC, CAN, TWI и пр в keil debuger есть соответсвующая переферия. И не надо 1000 раз перепрошиваться для отладки. А отладка через Debug Port меня уже пару раз наколола и очень жестко. Для медленных процессов - да, но для быстрых...  "сисилограф" (как говорят у нас на проходной) твой лучший друг и товарищ! И все-таки. Есть ли какие либо стредства для отладки кода для UDP?
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 28 2011, 10:04
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
1, 2, 3. А вы пробовали разобраться с примерами ? Нет там никаких библиотек. Вообще, ничего стороннего там не привлекается. Голый Си - код, работающий исключительно с ресурсами МК и не вызывающий и не использующий никакого постороннего кода. Хедеры ? Да, я их и сам не уважаю, когда их десятки и они ссылаются друг на друга. Но !!! Другого пути нет. Или по полгода или по году писать самому "нижний уровень", или за две-три недели разобрать готовый пример, поставляемый со средой. Лично мне больше по душе именно второе. 4. Хотите, расскажу вам одну штуку ? Я для отладки своих дивайсов сделал себе простой аппаратный USB - сниффер на FPGA и соотв софтик к нему на Делфи. Иногда он просто незаменим. Сделал давно, еще когда начинал разбираться с шиной. Но обычно хватает UART (ничего он не "врет", не выдумывайте), осциллограф и светодиоды. P.S. Еще раз отправляю к первоисточникам - примерам от Кейла. Разбирайтесь. Другого выхода нет. Вы можете писать все что угодно и сколько угодно. Но все равно вы вынуждены будете вернуться к примерам. P.P.S. Чтобы вам не было так тоскливо, вот вам проект "мышки" для ARM9 (для ARM7 тоже подойдет). Сделан на основе примеров от Кейл, существенно переработан и "очеловечен". Пароль запросите личным сообщением ... http://zalil.ru/30417880
Сообщение отредактировал kovigor - Jan 28 2011, 10:05
|
|
|
|
|
Jan 28 2011, 10:10
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(kovigor @ Jan 28 2011, 12:04)  Чтобы вам не было так тоскливо, вот вам проект "мышки" для ARM9 (для ARM7 тоже подойдет). Сделан на основе примеров от Кейл, существенно переработан и "очеловечен". Пароль запросите личным сообщением ... http://zalil.ru/30417880Спасибо. В личку отписать не могу. не дает пользоваться. говорит : Вам запрещено отправлять личные сообщения  Попробуем поковыряться, но думаю, что буду задавать еще больше дурных вопросов
Сообщение отредактировал e0000 - Jan 28 2011, 10:11
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 28 2011, 12:21
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
В принцияпе со стартом самого UDP разобрался. Остался вопрос по поводу режима с которого стартуем. Изначально UDP должно находиться в sleep mode?
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 28 2011, 12:38
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(e0000 @ Jan 28 2011, 15:21)  В принцияпе со стартом самого UDP разобрался. Остался вопрос по поводу режима с которого стартуем. Изначально UDP должно находиться в sleep mode? Почему ? Вы же подключаетесь к шине. Хост обязан начать энумерацию устройства, как только он такое подключение обнаружит. Если хост уснет, то МК перейдет в режим SUSPEND (а не SLLEP !). А вот что будет, если просто включить устройство и к шине его не подключать, я не знаю и раньше этим вопросом не задавался. Т.е., установится ли при этом бит UDP_ISR.RXSUSP ? Не знаю. Проверить сейчас не на чем. Думаю, это не слишком существенно ... P.S. Проверил в реальном устройстве. Да. Этот флажок установится если: 1. Просто включить устройство, но к шине его не подключать. 2. Включить устройство, подключить его к хосту и затем усыпить хост. 3. Включить устройство, подключить его к хосту, дать ему некоторое время поработать и затем вынуть вилку USB - разъема устройства из USB - розетки хоста. Вот так ...
Сообщение отредактировал kovigor - Jan 28 2011, 12:58
|
|
|
|
|
Jan 28 2011, 13:32
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(kovigor @ Jan 28 2011, 14:38)  Почему ? Вы же подключаетесь к шине. Хост обязан начать энумерацию устройства, как только он такое подключение обнаружит. Если хост уснет, то МК перейдет в режим SUSPEND (а не SLLEP !). А вот что будет, если просто включить устройство и к шине его не подключать, я не знаю и раньше этим вопросом не задавался. Т.е., установится ли при этом бит UDP_ISR.RXSUSP ? Не знаю. Проверить сейчас не на чем. Думаю, это не слишком существенно ...
P.S. Проверил в реальном устройстве. Да. Этот флажок установится если: 1. Просто включить устройство, но к шине его не подключать. 2. Включить устройство, подключить его к хосту и затем усыпить хост. 3. Включить устройство, подключить его к хосту, дать ему некоторое время поработать и затем вынуть вилку USB - разъема устройства из USB - розетки хоста.
Вот так ... ok! Я так понял при старте нужно действовать по следующему алгоритму: - Инициализации подлежит только AIC и UDP_IER - Ждем прерывания от шины EDNBUSRES, включаем тактирование и конфигурируем EP0 как управляющую в режиме приема - Ожидаем команды шины и отвечаем ей то, что она хочет (отдаем дискрипторы, проводим энумерацию и пр). - "засыпаем" только по команде шины. Правильно?
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 28 2011, 20:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(e0000 @ Jan 28 2011, 16:32)  Я так понял при старте нужно действовать по следующему алгоритму:
- Инициализации подлежит только AIC и UDP_IER - Ждем прерывания от шины EDNBUSRES, включаем тактирование и конфигурируем EP0 как управляющую в режиме приема Тактирование все же надо включать до подключения, причем аж в двух местах: Код AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_UDP; Атмеловские примеры на самом деле ужасно дурные. Лучше по возможности обойтись без них. Помнится, когда первый раз запускал USB на этом процессоре, решил немного себя испытать и оставил из средств отладки лишь один светодиод, а из документации только даташит. И ничего, за вечер получилось.
|
|
|
|
|
Jan 29 2011, 12:18
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(aaarrr @ Jan 28 2011, 22:40)  Тактирование все же надо включать до подключения, причем аж в двух местах: Код AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_UDP; Это я понял из даташита уже, что тактировать надо не только переферийно, а еще и системно... Но спасибо, что ответили. Приятно, когда отвечают даже если дошел до этого самостоятельно. Цитата(aaarrr @ Jan 28 2011, 22:40)  Атмеловские примеры на самом деле ужасно дурные. Лучше по возможности обойтись без них. С этим я могу согласиться. Тем более, что в СИ я не силен. Всю сознательную жизнь на ассемблере. На AVR так я их даже asm примеры на дух не переносил  Кстати ламерские вопросы: "1UL" это что? Просто я пытаюсь перейти таки на СИ. Хотя много уже "нацарапано" на ASM-е. 1. "1UL" это что? 2. Можно ли использовать для СИ асмовый код, как скажем подпрограмму? Напрмер. У меня есть прерывание по таймеру (захват частоты) и обработчик прерывания уже написан на ASM. Как его вставить в СИ код? Понимаю, что можно полазить и разобраться, но всеже Цитата(aaarrr @ Jan 28 2011, 22:40)  Помнится, когда первый раз запускал USB на этом процессоре, решил немного себя испытать и оставил из средств отладки лишь один светодиод, а из документации только даташит. И ничего, за вечер получилось. Тут у меня похожая проблема за одним исключением. Мне еще надо было спецификацию USB изучить и светодиода нет  , но есть 2 реле и выход PWM  .
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 29 2011, 12:33
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(e0000 @ Jan 29 2011, 15:18)  1. "1UL" это что? 1 - это 1, UL указывает компилятору тип константы - unsigned long. Кстати, в тех же атмеловских хидерах сплошь и рядом встречаются записи типа (1 << 31), что заставляет компилятор выкидывать ворнинги. Цитата(e0000 @ Jan 29 2011, 15:18)  2. Можно ли использовать для СИ асмовый код, как скажем подпрограмму? Напрмер. У меня есть прерывание по таймеру (захват частоты) и обработчик прерывания уже написан на ASM. Как его вставить в СИ код? Понимаю, что можно полазить и разобраться, но всеже  В C-код ничего вставлять не надо, все вместе соберет линкер. Если хотите использовать подпрограммы на ассемблере, то придется еще изучить стандарт AAPCS. Цитата(e0000 @ Jan 29 2011, 15:18)  Тут у меня похожая проблема за одним исключением. Мне еще надо было спецификацию USB изучить и светодиода нет  , но есть 2 реле и выход PWM  . Тогда прикрутите UART для отладки.
|
|
|
|
|
Jan 29 2011, 17:46
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Продолжение глупых вопросов  У меня ситуация следующая: Проиходит reset, потом wakeup, и почему-то, хост опять посылает мне reset  Так и должно быть? Я что-то пропустил? Что должно вызываться первым? reset или wakeup? И должен ли вообще вызываться wakeup, если до этого был reset? Цитата(aaarrr @ Jan 29 2011, 14:33)  В C-код ничего вставлять не надо, все вместе соберет линкер. Если хотите использовать подпрограммы на ассемблере, то придется еще изучить стандарт AAPCS. Спасибо. На досуге разберусь обязательно. Жалко неиспользовать наработки прошлого. Цитата(aaarrr @ Jan 29 2011, 14:33)  Тогда прикрутите UART для отладки. Это и сделал. Правда пришлось смоим зрением паять к ногам LQFP-100 провода. Но получилось  Больше ничего допаивать не хочу - и так глаза поломал пока припаялся. Иногда правда UART отстает от событий, прийдется еще и FIFO сгородить небольшой...
Сообщение отредактировал e0000 - Jan 29 2011, 17:47
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Jan 29 2011, 17:51
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(e0000 @ Jan 29 2011, 20:46)  У меня ситуация следующая: Проиходит reset, потом wakeup, и почему-то, хост опять посылает мне reset  Так и должно быть? Я что-то пропустил? Что должно вызываться первым? reset или wakeup? И должен ли вообще вызываться wakeup, если до этого был reset? Reset может приходить не один, это точно. А вот что с wakeup не помню. Обрабатывайте все спокойно, там разберетесь.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|