Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT90USB1286, виртуальный COM-порт
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Visor
Попробывал реализовать виртуальный COM-порт на AT90USB1286. За основу взял пример от Атмел (at90usb128-demo-cdc-1_0_3.zip). Подправил частоту (16МГц) и тупо загрузил, не пошло! Виндовс подключение устройства определяет, но тип устройства нет.
Может кто-то работал с этим примером, какие были проблемы (если были)? unsure.gif
GDI
Вы бы сам файл прикрепили, а то тут частенько просят эти примеры, а они, я так понял, даются только после регистрации на сайте атмела, что опять же будет неудобно желающим вам помочь...
prottoss
Цитата(Visor @ Jan 11 2008, 14:44) *
Попробывал реализовать виртуальный COM-порт на AT90USB1286. За основу взял пример от Атмел (at90usb128-demo-cdc-1_0_3.zip). Подправил частоту (16МГц) и тупо загрузил, не пошло! Виндовс подключение устройства определяет, но тип устройства нет.
Может кто-то работал с этим примером, какие были проблемы (если были)? unsure.gif
Обычно частоту камня делают кратной тактовой частоте USB, если ее можно назвать тактовой. Для LowSpeed это 1,5 МГц, для Full - 12 МГц. У ВАс не бъет ни для первой ни для второй - курите даташит.
Visor
Цитата(prottoss @ Jan 11 2008, 17:50) *
Обычно частоту камня делают кратной тактовой частоте USB, если ее можно назвать тактовой. Для LowSpeed это 1,5 МГц, для Full - 12 МГц. У ВАс не бъет ни для первой ни для второй - курите даташит.

Спасибо, не курю, тем более даташиты. smile.gif
А в нём как раз и сказано чистым англицким языком, что USB PLL умножитель имеет кратность х24 и предварительный делитель частоты XTAL до 2МГц с помощью PLL clock Prescaler, дабы получить необходимые 48МГц для тактирования USB интерфейса. И этот PLL clock Prescaler может быть только 4 или 8, т.е. для 8МГц и 16МГц клока соответственно.
prottoss
Цитата(Visor @ Jan 11 2008, 22:28) *
Спасибо, не курю, тем более даташиты. smile.gif
А в нём как раз и сказано чистым англицким языком, что USB PLL умножитель имеет кратность х24 и предварительный делитель частоты XTAL до 2МГц с помощью PLL clock Prescaler, дабы получить необходимые 48МГц для тактирования USB интерфейса. И этот PLL clock Prescaler может быть только 4 или 8, т.е. для 8МГц и 16МГц клока соответственно.
Понятно. Я высказал лишь предположение, потому как с этим камнем не работал, но работал с USB. В таком случае отладчик Вам в помощь (или DBG_OUT :-))). Посмотрите в первую очередь, принимает ли чип пакеты - скорее всего в коде есть оброботчик прерывания для такого дела.
Visor
Цитата(prottoss @ Jan 11 2008, 22:45) *
В таком случае отладчик Вам в помощь (или DBG_OUT :-))).

Внутрисхемный отладчик вещь хорошая, но нет такового. Я пример и взял, в надежде что всё уже отлажено до нас. smile.gif
prottoss
Цитата(Visor @ Jan 11 2008, 22:55) *
Внутрисхемный отладчик вещь хорошая, но нет такового. Я пример и взял, в надежде что всё уже отлажено до нас. smile.gif
Я же сказал - "... (или DBG_OUT :-)))." имея ввиду вывод в СОМ-порт. Если и СОМ-порта нет, то тогда есть еще одно хорошее средство - привинтить к свободной ноге(ногам) светодиод(ы), и , так скааать, визуально наблюдать скрытый процесс:-) У меня для AVR до сих пор тоже нет железного отладчика - пользуюсь именно выводом в USART или светодиодами.
Visor
Цитата(prottoss @ Jan 11 2008, 23:00) *
Я же сказал - "... (или DBG_OUT :-)))." имея ввиду вывод в СОМ-порт. Если и СОМ-порта нет, то тогда есть еще одно хорошее средство - привинтить к свободной ноге(ногам) светодиод(ы), и , так скааать, визуально наблюдать скрытый процесс:-) У меня для AVR до сих пор тоже нет железного отладчика - пользуюсь именно выводом в USART или светодиодами.

Хех, идея хорошая, но плата уже готова, чип запаян, а навешивать "сопли" на чип в QFN64 дело неблагодарное.
Visor
Нашел ошибку в коде примера, неверный PLL clock Prescaler для частоты 16МГц, поправил.
Устройство стало определяться Виндовс, как "Контроллеры универсальной последовательной шины USB / Неизвестное устройство". Выходит, что устройство не возвращает сведений о себе. smile3046.gif
TinyQ
а при установке драйвера at90usbxxx_cdc.inf указывали?
Visor
Цитата(TinyQ @ Jan 13 2008, 16:13) *
а при установке драйвера at90usbxxx_cdc.inf указывали?

Пробывал, но драйвера на "Неизвестное устройство" там не оказалось. smile.gif
TinyQ
а VID_03EB&PID_2018 совпадают
у меня этот пример на at90usbkey работает
Visor
Цитата(TinyQ @ Jan 14 2008, 06:01) *
а VID_03EB&PID_2018 совпадают

