Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7 + USB
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
piz2383
Прочитал на днях книгу Агурова, вроде бы разобрался со всем что там написано. Я понимаю, что её нужно сжечь, но у меня к сожалению мало ещё опыта в изучении спецификаций. Спецификацию по USB я скачал, очень тяжело для меня ещё. Надеюсь что для начала и книга подойдет.
Но суть вопроса не в этом. Хочу посмотреть на какие-то готовые и главное рабочие примеры работы с USB для AT91SAM7.
Желательно что бы проект реализовывал фреймворк с функция write и read. Для начала меня этого будет достаточно что бы дойти до понимания.
Так пожалуйста поделитесь ссылками на примеры проектиков, которые точно работают, чо бы я в них смог разобраться для моего старта в мире USB =)
aaarrr
Можно взять атмеловские примеры, правда их придется относительно долго дорабатывать напильником и вычищать глюки.

А лучше попробуйте самостоятельно написать свой фреймворк, начиная с Chapter 9 - это всего несколько сотен строк, зато будете в дальнейшем чувствовать себя уверенно.
piz2383
А с BasicUSB кто-то работал? Рабочий проект?
piz2383
Спрашиваю потому что пока запустить не получается. Так хочу узнать толи у меня не получается. Толи проект такой.

И ещё вопросик. С помощью HID-устройства можно организовать двунаправленный обмен? Или это только для передачи от устройства к хосту?
rezident
Цитата(piz2383 @ Jul 24 2009, 21:43) *
С помощью HID-устройства можно организовать двунаправленный обмен?
Можно. В спецификациях USB все описано. HID Related Specifications
piz2383
Цитата(aaarrr @ Jul 24 2009, 13:36) *
А лучше попробуйте самостоятельно написать свой фреймворк, начиная с Chapter 9 - это всего несколько сотен строк, зато будете в дальнейшем чувствовать себя уверенно.

А про какой "Chapter 9" вы имели ввиду?
aaarrr
Это глава 9 спецификации USB.
На самом деле, начать очень просто - подключаете свое устройство к компьютеру, получаете от него GET_DESCRIPTOR(DEVICE) и пытаетесь ответить. И так по всему процессу энумерации, листая параллельно спецификацию и даташит. Дескрипторы для начала можно взять из какого-нибудь примера.
Зато потом сможете сказать, что умеете работать с USB. От готовых примеров толку как от использования FT232.
piz2383
Вопрос конкретно топику не касаеться. Но что бы отдельной темы для маленького вопроса не создавать спрошу здесь.
В общем разбираюсь я с USB. Отлаживаю я с помощью SAM-ICE. До этого постоянно юзал j-link.
В общем отладчик в случайный момент времени во время прошивки или во время длительного дебага, может вылететь с сообщением (см вложеный файл). Из-за чего может вылетать данное сообщение? Чья это может быть проблема отладчика или платы? К сожалению попробовать на другом отладчике временно не могу.
Всем заранее спасибо за советы и предложения.
head_sk
Конечно телепатически не предугадаешь, но ИМХО проблема из-за "китайского" программатора.
fresh2
Еще один маленький вопрос по той же теме. Есть две платы: одна- тестовая AT91SAM7S-EK от Amtel с контоллером SAM7S256, а вторая моя, на моей плате стоит тот же микроконтроллер, та же обвязка для USB, тот же кварц, отличия только в распиновке VBUS и DPULLUP. Я брал готовые примеры для тестовой платы для IAR 5.x, на тестовой плате они более или менее работают: компьютер определяет тип усторойства подключенного ну типа HID это или MASSSTORAGE или просто USB-устройсвто,когда я прошиваю свою плату и подключаю, он даже этого не делает пишет что усторойство не определено и в деспетчере задач высвечивается неизвестное USB устройство, альнейшее выполнее программы прекращается. Не подскажите врианты почему такое может быть?
Corvus
Вероятно, в этом
Цитата(fresh2 @ Aug 6 2009, 11:17) *
отличия только в распиновке DPULLUP.
aaarrr
Цитата(fresh2 @ Aug 6 2009, 11:17) *
Не подскажите врианты почему такое может быть?

