|
|
  |
USB Device на AT91SAM7, Насколько сложно и что нужно |
|
|
|
Jun 16 2006, 13:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Как изменить этот пример, чтобы можно было передавать свои данные в микроконтроллер и управлять им ? Хороший вопрос  1.Выбрасываем все лишнее(USART, DBGU). 2.Находим в файле main такой код Код if (pCDC.IsConfigured(&pCDC)) { #ifndef USART_COM // Loop length = pCDC.Read(&pCDC, data, MSG_SIZE); pCDC.Write(&pCDC, data, length); .... Подставляем туда данные которые хотим передавать/принимать. 3.Таким же образом поступаем с РС кодом 4.Наслаждаемся 5.Разбираемся с прерываниями и переписываем код для работы с ними.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 16 2006, 15:19
|
Группа: Новичок
Сообщений: 5
Регистрация: 9-06-06
Пользователь №: 17 939

|
Цитата(beer_warrior @ Jun 16 2006, 17:26)  5.Разбираемся с прерываниями и переписываем код для работы с ними. А вот с этого места пожалуйста подробнее... Переделал я этот примерчик для моргания светодиодами, частота должна меняться пакетом данных с компа. Однако если вставляю этот код-моргалку непосредственно в функцию main() USB-примера, прога зависает прямо в микроконтроллере и связь обрывается. Появилась гипотеза, что прерывания могут помочь, но я никогда с ними не работал. Можете привести пример минимального кода для запуска/остановки с PC моргания светодиодом с использованием прерываний ?
Сообщение отредактировал Lomalkin - Jun 16 2006, 15:26
|
|
|
|
|
Jun 16 2006, 18:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Если честно, time critical задач с использованием USB у меня еще не было, поэтому USB прерывания не трогал. Удовлетворяюсь пока поллингом. Но помигать светодиодами можно и с ним  Код char data; while(1); { if (pCDC.IsConfigured(&pCDC)) { length = pCDC.Read(&pCDC, data,1); if(!length) continue; // если ошибка if(data == 1) { LED_ON(); } else LED_OFF(); data = 0xff; //подтверждаем pCDC.Write(&pCDC, data, 1); }} Это безусловный примитив, лучше разработать нормальную систему команд. Также, первым делом, стоит написать обработчик системного таймера(PIT) и помигиать светодиодами по нему(http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/at91sam7s64_Atmel_interrupt_20051029.zip), командой разрешая или запрещая мигание. И последнее - этот код (ARM и PC) крайне чувствителен к размеру пакета - если не соответствует аргументу length, девайс зависает намертво. Поэтому, если в пакете присутсвуют данные отличные от DWORD, устанавливаейте выравнивание.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jun 16 2006, 22:31
|
Группа: Новичок
Сообщений: 5
Регистрация: 9-06-06
Пользователь №: 17 939

|
Цитата(beer_warrior @ Jun 16 2006, 22:33)  Это безусловный примитив Спасибо. На данный момент мой код выглядит почти один в один как и ваш Пока для моей задачи этого достаточно, но всё же видимо прийдется позже разобраться и с прерываниями.
Сообщение отредактировал Lomalkin - Jun 16 2006, 22:32
|
|
|
|
|
Aug 20 2006, 18:09
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
У меня такая платка: http://olimex.com/dev/sam7-h64.htmlПодключаю usb-шнурком: пишет надено "atm6124.Sys ATMEL AT91xxxxx Test Board" Исправляю #define USART_COM на //#define USART_COM Запускаю ram-debug под IAR Запускаю BasicUSB_6124.exe Если платка не подключена - пишет что не подключена ок Если подключена, но не запущена программа на ней, то выполняет две попытки записи и пишет что не отвечает, ок Однако же когда запускаю программу на платке - пишет что ошибка записи... Что может быть?
--------------------
|
|
|
|
|
Sep 4 2006, 08:31
|
Группа: Новичок
Сообщений: 7
Регистрация: 6-08-06
Пользователь №: 19 356

|
Цитата(Lomalkin @ Jun 17 2006, 01:31)  ... Спасибо. На данный момент мой код выглядит почти один в один как и ваш Пока для моей задачи этого достаточно, но всё же видимо прийдется позже разобраться и с прерываниями. Писал недавно для себя класс для USB обмена через прерывания. Проблема сразу возникла с зависаниями контроллера. Обмен идет пару сек, а потом зависание. Решил просто - непосредственно в обработчике прерывания отключаю в именно AIC прерываение по USB. А main-е, когда необходимо читать с порта что-нить - включаю.
Сообщение отредактировал EugeneB - Sep 4 2006, 08:32
|
|
|
|
|
Sep 5 2006, 05:36
|
Частый гость
 
Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305

|
Цитата(AVR @ Sep 5 2006, 00:00)  Извините за назойливость, но очень хотелось бы понять почему невозможно открыть com-порт, который появляется при подключении sam7s64 с драйвером usbser.sys к USB Причем ни гипер-терминал и никакая другая программа не хочет его открывать... Чем он может быть забит сразу после появления?... Я вот только так и пользуюсь "самом". Открылось всё сразу. Вы уверены в правильности запуска USB_Basic на контроллере ??? Кстати, если подключать дебаггер (Wiggler), то обмена нет, только после заливки во флешь и запуска....Вот только с прерываниями никак не получается. Пробовал и SOFINT, и ENDBUSRES, и RESUME - ну никак...
|
|
|
|
|
Sep 5 2006, 12:56
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(nameless @ Sep 5 2006, 09:36)  Я вот только так и пользуюсь "самом". Открылось всё сразу. Вы уверены в правильности запуска USB_Basic на контроллере ??? Кстати, если подключать дебаггер (Wiggler), то обмена нет, только после заливки во флешь и запуска....Вот только с прерываниями никак не получается. Пробовал и SOFINT, и ENDBUSRES, и RESUME - ну никак... Спасибо, по всей видимости проблема именно в этом, ведь я то wiggler'ом ram-debug использовал... Ведь необходимо, чтобы устройство отвечало при самом его подключении к USB...
--------------------
|
|
|
|
|
Nov 5 2006, 00:28
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Подскажите, пожалуйста, как отлаживать драйвер, если при обращении к некоторым его функциям возникают BSOD? У меня появляется такая ошибка KERNEL_MODE_EXCEPTION_NOT_HANDLED, пишет что Цитата If exception code 0x80000003 occurs, this indicates that a hard-coded breakpoint or assertion was hit, but the system was started with the /NODEBUG switch. This problem should rarely occur. If it occurs repeatedly, make sure a kernel debugger is connected and the system is started with the /DEBUG switch. Если запускаю WinXP с ключем /DEBUG - просто виснет... Можно ли настроить так, чтобы при исключениях или ошибках не вешалось вообще всё? Например, обработчик функции WriteFile или ReadFile работает до тех пор пока не дойдет до BuildBulkTransfer, но как выяснить причину ошибки - непонятно...
--------------------
|
|
|
|
|
Nov 5 2006, 07:21
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(AVR @ Nov 5 2006, 03:28)  Подскажите, пожалуйста, как отлаживать драйвер, если при обращении к некоторым его функциям возникают BSOD? У меня появляется такая ошибка KERNEL_MODE_EXCEPTION_NOT_HANDLED, пишет что Цитата If exception code 0x80000003 occurs, this indicates that a hard-coded breakpoint or assertion was hit, but the system was started with the /NODEBUG switch. This problem should rarely occur. If it occurs repeatedly, make sure a kernel debugger is connected and the system is started with the /DEBUG switch. Если запускаю WinXP с ключем /DEBUG - просто виснет... Можно ли настроить так, чтобы при исключениях или ошибках не вешалось вообще всё? Например, обработчик функции WriteFile или ReadFile работает до тех пор пока не дойдет до BuildBulkTransfer, но как выяснить причину ошибки - непонятно... Как избавиться от синих экранов -- не знаю, но помню когда я отлаживал USB-драйвер для SAM7, словил кучу синих экранов, пока не исправил Код PipeIn.Initialize(m_Lower, 82, 64); PipeOut.Initialize(m_Lower, 1, 64); // заменил на PipeIn.Initialize(m_Lower, 0x82, 64); PipeOut.Initialize(m_Lower, 0x01, 64); Там похоже Wizard и я не поняли друг друга  А потом вроде проблем не было. Я делал драйвер визардом, и копировал потом Bulk-обмен из примера. И все.
--------------------
شامل
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|