Винда пишет Код экземпляра устройства: USB\VID_0000&PID_0000\5&13F82F15&0&2
TinyQ
Может проблема по плате?
Visor
Чип перестал работать, просто в один прекрасный день не завёлся и всё. Через ISP не отвечает. Проверил, на кварце нет генерации (16МГц). Заметил, что при отключении питания генерация на мгновение появляется при спаде питания ниже BOD. Что бы это значило?
Xenia
Цитата(Visor @ Jan 12 2008, 11:12) *
Нашел ошибку в коде примера, неверный PLL clock Prescaler для частоты 16МГц, поправил.
Устройство стало определяться Виндовс, как "Контроллеры универсальной последовательной шины USB / Неизвестное устройство".


Укажите, пожалуйста, где вы это исправили! У меня та же проблема, только я ошибки в упор не вижу.

В config.h переопределила на частоту 16 МГц:
#define FOSC 16000

В хидере pll_drv.h все написано совершено правильно:
#elif (FOSC==16000)
#define Pll_start_auto() Start_pll(PLLx03)
где PLLx03 определено выше как:
#define PLLx03 ( (1<<PLLP2) | (0<<PLLP1) | (1<<PLLP0) )

Так и быть должно согласно даташиту:
Табл. 6-13
XTAL=16 MHz
Clock Devision Factor=8
PLLP2=1
PLLP1=0
PLLP0=1

Где здесь ошибка?
Visor
Цитата(Xenia @ Apr 1 2008, 21:30) *
Укажите, пожалуйста, где вы это исправили! У меня та же проблема, только я ошибки в упор не вижу.

Ошибка оказалась в даташите, а не в софте.

Цитата(Xenia @ Apr 1 2008, 21:30) *
Так и быть должно согласно даташиту:
Табл. 6-13
XTAL=16 MHz
Clock Devision Factor=8
PLLP2=1
PLLP1=0
PLLP0=1

Где здесь ошибка?

В даташите (в моём по крайней мере):
Table 6-13. PLL input prescaler configurations
Код
PLLP2 PLLP1 PLLP0     Clock Division Factor     External XTAL required for USB
                                                            operation (MHz)
  0     0      0            Reserved                            -
  0     0      1            Reserved                            -
  0     1      0            Reserved                            -
  0     1      1               4                                8
  1     0      0            Reserved                            -
  1     0      1            Reserved                            -
  1     1      0               8                               16
  1     1      1            Reserved                            -
Xenia
Цитата(Visor @ Apr 2 2008, 08:38) *
Ошибка оказалась в даташите, а не в софте.


А у вас какой МК?

Скачала последний даташит с сайта ATMEL:
[PDF] AT90USB1286, AT90USB1287, AT90USB646, AT90USB647 (455 pages, revision G, updated 03/08)

Действительно, в марте появились изменения. Однако вот что там сказано:

External XTAL required for USB operation (MHz) = 16
Clock Division Factor = 8

PLLP2=1, PLLP2=0, PLLP2=1 (1)
Note: 1. For AT90USB128x only. Do not use with AT90USB64x.

PLLP2=1, PLLP2=1, PLLP2=0 (2)
Note: 2. For AT90USB64x only. Do not use with AT90USB128x.

У меня AT90USB647, значит я и виновата, что использовала программу для AT90USB1287. Но ведь и в голову не могло придти, что в этом месте может быть расхождение!
Visor
Цитата(Xenia @ Apr 2 2008, 20:08) *
А у вас какой МК?

Скачала последний даташит с сайта ATMEL:
[PDF] AT90USB1286, AT90USB1287, AT90USB646, AT90USB647 (455 pages, revision G, updated 03/08)

Действительно, в марте появились изменения. Однако вот что там сказано:

External XTAL required for USB operation (MHz) = 16
Clock Division Factor = 8

PLLP2=1, PLLP2=0, PLLP2=1 (1)
Note: 1. For AT90USB128x only. Do not use with AT90USB64x.

PLLP2=1, PLLP2=1, PLLP2=0 (2)
Note: 2. For AT90USB64x only. Do not use with AT90USB128x.

У меня AT90USB647, значит я и виновата, что использовала программу для AT90USB1287. Но ведь и в голову не могло придти, что в этом месте может быть расхождение!

Я работаю с AT90USB1286 (в теме указан wink.gif )
Использую даташит 7593D–AVR–07/06, т.е. ревизия D, когда я начинал была последняя.
Дак вы поправили, заработало?
У меня пример заработал, проблема была хардверная.
Xenia
Цитата(Visor @ Apr 2 2008, 18:15) *
Я работаю с AT90USB1286 (в теме указан wink.gif )
Использую даташит 7593D–AVR–07/06, т.е. ревизия D, когда я начинал была последняя.