Судя по тому, что подключение определяется, pull-up все-таки присутствует. Другое дело, что могут быть перепутаны линии D+ и D-, например. Так как телепаты разошлись в отпуск, было бы неплохо указать, какие именно модификации сделаны в схеме, или выложить саму схему целиком.
piz2383
Работаю со стандартным атмеловским драйвером atm6124.sys.
Реализовал CDC-устройство. Вроде все работает, но периодически при подключении устройства "винда" просто перегружается (как буд-то ресет нажали). Вопрос: это мне уже винду необходимо переустановить или же я допускаю какие-то ошибки в работе, если да, то какие?
Заранее спасибо.
aaarrr
Цитата(piz2383 @ Aug 10 2009, 18:36) *
Вопрос: это мне уже винду необходимо переустановить или же я допускаю какие-то ошибки в работе, если да, то какие?

Винда так себя ведет при ошибках в передаваемых ей дескрипторах. atm6124.sys сам по себе достаточно глючен, воспользуйтесь лучше usbser.sys
piz2383
А FTDI какой *.sys драйвер использует?
И FTDI-айную заюзать можно?
aaarrr
Цитата(piz2383 @ Aug 10 2009, 20:21) *
А FTDI какой *.sys драйвер использует?
И FTDI-айную заюзать можно?

Свой собственный. Заюзать можно, а смысл?
piz2383
Да мне главное что бы надежно работало.,.. Попробую usbser.sys
aaarrr
usbser в XP работает надежно. Есть, конечно, и некоторые косяки - сигнализация не вся поддерживается и USB нельзя передергивать, пока порт открыт.
piz2383
Все вроде работает. Но уточню несколько нюансов.
На голой винде при подключении девайса, первого подключения в трее выскакивает надпись "atm6124.Sys ATMEL AT91xxxxx Test Board"
Как-то хочется что бы вскакивало что-то свое, как это сделать не подскажите?

И ещё скажите правильно ли я описал INF-файл для работы с usbser.sys?

Код
[Version]                                                  
Signature="$Windows NT$"                                  
Class=Ports                                                    
ClassGuid={36FC9E60-C465-11CF-8056-444553540000}      
Provider=%ATMEL%                                            
DriverVer=04/16/2008,1.0.0.0                                

[DestinationDirs]                                        
DefaultDestDir=12      

[Manufacturer]
%ATMEL%=AtmelMfg
                                        
[AtmelMfg]
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6124  

[USBtoSer.Install]
CopyFiles=FakeModemCopyFileSection
AddReg=USBtoSer.AddReg