А я действовала по ревизии А (7593A-AVR-02/06) - там было 101. Вашу ревизию D я тоже нашла, и действительно в ней написаное иное - 110. Но ведь ревизия G (7593G-AVR-03/08) - последняя и только что вышла, и согласно ей для AT90USB128 права ревизия А, а для AT90USB64 права ревизия D.
Но ведь у вас AT90USB128 и по ревизии D у вас заработало. Выходит, что последнняя ревизия снова вернулась к первоначальному ошибочному утверждению относительно AT90USB128?

Цитата(Visor @ Apr 2 2008, 18:15) *
Дак вы поправили, заработало?


Да, заработало. Вам огромное спасибо!
Visor
Цитата(Xenia @ Apr 3 2008, 06:08) *
Но ведь у вас AT90USB128 и по ревизии D у вас заработало. Выходит, что последнняя ревизия снова вернулась к первоначальному ошибочному утверждению относительно AT90USB128?

Нет, у меня работает с 101.

Цитата(Xenia @ Apr 3 2008, 06:08) *
Да, заработало. Вам огромное спасибо!

Я то причём. smile.gif
Xenia
Цитата(Visor @ Apr 3 2008, 06:55) *
Нет, у меня работает с 101. Я то причём. smile.gif


Если бы не ваш пост, я бы никогда не полезла искать последнюю ревизию даташита. А самой найти такую ошибку невозможно.
Xenia
На WinXP работает, а на Vista не загружается драйвер. Что делать?

В обеих случаях CDC использует фирменный драйвер от Microsoft под названием UsbSer.sys. При стандартной установке системы этот драйвер не ставится, но он имеется в базе driver.cab и оттуда при необходимости ставится в директорию System32\drivers\. Обычно этот драйвер используют многочисленные USB-модемы, для коих целей он и составлялся.
Проект at90usb128-demo-cdc-1_0_3.zip тоже базируется на этом драйвере, поэтому для его установки прилагается только inf-файл, который использует стандартный драйвер UsbSer.sys. Но вот беда - под Vista этот inf-файл не срабатывает.
Вот здесь - http://forums.microsoft.com/MSDN/showpost....51&siteid=1 - на микрософтовском форуме, народ ругается про то же самое. А кто-то составляет свои версии inf-файла - http://blog.bigreat.org/2007/11/25/at91sam...-windows-vista/ (правда не для AT90USB128, а для AT91SAM7).
Вопреки опасениям, UsbSer.sys в системе Vista имеется - его дата 02.11.2006 и он длинее на 2560 байт того, который поставляется с WinXP.

Отзовитесь, кому удалось запустить CDC-проект под Vista или помогите советом, где раздобыть подходящий inf-файл для этой цели.

===============
P.S.: Кажется в другом проекте at90usb162-cdc-1_0_1.zip есть inf-файл, в заголовке которого поминается Vista:

; Windows 2000, XP & Vista setup File for AT90USBxx2 demo

Пока не успела проверить заработает с ним или нет.
Visor
Цитата(Xenia @ Apr 4 2008, 19:13) *
На WinXP работает, а на Vista не загружается драйвер. Что делать?

Вы решили проблему? Интересует тот-же вопрос.
Xenia
Цитата(Visor @ Apr 26 2008, 21:09) *
Вы решили проблему? Интересует тот-же вопрос.


Проблема разрешилась тем способом, каким я и предполагала. INF-файл, взятый из проекта at90usb162-cdc-1_0_1.zip, способен работать под Vista со всеми МК типа AT90USB, а не только AT90USBxx2, как сказано в его заголовке.
Visor
Цитата(Xenia @ May 14 2008, 12:08) *
INF-файл, взятый из проекта at90usb162-cdc-1_0_1.zip, способен работать под Vista со всеми МК типа AT90USB, а не только AT90USBxx2, как сказано в его заголовке.

Спасибо! a14.gif
Visor
Обнаружилось следующее:
Когда размер принимаемого либо отправляемого пакета данных кратен размеру ENDPOINT, он застревает в хосте. Пакет любой другой длины передаётся без проблем.
Подскажите в чём дело? И нужно хорошее описание по USB.
prottoss
Цитата(Visor @ Jul 8 2008, 17:57) *
Обнаружилось следующее:
Когда размер принимаемого либо отправляемого пакета данных кратен размеру ENDPOINT, он застревает в хосте. Пакет любой другой длины передаётся без проблем.
Подскажите в чём дело? И нужно хорошее описание по USB.
После такого пакета нужно посылать хосту пакет нулевой длины - это сигнал о завершении передачи
galjoen
Цитата(prottoss @ Jul 8 2008, 14:07) *
После такого пакета нужно посылать хосту пакет нулевой длины - это сигнал о завершении передачи

Совершенно верно.
Но это происходит только в том случае если хост "не знает" длины передаваемых данных. Если длина известна хосту - передача завершается без посылки пакета 0й длины. В случае bulk передачи проблем нет - можно послать пакет 0й длины. А в случае передачи через контрольный канал (EP0) наличие в передатчике EP0 пакета 0й длины разрешённого для передачи, но незапрошенного хостом, может привести к сбою. Это если мы не успеем очистить передатчик EP0 после получения пакета OUT 0й длины с DATA1 (управляющая запись на эту транзакцию), а хост пошлёт следующий пакет SETUP (следующая транзакция) и сразу-же прочтет из передатчика EP0 пакет IN 0й длины (оставшийся) т.е. получится управляющее чтение (на следующую транзакцию). Я с такой ошибкой сталкивался. Пришлось слать пакет 0й длины по NAK-ам (если данные были кратны пакету EP). А заморочек с обработкой посылки NAK-ов хосту немало. Но я ничего лучше не придумал.
А вы как узнаёте, что нужно пакет 0й длины хосту слать? Без обработчика NAK-ов удаётся обойтись?
prottoss
Цитата(galjoen @ Jul 8 2008, 22:16) *
Я не использовал AT90USBxxx, но по большому счету это относится ко всему, что работает по USB. Хост в любом случае не знает, сколько данных ему забирать, потому что он железяка.smile.gif Так же не знает об этом и ПО, которое хостом управляет. ПО может только думать, ЧТО, если количество данных меньше, чем размер буфера конечной точки (EP), значит функция больше не будет передавать данные. Если количество принятых хостом данных равно размеру буфера ЕР, значит функция передала не все данные, и хост будет опрашивать функцию на предмет присутсвия пакета в ЕР. Чтобы сообщить хосту, что данных для передачи больше нет, мы пишем в ЕР нулевой пакет.
Visor
prottoss спасибо большое! Помогло!
Со стороны МК (USB Device) проблема решилась, но попался один РС (USB Host), который глючит по аналогичной причине, вплоть до потери устройства. Пришлось выкручиваться добавляя лишний байт, чтоб размер данных был не кратен размеру Endpoint.
Xenia
Два вопроса про питание AT90USB647 от порта

1. USB-коммуникация прекращает работать при понижении Vbus ниже 4.4 вольта. Это норма или патология?
Подробно моя проблема в следующем: устройство (АЦП с CDC-USB выходом) питается от Vbus и потребляет ток 200 мА, в то время как USB-порт столько ему не дает (по умолчанию должен давать 100 мА). В результате ограничения по току, напряжение падает до 4-х вольт, а на этом напряжении устройство не определяется компьютером, из-за чего не может попросить больше тока.
Это у всех так или я где-то напортачила? Схема соединения примитивная - все напряжения одним пучком Vbus+Uvcc+Avcc+Dvcc (Figure 21-3). Внутренний регулятор у меня включен.
По даташиту непонятно, должно ли работать при напряжении ниже 4.4 вольта. С одной стороны питание МК допустимо снижать до 3.4 вольта, а с другой стороны ничего не говорится про Ubus, который в то время отсоединен из пучка. Опять же сказано, что передающие линии D- и D+ имеют потенциал 1.4 вольта (если не в режиме хоста), а если так, то должно хватать.
И вообще, как мне быть, если у меня устройству нужно 200 мА, а начальное напряжение USB-порта при таком токе дает только 4 вольта?

2. Почему-то не хочет USB-порт добавлять ток, даже когда я его об этом вежливо прошу.
Устанавливаю:
#define CONF_ATTRIBUTES USB_CONFIG_BUSPOWERED
#define MAX_POWER 200 // 400 mA
USB_CONFIG_BUSPOWERED пробовала и 0x80 (как в апликэйшен), и 0x00 (как в книге Агурова), а толку чуть - какой был хилый ток, таким и остался. На разных компьютерах пробовала - результат неутешительный - сколько давал порт тока, столько и дает при любых MAX_POWER.
В чем тут может быть дело?
SKov
Цитата(Xenia @ Nov 5 2008, 12:41) *
Два вопроса про питание AT90USB647 от порта

2. Почему-то не хочет USB-порт добавлять ток, даже когда я его об этом вежливо прошу.
...
В чем тут может быть дело?

Говорят, что бывают такие умные материнские платы, которые действительно контролируют ток, потребялемый устройством от USB. На практике мне такое не встречалось. Типичная ситуация такова: операционка следит, чтобы суммарное потребление всех устройств на шине USB не превысило 0.5А. Если подключаемое устройство превышает эту грань, то оно не будет зарегистрировано операционнкой.
Так что все, что вы прописываете относительно потребления своего устройста, учитывается только на уровне "бухгалтерии', а не в виде реальных ограничений на ток на уровне железа.
На практике полно случаев "слабых" USB - портов или (у меня такой случай был) "слегка подгоревших", которые даже при 100мА садятся до 4-4.5V.
Для контроля такой ситуации пробуйте подключаться к разным компам или ставьте отдельную плату USB в свой комп.
Xenia
Цитата(SKov @ Nov 5 2008, 18:26) *
Говорят, что бывают такие умные материнские платы, которые действительно контролируют ток, потребляемый устройством от USB. На практике мне такое не встречалось. Типичная ситуация такова: операционка следит, чтобы суммарное потребление всех устройств на шине USB не превысило 0.5А. На практике полно случаев "слабых" USB - портов или (у меня такой случай был) "слегка подгоревших", которые даже при 100мА садятся до 4-4.5V.