[USBtoSer.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[USBtoSer.Install.Services]
AddService=usbser,0x00000002,USBtoSer.AddService

[USBtoSer.AddService]
DisplayName=%USBSer%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\usbser.sys

[Strings]
ATMEL="My Corp."
USBtoSerialConverter="SUPER-PUPER BOMBA"
USBSer="USB Serial Driver"
aaarrr
Цитата(piz2383 @ Aug 13 2009, 00:01) *
На голой винде при подключении девайса, первого подключения в трее выскакивает надпись "atm6124.Sys ATMEL AT91xxxxx Test Board"
Как-то хочется что бы вскакивало что-то свое, как это сделать не подскажите?

Пропишите индексы строк в device descriptor'е и сами строки.
piz2383
Обьясните плз что такое индексы строк, а то я не понял со стандарта? (вродекак написано: Index of string descriptor describing product)
Что в цнлом нужно прописыват в поле imanufacturer, iproduct и iserialnumber?
aaarrr
Цитата(piz2383 @ Aug 13 2009, 15:56) *
Обьясните плз что такое индексы строк, а то я не понял со стандарта? (вродекак написано: Index of string descriptor describing product)
Что в цнлом нужно прописыват в поле imanufacturer, iproduct и iserialnumber?

В этих полях нужно записать номера соответствующих строк, они будут использованы хостом при запросах GET_DESCRIPTOR - STRING.
Номера строк должны быть ненулевыми, нулевой дескриптор используется для передачи списка LANGID.
Код
DEVICE DESCRIPTOR:
    0x01,                        // Manufacturer string index
    0x02,                        // Product string index
    0x00,                        // Serial number string index (unused)

unsigned char StringDscr0[] =
{
    0x04,
    STRING_DSCR,
    0x09,                        // LANGID 0x0409
    0x04                        // English (United States)
};

unsigned char StringDscr1[] =
{
    0x12,
    STRING_DSCR,
    'A', 0x00,
    'B', 0x00,
    'C', 0x00,
    ' ', 0x00,
    'C', 0x00,
    'o', 0x00,
    'r', 0x00,
    'p', 0x00
};

unsigned char StringDscr2[] =
{
    0x14,
    STRING_DSCR,
    'M', 0x00,
    'y', 0x00,
    ' ', 0x00,
    'd', 0x00,
    'e', 0x00,
    'v', 0x00,
    'i', 0x00,
    'c', 0x00,
    'e', 0x00
};
piz2383
Меня как раз смутила надпись "ненулевыми" когда я читал спецификацию. В общем назначить можно любой.
singlskv
Цитата(aaarrr @ Aug 10 2009, 21:45) *
usbser в XP работает надежно. Есть, конечно, и некоторые косяки - сигнализация не вся поддерживается и USB нельзя передергивать, пока порт открыт.
А можно поподробнее про момент передергивания при открытом порте ? В чем проблема конкретно ?

Дело в том что я тестировал на передергивание при передаче, и у меня ни разу не было проблем с этим.
То есть неперерывные запрос/ответ(протокол типа модбас) ну и передергиваю кабель много раз,
связь восстанавливается и ничего не падает.
aaarrr
Цитата(singlskv @ Aug 14 2009, 23:21) *
А можно поподробнее про момент передергивания при открытом порте ? В чем проблема конкретно ?

Если выдернуть кабель, пока открыт порт, то автоматом ничего не восстанавливается (по крайней мере на XP SP2). Если порт
закрыть, то проблем нет. На W2K было еще хуже - устройство отваливалось до следующей перезагрузки.
piz2383
А подскажите как определить что хост отключился от шины? Линию UDP_CNX подключил как в даташите, но она почему-то всегда в единице. Внезависимости от того подключен хост или нет. Включен пул-ап или нет. Не подскажите что с этой линией может быть не так?
И можно как-то с помощью самого контроллера UDP определить подключен хост или нет?
aaarrr
Цитата(piz2383 @ Aug 15 2009, 18:29) *
А подскажите как определить что хост отключился от шины?

Что значит отключился, шнурок физически оторвали?

Цитата(piz2383 @ Aug 15 2009, 18:29) *
Линию UDP_CNX подключил как в даташите, но она почему-то всегда в единице. Внезависимости от того подключен хост или нет. Включен пул-ап или нет. Не подскажите что с этой линией может быть не так?

Если речь идет о линии, попключенной к VBUS через делитель, то с ней ничего не может быть не так. Разве только pull-up внутренний
может перетянуть ее в единицу, если его не отключить. Других вариантов я не вижу.

Цитата(piz2383 @ Aug 15 2009, 18:29) *
И можно как-то с помощью самого контроллера UDP определить подключен хост или нет?

Можно следить за RXSUSP или вручную мониторить UDP_ FRM_NUM.
piz2383
Цитата(aaarrr @ Aug 15 2009, 23:26) *
Что значит отключился, шнурок физически оторвали?
Точнее сказать отсоединили. В общем когда кабелем соединяется ПК с устройством, то началом соединения можно считать приход пакета SET CONFIGURATION. А вот когда пользователь просто взял и отсоединил кабель. Вот про это я спрашивал smile.gif))
Цитата(aaarrr @ Aug 15 2009, 23:26) *
Если речь идет о линии, попключенной к VBUS через делитель, то с ней ничего не может быть не так. Разве только pull-up внутренний
может перетянуть ее в единицу, если его не отключить. Других вариантов я не вижу.
aaarrr, я ваш вечный фанат. Да, именно отключив пул-апя добился того что при не подключенном кабеле у меня 0 на этой линии, а при подключенном единица smile.gif Спасибо.
Цитата(aaarrr @ Aug 15 2009, 23:26) *
Можно следить за RXSUSP или вручную мониторить UDP_ FRM_NUM.
Да будущее запомню, но раз уж с той линией разобрались, то не понадобиться сейчас.
singlskv
Цитата(aaarrr @ Aug 15 2009, 00:36) *
Если выдернуть кабель, пока открыт порт, то автоматом ничего не восстанавливается (по крайней мере на XP SP2). Если порт
закрыть, то проблем нет. На W2K было еще хуже - устройство отваливалось до следующей перезагрузки.
Я думал что Вы имеете в виду что ломается что-то более серьезное, а так да,
переоткрытие порта решает вопрос переподсоединения.