Материнские платы действительно ограничивают ток USB. И это скорее всего не от большого ума, а необходимость защиты от внешнего короткого замыкания по USB-питанию.
USB-порты компьютеров, которые я испытывала, никак нельзя назвать слабыми, так как на них может работать внешний диск, потребляющий 0.8 А (из двух портов USB). Если бы порты и в самом деле были слабыми, то внешний диск бы не работал. Кроме того, модем (ZyXEL OMNI ADSL USB) тоже потребляет прилично - у него в конфигурации прописано 500 мА. А мое устройство потребляет куда меньше - 195 мА при напряжении 5.0 в.
Короче говоря, на чужие USB-устройства порты ток дают, а на мое нет. И вина в том, скорее всего ложится на драйвер. Я пробовала брать типовую прошивку, которую рекомендует Atmel, - "AT90USB128/64 CDC Device Virtual Com Port project". Исправляла в ней ток 100 мА на 500 мА (MAX_POWER = 0xFA) и получала тот же самый результат. И это не удивительно, т.к. все лабают с этого проекта, как и я.
В разных местах по этому поводу посылают читать "Refer to USB Feature Specification: Interface Power Management for details", но этого труда нигде достать не удается, хотя ссылок на него тьма тьмущая. В общем-то дело сводится к тому, что устройства USB 2.0 должны просить для себя электричество как-то иначе, чем это обычно делают устройства на USB 1.1.
Цитата
When USB 2.0 was released, the document USB Feature Specification: Interface Power Management was under development. This document describes a protocol for managing power at the interface level instead of just the device level, to enable more precise and effective power conservation.

Цитата
The 2.0 specification added an interface_power descriptor that enables power management at the interface level in addition to the device level. The document describing this descriptor's structure and use is USB Feature Specification: Interface Power Management.

И где мне искать описание этого загадочного "interface_power descriptor"а, если он даже в книге Агурова не упоминается?

P.S. С первым вопросом про питание я кажется сама разобралась - ниже 4.4 вольт зависал сам МК, т.к., согласно даташиту, питание при кварце 16 мГц должно быть не ниже 4.5 вольт. А на кварце 8 мГц тот же МК может работать даже начиная с 2.7 вольта. Придется теперь на вдвое медленный кварц переезжать. sad.gif
SKov
Цитата(Xenia @ Nov 6 2008, 02:35) *
Материнские платы действительно ограничивают ток USB. И это скорее всего не от большого ума, а необходимость защиты от внешнего короткого замыкания по USB-питанию.

Возможно, не буду спорить. У моей материнки возраст меньше 3-х лет. Я умудрился спалить (по питанию) порт USB, который стоял на плате. Вытащил материнку из компа и к своему удивлению увидел обуглившийся проводник, подходивший к разъему USB. Припаивание проводочка поверх обуглившегося решило проблему - порт снова заработал и стал выдавать питание наружу. Читал про платы расширения USB, на которых стояли самовосстанвливающиеся предохранители. Про материнки, измеряющие и ограничивающие ток, не читал и не видел.
Я все-таки думаю, что вы только лишь уведомляете операционку, что хотите подключить устройство с таким-то питанием. А операционка просто суммирует эти числа для разных устройств на этой шине, сравнивает с максимально допустимой нагрузкой и либо регистрирует новое устройство в системе либо отказывает в регистрации по причине возможной перегрузки порта.
Xenia
Цитата(SKov @ Nov 6 2008, 04:21) *
Про материнки, измеряющие и ограничивающие ток, не читал и не видел.


Таких материнок, которые чтобы ограничить ток измеряют, действительно нет smile.gif. Там принцип очень простой - на проходе ставят примитивный усилитель тока - транзистор, в цепи базы которого пускают калиброваный ток. Величина, получаемая умножением базового тока на коэффициент усиления по току для этого танзистора, и есть приблизительно ток отсечки. При достижении такого тока транзистор впадает в насыщение и больше чем эту величину пропустить тока через себя не может.
Конечно, это весьма грубый способ регулирования, т.к. внутреннее сопротивление самого транзистора при разных токах трудно учесть, а стало бы и падение напряжения на нем. Но, согласно описанию, дозирование тока производится ступенчато - шагами по 100 мА. А, значит, что там всего 5 ступенек, для которых подобрать резисторы для подходящего тока утечки можно экспериментально. Впрочем, похоже на то, что подбором фирмачи не занимаются, т.к. у меня, например, ограничение по току наступает не при 100 мА, а при 153 мА. Причем, на разных материнках по-разному. Но принцип регулирования тут у всех одинаковый.
Об этом я сама узнала случайно, когда у моего знакомого сгорел USB порт на старом ноутбуке из-за того, что он работал с внешним USB-диском, подключая только один USB-разъем. Ремонтровать пришлось у умельца, который все это рассказал. Я же за что купила, за то и продаю smile.gif.
SKov
Цитата(Xenia @ Nov 6 2008, 12:32) *
Там принцип очень простой - на проходе ставят примитивный усилитель тока - транзистор, в цепи базы которого пускают калиброваный ток.
....
Но, согласно описанию, дозирование тока производится ступенчато - шагами по 100 мА.
.....
Ремонтровать пришлось у умельца, который все это рассказал. Я же за что купила, за то и продаю smile.gif.

Сомневаюсь, что такая схема является общепринятой или стандартной. Хорошо бы взглянуть на описание, на которое Вы ссылаетесь. Всё-таки я остаюсь на своих позициях, пока не увижу бумагу, где написано обратное wink.gif
Еще пара аргументов в пользу того, что ситуация именно такая, как я её представляю.
1) Если ваше устройство не работает (кварц не завелся), и операционка в принципе не в состоянии узнать, сколько вы хотите потреблять тока, то почему она в вашем случае ограничивает ток на уровне около 150ма? Вариант, что это величина ограничения по умолчанию, не проходит, иначе бы диски с питанием 0.8 А от двух USB не работали бы в принципе, ведь система не знает, с какого второго порта вы берете только питание. Вывод - ваш порт либо по жизни хилый либо подгорелый по питанию.
2) Несколько лет назад известная фирма Силабс начала выпускать свои преобразователи USB-Сом ср210х, к которым была приложена программа, с помощью которой можно было менять ток, запрашиваемый устройством. Эта информация хранилась в байте еепром в чипе преобразователя.
Содержимое байта (0..255) умножалось на 2 и передавалось операционке в качестве потребляемого тока. Некоторые разработчики сгоряча прописывали в этом байте максимально возможное число - 0xFF. Это число записывалось во внутреннюю еепром и соответствовало току 2* 255 - 510мА.
После этой операции чип можно было выбрасывать в урну, т.к. НИЧЕГО С НИМ НЕЛЬЗЯ БЫЛО СДЕЛАТЬ.
Чтобы перепрошить чип, надо было, чтобы его увидела система, а система (на уровне софта, а не харда!) отказывалась работать с устройством, которое требовало питание польше 500мА ! Помню, на силабовском форуме было бурное обсуждение, и наверное, сейчас программа прошивки уже поправлена wink.gif Думаю, этот пример говорит тоже в пользу версии о софтверном смысле параметра потребления, не имеющим прямого отношения к харду, который может ограничивать ток лишь на уровне 0.5А, да и то не всегда, как было в случае с моей материнкой.
TinyQ
to Xenia

уточните вы пытаетесь подключать свое устройство только к ноутбукам или нет?
Xenia
Цитата(SKov @ Nov 6 2008, 16:02) *
Сомневаюсь, что такая схема является общепринятой или стандартной. Хорошо бы взглянуть на описание, на которое Вы ссылаетесь. Всё-таки я остаюсь на своих позициях, пока не увижу бумагу, где написано обратное


Я вроде бы по-русски написала, что сослалась на слова умельца, который чинил сгоревший USB-порт. А для таких придир, как вы, я специально оговорила "за что купила, за то и продаю". Где вы прочли в моем посте, что я на описание ссылаюсь?
Если вы сомневаетесь, что там в качестве дискриминатора транзистор стоит, то что вам кажется менее сомнительным? Что там резистор что ли впаяли? Если бы это было так, то при достижении порогового значения наблюдалась бы не отсечка, а линейное уменьшение выдаваемого компьютером напряжения с ростом потребляемого тока на всем диапазоне. Однако такой эффект незамечен. До 100 мА порт исправно выдает свои 5 вольт (у меня 5.05 в) и лишь после преодоления порога ток начинает уменьшаться. Мой ноутбук при нагрузке на мое устройство (эквивалентное сопротивление 25 ом) понижает ток до 153-160 мА. Весьма возможно, что при коротком замыкании ток еще на сколько-то подрастет, но дискриминатор сгореть ноутбуку не даст.
Если же вы коряво выразились, и под словом схема имели ввиду не электрическую схему обеспечения напряжением, а логическую схему его блоковой раздачи, то здесь сослаться на описание я могу:
Павел Агуров, Интерфейс USB : практика использования и программирования, СПб, БХВ-Петербург, 2006. На странице 60 читаем:
Цитата
Устройство указывает потребляемую мощность в дескрипторе конфигурации, который передается хосту при нумерации устройств на шине (см. разд. 10.2.2). Причем потребляемый от шины ток указывается с дискретностью 2 мА. Например, если устройство потребляет ток от USB-шины 100 мА, то в дескрипторе должна фигурировать цифра 50 (50 х 2 = 100 мА). Потребление тока устройством не должно превышать значения, указанного в процессе нумерации.
Потребляемая мощность, согласно спецификации USB, измеряется в блоках (unit). Один блок составляет 100 мА. Таким образом, устройства с малым потреблением используют 1 блок, а с большим потреблением - до 5 блоков.


Цитата(SKov @ Nov 6 2008, 16:02) *
Еще пара аргументов в пользу того, что ситуация именно такая, как я её представляю.
1) Если ваше устройство не работает (кварц не завелся), и операционка в принципе не в состоянии узнать, сколько вы хотите потреблять тока, то почему она в вашем случае ограничивает ток на уровне около 150ма?