Цитата(aaarrr @ Aug 16 2009, 00:26) *
Разве только pull-up внутренний
О, эту знатную фичу я тоже ловил, причем вся мерзость ситуации в том что на одном контроллере
пулап дотягивает до 1 а на другом таком же нет.
head_sk
Прошу прощения, если невнимательно шустрил по форуму. Использую драйвер usbser.sys. Как-то нехочется пользователя заставлять искать нужно ком-порт к примеру (COM4), пусть даже и просто выбрать из списка. Не подскажите как программными средствами в винде определить что этот виртуальный ком-порт открыт именно этим устройством?
Flexz
Можно перебрать все компорты, кидая туда тестовый запрос и смотреть откуда придет ответ, так часто делают.
Мне же больше понравился вариант - вообще отказаться от usbser и пр. и использовать libusb.
head_sk
Цитата(Flexz @ Aug 19 2009, 11:44) *
Можно перебрать все компорты, кидая туда тестовый запрос и смотреть откуда придет ответ, так часто делают.
Этим можно нарушить работу остальных устройств
Flexz
А у вас много девайсов на компортах висит? я вот только с блютусом и переходниками usb-rs-XXX в последнее время встречаюсь, да еще старые программаторы.
Но если хотите что б все красиво было, то прямая дорога в WMI, скачайте утилитку WMI Code Creator (она бесплатная) и в неймспейсе root\WMI ищите инфу по последовательным портам. Утилька сама поможет сгенерить код на C#
head_sk
Цитата(Flexz @ Aug 19 2009, 12:54) *
А у вас много девайсов на компортах висит? я вот только с блютусом и переходниками usb-rs-XXX в последнее время встречаюсь, да еще старые программаторы.
У меня нет, а у заказчиков много.
Поразбираюсь с libusb. Кто с ней работал? Какие отзывы? Работа стабильная? "Синие экраны" не наблюдаются? И ещё один важный ньюанс: совместимость с Windows Vista и Windows 7?
aaarrr
Цитата(head_sk @ Aug 19 2009, 12:18) *
Не подскажите как программными средствами в винде определить что этот виртуальный ком-порт открыт именно этим устройством?

Смотрите в реестре список и ищете в нем USBSER:
HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
head_sk
А есть ли какой-то благоразумный выход, что устройство с USB коммерческое выпустить хочется, а VID покупать нет? Подскажите что стоит делать в таком случае?
rezident
Цитата(head_sk @ Aug 20 2009, 21:43) *
Подскажите что стоит делать в таком случае?
Договориться и купить один или несколько PID у того, кто уже имеет собственный VID. Еще совсем недавно в Европе (ЕС) такое вовсю практиковалось. Естественно, что продавать свой продукт придется под маркой владельца VID. Потому, что официально перепродажа их запрещена соглашениями. Некоторые производители МК предоставляют свои VID/PID. Недавно интересовался, например, Microchip на основании заявки предоставляет свой VID и какой-то PID для выпуска установочной (пробной) партии устройств на МК (со встроенным USB) этой фирмы общим количеством не более 10 000 шт. См. по ссылке.
head_sk
А я слышал на этом форуме что многие VID выбирают что-то типа FFFF. Неужели нет номеров которым можно пользоваться всем? Пусть девайсы пересекуться, ничего страшного.
piz2383
Здравствуйте. Не подскажите в чем может быть загвоздка? Писал программу для драйвера от атмела. Функция отправки хосту работала идеально.
Поменял драйвер на usbser.sys. Теперь первая отправка работает хорошо. А вот вторая уже не отправляется. Вот код отправки.

Код
unsigned int USB_Write(unsigned char* buffer, unsigned int size)
{
  /***/ while((AT91C_BASE_UDP->UDP_CSR[2]&AT91C_UDP_TXPKTRDY) == AT91C_UDP_TXPKTRDY);
  
  while (size--)
    AT91C_BASE_UDP->UDP_FDR[2] = *buffer++;
  
  UDP_EP_SetFlag(AT91C_BASE_UDP, 2, AT91C_UDP_TXPKTRDY)
    

  return xSemaphoreTake(TXSemaphore, 5);
}


Во время второй отправки не срабатывает прерывание AT91C_UDP_TXCOMP. А во время третьей отправки код зависает на строчке с пометкой /***/
В чем может быть проблема? Что в коде не так? Почему с атмеловским драйвером работает а с usbser нет?
rezident
Цитата(head_sk @ Aug 21 2009, 00:01) *
А я слышал на этом форуме что многие VID выбирают что-то типа FFFF. Неужели нет номеров которым можно пользоваться всем?
Для отладки вы можете пользоваться любыми вам подходящими VID/PID (естественно которые не совпадают с уже имеющимися в вашей системе), а вот для производства готового устройства - нет. Не думаете же вы, что консорциумы типа USB-IF полные лохи организовывают? smile.gif
Цитата(head_sk @ Aug 21 2009, 00:01) *
Пусть девайсы пересекуться, ничего страшного.
Как раз наоборот, это и есть самое "страшное". Когда ОС, определив устройство неправильно, начнет "подсовывать" ему совершенно другой драйвер.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.