Речь шла о случае, когда устройство "завелось", т.е. не только нормально определилось, но и выдает правильный текст на виртуальный COM-порт. Например, у моего ноутбука тока на это хватает (4.5 в, 153-160 мА), а у десктопа не хватает (4.0 в, 140 мА). Меня насторожил тот факт, что напряжение и токопотребление остаются одинаковыми, как в случае, когда устройство определилось (был инсталлирован драйвер), так и в том случае, когда оно не определилось (подключение без драйвера). Такое положение не нормально и свидетельствует о том, что просьба устройства о дополнительном электроснабжении была компьютером проигнорирована.
Кроме того, в моем устройстве предусмотрено подключение внешнего напряжения питания, благодаря чему я могу завести свое устройство даже на слаботочном USB-порте, а затем, отключив внешнюю подпитку, замерить, что дает порт.

Цитата(SKov @ Nov 6 2008, 16:02) *
Вывод - ваш порт либо по жизни хилый либо подгорелый по питанию.


У меня в ноутбуке не один USB-прт, а четыре. А на десктопе и подавно 6 портов. И все они ведут себя одинаково. Что ж, по-вашему они всего горелые? Если так, то отчего же те самые внешние USB-диски у меня на этих портах работают?

Цитата(SKov @ Nov 6 2008, 16:02) *
2) Несколько лет назад известная фирма Силабс начала выпускать свои преобразователи USB-Сом ср210х, к которым была приложена программа, с помощью которой можно было менять ток, запрашиваемый устройством. Эта информация хранилась в байте еепром в чипе преобразователя.
Содержимое байта (0..255) умножалось на 2 и передавалось операционке в качестве потребляемого тока. Некоторые разработчики сгоряча прописывали в этом байте максимально возможное число - 0xFF. Это число записывалось во внутреннюю еепром и соответствовало току 2* 255 - 510мА.
После этой операции чип можно было выбрасывать в урну, т.к. НИЧЕГО С НИМ НЕЛЬЗЯ БЫЛО СДЕЛАТЬ.
Чтобы перепрошить чип, надо было, чтобы его увидела система, а система (на уровне софта, а не харда!) отказывалась работать с устройством, которое требовало питание польше 500мА !


Это вы к чему? Какое отношение к теме имеют проблемы перепрошивки еепром у Силабса? У меня на AT90USB647 с прошивкой все нормально. Кроме того, я запрашиваю ток 400 мА (MAX_POWER=200). И этот запрос нормально виден на трассировщике USB канала.

Цитата(TinyQ @ Nov 7 2008, 13:07) *
уточните вы пытаетесь подключать свое устройство только к ноутбукам или нет?


Ответ на этот вопрос содержится в ответе для SKov.
SKov
Цитата(Xenia @ Nov 7 2008, 14:36) *
Я вроде бы по-русски написала,
...
А для таких придир, как вы,
.....
Если же вы коряво выразились,
...
Это вы к чему?
...

Я просто хотел вам помочь.
Теперь уже не хочется.
Извините.
ARV
извините, что вмешиваюсь... мне казалось, что USB-хост выделяет по умолчанию 100 мА, и лишь по запросу больше. т.е. мне кажется, что девайс сначала должен держать всю свою периферию выключенной, чтобы не брать ток более 100 мА, потом запросить у системы свои реально необходимые 400 мА... а потом, по идее, уточнив, принят ли его запрос, подключать свою периферию...

или я путаю?
Xenia
Цитата(ARV @ Nov 7 2008, 15:37) *
мне казалось, что USB-хост выделяет по умолчанию 100 мА, и лишь по запросу больше. т.е. мне кажется, что девайс сначала должен держать всю свою периферию выключенной, чтобы не брать ток более 100 мА, потом запросить у системы свои реально необходимые 400 мА... а потом, по идее, уточнив, принят ли его запрос, подключать свою периферию...
или я путаю?


Вы ничего не путаете, именно так всё и есть. Только к моему большому сожалению, я мало что могу сделать, чтобы мое устройство вписалось в 100 мА. Погрузить в спячку микроконтроллер я не могу - в таком состоянии он неспособен будет общаться по USB. Оба АЦП (ADS1255) на борту питаются через через гальваноразвязки DC/DC (у каждого своя) - именно на них приходится наибольший расход тока, т.к. их КПД низок при данном токе (20% загрузки). Погружала оба АЦП в спячку, но это дало прибавку напряжения только на 0.05 в. Чтобы отключать DC/DC преобразователи на входе нужно было позаботиться заранее, при проектировании устройства. И это бы, несомненно, усложнило и удорожило конструкцию. А главное, что тогда я не могла знать, что у меня будет такой затык с USB-питанием, т.к. никогда раньше я программированием этой части не занималась. Да и про ограничение в 100 мА узнала только тогда, когда с этим непосредственно столкнулась.
GDI
Цитата
С первым вопросом про питание я кажется сама разобралась - ниже 4.4 вольт зависал сам МК, т.к., согласно даташиту, питание при кварце 16 мГц должно быть не ниже 4.5 вольт. А на кварце 8 мГц тот же МК может работать даже начиная с 2.7 вольта. Придется теперь на вдвое медленный кварц переезжать.

Вообще то для того чтобы не "переезжать", в устройствах ставят повышающий преобразователь и 7805, во всех USB сканерах так сделано, да и в некоторых переходниках для винчестеров.
P.S. Хотя для вас это, видимо , не подойдет раз плата уже готова.
Dj.Shadow
Xenia, а еще можно DC\DC подключить через мелкие полевички (например IRLML6401), чтоб питание им подавать после иницилизации, когда операционка разрешит. Всего то 1-2 вывода процессора оно займет.
Xenia
Заменила кварц 16 МГц на 8 МГц и ... ничего не изменилось. Снова всё та же история - как только напряжение становится ниже 4.4 вольта - МК виснет (обычно он у меня мигает раз в секунду светодиодиком).
Может быть у меня какой-нибудь не тот BODLEVEL в фузах прошит? И из-за этого МК на низком напряжении работать не хочет?
Подскажите пожалуйста, какие фузы для него надо устанавливать! Только все фузы разом, а не только те, которые понимаете. У меня внешний кварцевый резонатор на 8 МГц, и надо чтобы и МК работал на той же частоте. Хотелось бы, чтобы годилось питание в 4 вольта, а лучше - как можно более низкое.
Petka
Цитата(Xenia @ Nov 8 2008, 00:40) *
Заменила кварц 16 МГц на 8 МГц и ... ничего не изменилось. Снова всё та же история - как только напряжение становится ниже 4.4 вольта - МК виснет (обычно он у меня мигает раз в секунду светодиодиком).
Может быть у меня какой-нибудь не тот BODLEVEL в фузах прошит? И из-за этого МК на низком напряжении работать не хочет?
Подскажите пожалуйста, какие фузы для него надо устанавливать! Только все фузы разом, а не только те, которые понимаете. У меня внешний кварцевый резонатор на 8 МГц, и надо чтобы и МК работал на той же частоте. Хотелось бы, чтобы годилось питание в 4 вольта, а лучше - как можно более низкое.

смотрю даташит:
Table 8-2. BODLEVEL Fuse Coding(1)
Код
BODLEVEL 2..0            V
111                  BOD Disabled
110                  2.0 V
101                  2.2 V
100                  2.4 V
011                  2.6 V
010                  3.4 V
001                  3.5 V
000                  4.3 V

в зависимости от установленных фузов BODLEVEL контроллер будет "уходить в reset" при разных напряжениях. выберите нужное вам напряжение и соответствующим образом прошейте фузы.
Xenia
Цитата(Petka @ Nov 8 2008, 11:13) *
смотрю даташит:
Table 8-2. BODLEVEL Fuse Coding(1)


Эту табличку я видела. Мои фузы такие (лог программатора Avreal32):

Код
Device connected, 90USB647 detected
Chip not locked
Fuses
  OSCCAL = 91
  CKDIV = 1
  CKOUT = 1
  SUT = 2
  CKSEL = E
  BLB1 = 3
  BLB0 = 3
  OCDEN = 1
  JTAGEN = 0
  WDTON = 1
  EESAVE = 1
  BOOTSZ = 1
  BOOTRST = 1
  HWBE = 0
  BODLEVEL = 7


Судя по BODLEVEL = 7, я пыталась отключить BOD совсем. Впрочем, не дожидаясь ответа, я перепробовала все BODLEVEL, но лучше от этого не стало.

Не подбросит ли кто-нибудь еще идеи, по какой причине AT90USB647 может зависать, при уменьшении питающего напряжения ниже 4.4 вольта?
Petka
Цитата(Xenia @ Nov 8 2008, 13:16) *
Судя по BODLEVEL = 7, я пыталась отключить BOD совсем. Впрочем, не дожидаясь ответа, я перепробовала все BODLEVEL, но лучше от этого не стало.

Не подбросит ли кто-нибудь еще идеи, по какой причине AT90USB647 может зависать, при уменьшении питающего напряжения ниже 4.4 вольта?

Как вы подключили пин UVCC?
Xenia
Цитата(Petka @ Nov 8 2008, 14:24) *
Как вы подключили пин UVCC?


На этот вопрос я уже отвечала:

Цитата(Xenia @ Nov 5 2008, 12:41) *
Схема соединения примитивная - все напряжения одним пучком Vbus+Uvcc+Avcc+Dvcc (Figure 21-3). Внутренний регулятор у меня включен.


Криминала тут нет, поскольку согласно Figure 21-3 даташита, такая схема подключения функционирует вплоть до 3.4 в (ниже уже требуется подключаться напрямую к Ucap).
Кроме того, если бы я даже совсем обесточила UVCC, то у меня бы только перестал работать USB-канал, но процессор бы не завис. А у меня ниже 4.4 вольта перестает моргать светодиод на выводе порта, переключаемого из прерывания по таймеру T0. Т.е. у меня даже таймер останавливается! Впечатление такое, что кварц "заело".
Petka
Цитата(Xenia @ Nov 8 2008, 15:38) *
А у меня ниже 4.4 вольта перестает моргать светодиод на выводе порта, переключаемого из прерывания по таймеру T0. Т.е. у меня даже таймер останавливается! Впечатление такое, что кварц "заело".

1) а осцильчиком в кварц тыкнуть?
2) а если запитать схему не от USB а от регулируемого источника питания. (d+ и d- НЕ использовать). И тоже понижать напряжение. Схема тоже "остановится"?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.