Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM. Энкодеры и акселерометры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3, 4
Zliva
Цитата(aaarrr @ Sep 8 2009, 15:20) *
Боюсь, бесплатно будут только "кучерявые" - на то они и примеры.

Ладною. Попробую прикрутить к своему проекту. Может что-то получится.
head_sk
Корявая это да... Но там напильником работать не более суток и не так сложно
Zliva
Цитата(head_sk @ Sep 8 2009, 18:35) *
Корявая это да... Но там напильником работать не более суток и не так сложно

Да. Согласен. Если конечно знать, что пилить.
singlskv
Цитата(head_sk @ Sep 8 2009, 19:35) *
Корявая это да... Но там напильником работать не более суток и не так сложно

Ну чтоб качественный итог получить нужна примерно неделя...


Цитата(Zliva @ Sep 8 2009, 19:59) *
Да. Согласен. Если конечно знать, что пилить.

Пилить там нужно в основном неправильную работу прерываний(ну просто апшибки типа забыли
запретить прерывание на ендпоинте ) и сильно
избыточные в некоторых местах вызовы вложенных функций...
aaarrr
Цитата(singlskv @ Sep 8 2009, 23:18) *
Ну чтоб качественный итог получить нужна примерно неделя...

Дык лучше за ту же неделю свое написать. Ну, если опыт есть, конечно. А так работать будет, но уродства останутся.
Zliva
Объясните пожалуйста. Голова кругом идет от всего этого. Залил пример с Amel. Нашло устройство at91usbserial. Где взять для него драйвер? Если кто-то сможет, сбросите пожалуйста нормальную версию реализации CDC.
singlskv
Цитата(aaarrr @ Sep 8 2009, 23:22) *
Дык лучше за ту же неделю свое написать. Ну, если опыт есть, конечно. А так работать будет, но уродства останутся.
Начинал как раз с примера атмел фреймворкс, потратил 2-3 недели на все, думаю что "уродств" у меня уже не осталось.
Свое за неделю бы не написал, USB было в первый раз, но сейчас код вылизан достаточно хорошо,
по крайней мере с другим кодом переферии сложностей нет... а там много чего и очень быстрое...




Цитата(Zliva @ Sep 8 2009, 23:22) *
Объясните пожалуйста. Голова кругом идет от всего этого. Залил пример с Amel. Нашло устройство at91usbserial. Где взять для него драйвер?

Вам просто нужен соответствующий .inf файл для драйвера usbser в котром прописанны нужные VID и PID.
Цитата
Если кто-то сможет, сбросите пожалуйста нормальную версию реализации CDC.

У меня увы очень спецефичная реализация, там модбас over USB...(со всеми ненужными в остальной жизьни конролями)
Zliva
Честно говоря, мне хотя бы глазом посмотреть на нормальную реализацию, а то что не пример, то кривой.
singlskv
Цитата(Zliva @ Sep 8 2009, 23:51) *
Честно говоря, мне хотя бы глазом посмотреть на нормальную реализацию, а то что не пример, то кривой.
Задавайте конкретные вопросы, и Вам вероятно помогнут, ну нету у меня например желания отправлять
вам полностью готовый мой исходник, а просто примера у меня нету...
Zliva
Цитата(singlskv @ Sep 8 2009, 23:01) *
Задавайте конкретные вопросы, и Вам вероятно помогнут, ну нету у меня например желания отправлять
вам полностью готовый мой исходник, а просто примера у меня нету...

Конкретный вопрос: с какого примера начать, чтобы не заворачиваться на все остальное и не делать или избежать ошибок, на которые Вы (может не прав) напоролись, что бы не тратить на это свое время? ? Может есть какие-то явные или неявные глюки, подскажите где они?
aaarrr
Цитата(Zliva @ Aug 26 2009, 18:24) *
...освоение ARM, USB-интерфейс дело для меня принципиальное. Хочу и все.

Если действительно стоит задача освоить USB, то совершенно все равно, какой пример взять - шишки набивать необходимо.
А если уж делать совсем честно, то начинать надо с изучения спецификации и попыток написать свой код - получите ни с чем не сравнимое удовольствие, когда винда скажет "Обнаружено новое устройство", и это будет именно ваше устройство, а не тянутое из примера.
Zliva
Цитата(aaarrr @ Sep 8 2009, 23:18) *
Если действительно стоит задача освоить USB, то совершенно все равно, какой пример взять - шишки набивать необходимо.
А если уж делать совсем честно, то начинать надо с изучения спецификации и попыток написать свой код - получите ни с чем не сравнимое удовольствие, когда винда скажет "Обнаружено новое устройство", и это будет именно ваше устройство, а не тянутое из примера.

Да. К сожалению - Вы правы. Лиха беда начало. Если пропаду ненадолго - читаю спецификацию.
aaarrr
Цитата(Zliva @ Sep 9 2009, 00:40) *
Лиха беда начало. Если пропаду ненадолго - читаю спецификацию.

Это правильно, тем более, что не так уж и много там чтения. А если что - обращайтесь, поможем.

И поверьте, гораздо проще и приятнее помочь человеку с его собственным кодом, чем с адаптированным примером. В последнем случае, во-первых, вопрошающий иногда совсем не понимает, о чем спрашивает; во-вторых, глазение на атмеловский код у меня, например, провоцирует приступ мизантропии smile.gif
Zliva
Цитата(aaarrr @ Sep 8 2009, 23:56) *
Это правильно, тем более, что не так уж и много там чтения. А если что - обращайтесь, поможем.

И поверьте, гораздо проще и приятнее помочь человеку с его собственным кодом, чем с адаптированным примером. В последнем случае, во-первых, вопрошающий иногда совсем не понимает, о чем спрашивает; во-вторых, глазение на атмеловский код у меня, например, провоцирует приступ мизантропии smile.gif

Да. Согласен. Меня уже дергает. Зачем все так городить. Не пойму.
Zliva
Подскажите пожалуйста, не могу понять. Зачем эти инициализации:
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
…..
TRACE_INFO_WP("USBD_Init\n\r");
singlskv
Цитата(Zliva @ Sep 13 2009, 12:43) *
Подскажите пожалуйста, не могу понять. Зачем эти инициализации:
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
…..
TRACE_INFO_WP("USBD_Init\n\r");

Просто инициализация DBGU для печати отладочных сообщений
Ну и собственно сам вывод отладочных сообщений
Zliva
Цитата(singlskv @ Sep 13 2009, 13:30) *
Просто инициализация DBGU для печати отладочных сообщений
Ну и собственно сам вывод отладочных сообщений

Какое он вообще принимает участие? Дело в том, когда я комментирую TRACE_CONFIGURE(..) – устройство не опознается виндой. Без него пример от Атмела будет работать?
aaarrr
Цитата(Zliva @ Sep 13 2009, 15:15) *
Какое он вообще принимает участие? Дело в том, когда я комментирую TRACE_CONFIGURE(..) – устройство не опознается виндой. Без него пример от Атмела будет работать?

Если не выполнить TRACE_CONFIGURE, то зависнет на первом TRACE_INFO, что вполне логично.
Zliva
Блин. Как так писать такие глючные примеры? Уму непостижимо.
Помогите с последовательностью инициализации. Что за чем и как. Думаю, всем будет полезно.
singlskv
Цитата(Zliva @ Sep 13 2009, 16:12) *
Блин. Как так писать такие глючные примеры? Уму непостижимо.
Помогите с последовательностью инициализации. Что за чем и как. Думаю, всем будет полезно.

Если вам не нужно вывод отладки через DBGU просто при компиляции укажите дефайн
TRACE_LEVEL=TRACE_LEVEL_NO_TRACE

все варианты смотрите в файле trace.h

ну и просто можете в коде прибить все TRACE_xxxx и упоминания файла trace.h
Zliva
Объясните пожалуйста значение этих переменных:
SANITY_CHECK((priority & ~AT91C_AIC_PRIOR) == 0);
BOARD_USB_PULLUP_MATRIX
BOARD_USB_PULLUP_INTERNAL
BOARD_USB_PULLUP_EXTERNAL
aaarrr
Цитата(Zliva @ Sep 13 2009, 22:18) *
Объясните пожалуйста значение этих переменных:

Во-первых, это не переменные, а макросы. Во-вторых, назначение вполне очевидно:

Код
SANITY_CHECK((priority & ~AT91C_AIC_PRIOR) == 0);
- вывод ошибки вида "Sanity check failed at FILE:LINE" и зависание при не верности условия.

Код
BOARD_USB_PULLUP_MATRIX
BOARD_USB_PULLUP_INTERNAL
BOARD_USB_PULLUP_EXTERNAL

- задают тип используемого pull-up'а.
singlskv
Цитата(Zliva @ Sep 13 2009, 22:18) *
Объясните пожалуйста значение этих переменных:
SANITY_CHECK((priority & ~AT91C_AIC_PRIOR) == 0);

Это просто макрос проверки приоритета на соответствие, при ошибке печать через DBGU варнинга
можно смело выкидывать так же как и все TRACE_xxx
Цитата
BOARD_USB_PULLUP_MATRIX
BOARD_USB_PULLUP_INTERNAL
BOARD_USB_PULLUP_EXTERNAL

Это просто выбор того как подключается pullup на линии D+ при появлении питания на USB разъеме.
В некоторых процах есть внутренний пулап, в Вашем насколько я понимаю только EXTERNAL и
все остальные варианты можно просто поудалять.
Zliva
Что долго инициализируется устройство. Когда подключил к компу устройство, жду порядка минуты, потом появляется сообщение, что винда нашла виртуальный порт. Кто-то с такой ситуацией встречался?
aaarrr
Т.к. время в одну минуту превосходит все разумные таймауты системы, я бы для начала проверил на другом компьютере.
Zliva
Начинает немного прояснятся. В неделю нереально вложится smile3046.gif . Думаю переписать све под себя.
Не могу понять вот такой код:
Код
// Get interrupts status
    status = AT91C_BASE_UDPHS->UDPHS_INTSTA & AT91C_BASE_UDPHS->UDPHS_IEN;
Можете объяснить? То есть не могу найти описания UDPHS_INTSTA и UDPHS_IEN.
aaarrr
Цитата(Zliva @ Sep 16 2009, 01:22) *
Можете объяснить? То есть не могу найти описания UDPHS_INTSTA и UDPHS_IEN.

А в HS-то вас как занесло?
Zliva
Цитата(aaarrr @ Sep 16 2009, 00:43) *
А в HS-то вас как занесло?

Стандартный пример от атмела. Смотрите обработку прерываний
void USBD_InterruptHandler(void).
singlskv
Цитата(Zliva @ Sep 16 2009, 01:22) *
Начинает немного прояснятся. В неделю нереально вложится smile3046.gif . Думаю переписать све под себя.
Не могу понять вот такой код:
Код
// Get interrupts status
    status = AT91C_BASE_UDPHS->UDPHS_INTSTA & AT91C_BASE_UDPHS->UDPHS_IEN;
Можете объяснить? То есть не могу найти описания UDPHS_INTSTA и UDPHS_IEN.


Вы смотрите файл USBD_UDPHS.c который Вам нафиг не нужен он относиться к HighSpeed
и в самом его начале:

#ifdef BOARD_USB_UDPHS
........весь код
#endif

Вам нужен файл USBD_UDP.c который имеет в начале:
#if defined(BOARD_USB_UDP)
..........весь код
#endif

Ну и если посмотреть Ваш board.h:
Код
//------------------------------------------------------------------------------
// USB
//------------------------------------------------------------------------------
/// Indicates the chip has a UDP controller.
#define BOARD_USB_UDP

/// Indicates the D+ pull-up is externally controlled.
#define BOARD_USB_PULLUP_EXTERNAL

/// Number of endpoints in the USB controller.
#define BOARD_USB_NUMENDPOINTS                  4

/// Returns the maximum packet size of the given endpoint.
/// \param i  Endpoint number.
/// \return Maximum packet size in bytes of endpoint.
#define BOARD_USB_ENDPOINTS_MAXPACKETSIZE(i)    ((i == 0) ? 8 : 64)

/// Returns the number of FIFO banks for the given endpoint.
/// \param i  Endpoint number.
/// \return Number of FIFO banks for the endpoint.
#define BOARD_USB_ENDPOINTS_BANKS(i)            (((i == 0) || (i == 3)) ? 1 : 2)

/// USB attributes configuration descriptor (bus or self powered, remote wakeup)
#define BOARD_USB_BMATTRIBUTES                  USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP
//#define BOARD_USB_BMATTRIBUTES                  USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP
//#define BOARD_USB_BMATTRIBUTES                  USBConfigurationDescriptor_SELFPOWERED_RWAKEUP
//------------------------------------------------------------------------------


то видно какой код будет работать

Просто удалите нафиг из кода библиотеки все что не относится к Вашей плате,
тогда разбираться будет намного проще.
Zliva
Маленький отчет.
1. Удалил файл UDPHS.с Работает. Может еще что-то надо удалить laughing.gif? А то я занимался пунктом 2 и не было времени разобраться с UDPHS.
2. Спаял датчик ускорения. Заработал вариант только с MMA7260QT (на 6g) из третей пробы. Спалил один ADXL210 и один MMA7260QT. Народу на заметку: Не советую некому паять эти датчики советским паяльником, а то вывалите лишние деньги и потратите много времени (как я) впустую. Лучше поискать паяльную станцию, или сделать как я – обратится в сервис по ремонту мобил. Там такой аппарат есть или должен быть. Также прикупил два датчика LIS302DL (на 8g) c SPI/I2C. Их уже припаял на плату - но не подключал. Когда что-то выйдет, отпишу.
Не могу понять, зачем инициализировать таймер с прерываниями?
aaarrr
Цитата(Zliva @ Sep 18 2009, 00:38) *
1. Удалил файл UDPHS.с Работает. Может еще что-то надо удалить laughing.gif? А то я занимался пунктом 2 и не было времени разобраться с UDPHS.

Может. Как видите, время тратить все равно приходится, несмотря на наличие казалось бы готового кода. И тратится оно в данном случае практически впустую.

Цитата(Zliva @ Sep 18 2009, 00:38) *
Не советую некому паять эти датчики советским паяльником, а то вывалите лишние деньги и потратите много времени (как я) впустую.[/b] Лучше поискать паяльную станцию, или сделать как я – обратится в сервис по ремонту мобил.

Пробитым паяльником, равно как и незаземленной станцией, угробить можно что угодно. Но виноват отнюдь не паяльник.

Цитата(Zliva @ Sep 18 2009, 00:38) *
Не могу понять, зачем инициализировать таймер с прерываниями?

Pardon?
singlskv
Цитата(Zliva @ Sep 18 2009, 00:38) *
Маленький отчет.
1. Удалил файл UDPHS.с Работает. Может еще что-то надо удалить laughing.gif? А то я занимался пунктом 2 и не было времени разобраться с UDPHS.

Просто найдите(поиском по файлам) и удалите весь код который
#ifdef BOARD_USB_UDPHS
....... код
#endif (или #else #elseif)

Ну а дальше уже внимательно изучать и оптимизировать...

Да, еще поищите по форуму, была ошибка в этом коде с прерыванием ендпоинта
И еще ошибка с пулапом...
Zliva
С дескрипторами разобрался. Вроде все понятно. Теперь ступор. Не могу понять что делать дальше. Смотрю примеры, и все больше убеждаюсь в том, что нужно писать самому. Не могу определится с последовательностью, что зачем и когда. Теперь вопросы:
1. Чем просматривать пакеты со стороны хоста?
2. Набросайте последовательность инициализации устройства, что зачем должно идти, или скажите, где можно прочитать. Не могу никак въехать в саму иерархию ЮЗБ. В голове каша.
3. Что должно обрабатываться по прерываниях?
aaarrr
Цитата(Zliva @ Sep 24 2009, 01:00) *
1. Чем просматривать пакеты со стороны хоста?

Каким-нибудь сниффером. Я, например, использую snoopypro. Одно но - пакеты можно просмотреть только если устройство успешно энумерировано.

Цитата(Zliva @ Sep 24 2009, 01:00) *
2. Набросайте последовательность инициализации устройства, что зачем должно идти, или скажите, где можно прочитать. Не могу никак въехать в
саму иерархию ЮЗБ. В голове каша.

Последовательность инициализации UDP, или последовательность запросов/ответов при подключении?

Цитата(Zliva @ Sep 24 2009, 01:00) *
3. Что должно обрабатываться по прерываниях?

Логично обслуживать нулевую точку и ENDBUSRES, т.к. оно не отключается. Остальное - по желанию.
Zliva
Цитата(aaarrr @ Sep 24 2009, 00:21) *
Каким-нибудь сниффером. Я, например, использую snoopypro. Одно но - пакеты можно просмотреть только если устройство успешно энумерировано.
Последовательность инициализации UDP, или последовательность запросов/ответов при подключении?

Последовательность инициализации UDP
aaarrr
Последовательность примерно такая:

1. Включаем тактирование UDP:
Код
    AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
    AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_UDP;

2. Сбрасываем GLBSTATE.
3. Инициализируем и разрешаем прерывание UDP.
4. Включаем pull-up, если он управляется.
5. Ждем прерывания ENDBUSRES, по нему:
  • Разрешаем EP0.
  • Разрешаем прерывания, если нужно.
  • Разрешаем трансивер (сбрасываем TXVDIS в UDP_TXVC).

6. После этих нехитрых действий получаем первый SETUP от хоста.
Zliva
Спасибо. Буду дерзать дальше. Думал будет попроще. Все таки я его добью. Боюсь что контролер не выдержит после такого издевательства перезаписью.
aaarrr
Цитата(Zliva @ Sep 24 2009, 01:56) *
Боюсь что контролер не выдержит после такого издевательства перезаписью.

Выдержит-выдержит - 10K выбрать не так уж просто, быстрее спалите его как-нибудь еще smile.gif
Zliva
Это запросто. Уже третья неделя пошла. А все на месте танцую. Кстати, в прошлую субботу вызвал научный руководитель, и сказа «покажи, что есть», не знал что делать. Взял Поверграф (классная отечественная разработка) Подключил к звуковухе и запитал датчик ускорения от платы с АРМом. Запусил установку. Когда побежали данные, думал он упадет от радости. Жалко что Поверграф демка. А так вобщем супер получилось.
sigmaN
Извините меня, пожалуйста, что я, не будучи знаком, позволяю себе вмешаться, но предмет вашей ученой беседы настолько интересен smile.gif
Собственно, увидал несколько кусков кода.... Из самых добрых побуждений советую Вам ознакомиться с http://www.opita.net/node/40
Лучше привыкать сразу, чем потом переучиваться.
Zliva
Цитата(aaarrr @ Sep 24 2009, 00:45) *
Последовательность примерно такая:.

Вот что написал:
CODE

void LowLevelInit(void)
{
unsigned char i;

// Set flash wait states in the EFC
// 48MHz = 1 wait state

AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;

// Отключаем Watchdog
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

// Инициализируем main oscillator //------0x40
AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x0F << 8)) | AT91C_CKGR_MOSCEN);

// Ждем пока Main Oscillator стабилизируется
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

// Инициализируем PLL на 96MHz (96.109) и USB на 48MHz
AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 | // На выходе делителя выходной сигнал ФАПЧ, деленный на 2 = 48MHz.
AT91C_CKGR_OUT_0 | // Диапазон тактовых частот ФАПЧ.
(16 << 8) | // Счетчик ФАПЧ. Определяет число тактов сигнала SLCK,
//через которое устанавливается LOCK бит регистра PMC_SR, после записи регистра CKGR_PLLR
(AT91C_CKGR_MUL & (72 << 16)) | // Умножитель ФАПЧ.
(AT91C_CKGR_DIV & 14); // Параметр - делитель.

while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); // ФАПЧ зафиксирована?
// Проверка состояния главного синхронизирующего сигнала MCK. Сигнал MCK готов?
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

// Предделитель основного синхронизирующего сигнала
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
// Проверка состояния главного синхронизирующего сигнала MCK. Сигнал MCK готов?
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

// Выбираем источник основного синхронизирующего сигнала - сигнал PLLCK
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
// Проверка состояния главного синхронизирующего сигнала MCK. Сигнал MCK готов?
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

// Инициализируем AIC
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; //Запрещаем все прерывания
AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler;
for (i = 1; i < 31; i++) {
AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler;
}

AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler; //случайные прерывания

for (i = 0; i < 8 ; i++) {
/*Регистр окончания прерывания используется процедурой обработки прерывания
для обозначения окончания обработки прерывания. Можно записать любое
значение, так как требуется только произвести запись в этот регистр для
сигнализации окончания обработки прерывания.*/
AT91C_BASE_AIC->AIC_EOICR = 0;
}

// Инициализируем регистр управления отладки - Debug
AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT;

// Remap the internal SRAM at 0x0
BOARD_RemapRam(); //?

// Disable RTT and PIT interrupts (potential problem when program A //?
// configures RTT, then program B wants to use PIT only, interrupts //?
// from the RTT will still occur since they both use AT91C_ID_SYS) //?
AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN); //?
AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; //?
}


//==============================================================================
//---Блок обработки прерываний от i-ой конечной точки---------------------------
void USB_EP_INT()
{
if ( !(AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP) )
return;
TRACE_INFO_WP("AT91C_UDP_RXSETUP\n\r");
//---Обработка управляющего пакета----------------------------------------------
}
//------------------------------------------------------------------------------
/// Handles interrupts coming from USART #0.
//------------------------------------------------------------------------------
void USB_InterruptHandler(void){
unsigned int status;
// int eptnum = 0;
status = AT91C_BASE_UDP->UDP_ISR; // Читаем статус прерывания UDP
status &= AT91C_BASE_UDP->UDP_IMR; // Регистр маски прерываний UDP

/* switch (status & 4) //выбор конечной точки, которая вызвала прерывание
{
case AT91C_UDP_EPINT0: {i = 0; USB_EP_INT(); break;}
case AT91C_UDP_EPINT1: {i = 1; USB_EP_INT(); break;}
case AT91C_UDP_EPINT2: {i = 2; USB_EP_INT(); break;}
case AT91C_UDP_EPINT3: {i = 3; USB_EP_INT(); break;}
}*/

if (status == 0) {
return;
}

if ((status & AT91C_UDP_ENDBUSRES) != 0) {
//---Конфигурация USB при сбросе шины
TRACE_INFO_WP("____ENDBUSRES___%u_\n\r",status);

// The device enters the Default state
USB_Device_State = USBD_STATE_DEFAULT;
// Разрешаем работу трансивера битом TXVDIS установленным в нулю
//AT91C_BASE_UDP->UDP_TXVC &= ~AT91C_UDP_TXVDIS;

// Активизируем функциональную конечную точку, для получения первого пакета
AT91C_BASE_UDP -> UDP_FADDR = AT91C_UDP_FEN;
// Сбрасываем конечные точки UDP
AT91C_BASE_UDP -> UDP_RSTEP = (unsigned int)-1;
AT91C_BASE_UDP -> UDP_RSTEP = 0;
// Сброс всех прерываний
AT91C_BASE_UDP -> UDP_ICR = (unsigned int)-1;
// Разрешаем прерывания от 0 конечной точки
AT91C_BASE_UDP -> UDP_IER = AT91C_UDP_EPINT0;

AT91C_BASE_UDP -> UDP_CSR[AT91C_UDP_EP0] =
( AT91C_UDP_EPEDS | // Включаем 0 конечную точку
AT91C_UDP_EPTYPE_CTRL //
);
TRACE_INFO_WP("____ENDBUSRES_ee__\n\r");
// сброс прерывания по окончанию сброса шины
AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_ENDBUSRES;
}

if (AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP ){

TRACE_INFO_WP("AT91C_UDP_RXSETUP\n\r"); return;}

}

void USB_Init(void)
{

USB_Device_State = 0;
// External pull-up on D+
// Configure
AT91C_BASE_PMC ->PMC_PCER = 1UL << AT91C_ID_PIOA; // AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PULLUP);
AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25; // Set in PIO mode
AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25; // Configure in Output


AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP; //Enables the 48MHz USB clock.
AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_UDP; // Enables the clock of the UDP peripheral.


// Отключаем все прерывания UDP кроме EP0INT - конечной точки 0
AT91C_BASE_UDP->UDP_IDR = 0xFE;
//Разрешаем прерывания по активизации шины UDP
AT91C_BASE_UDP->UDP_IER = AT91C_UDP_WAKEUP;


TRACE_INFO_WP("USB_Init\n\r");

// Configure interrupts
AIC_ConfigureIT(AT91C_ID_UDP, 8, USB_InterruptHandler);
AIC_EnableIT(AT91C_ID_UDP);
TRACE_INFO_WP("END\n\r");
}


void wait ( void )
{//* Begin
unsigned int waiting_time ;
for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ;
}//* End

//------------------------------------------------------------------------------
// Main
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initializes drivers and start the USB <-> Serial bridge.
//------------------------------------------------------------------------------
int main()
{
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
// If they are present, configure Vbus & Wake-up pins
TRACE_DEBUG("init=CDCDSerialDriver_Initialize()\n\r");

// Enable User Reset and set its minimal assertion to 960 us
AT91C_BASE_RSTC->RSTC_RMR =
AT91C_RSTC_URSTEN | // разрешить сброс по выводу NRST
(0x4<<8) | // длительность выходного сигнала сброса на выводе NRST
(unsigned int)(0xA5<<24);// пароль

// BOT driver initialization
CDCDSerialDriver_Initialize();

// USBD_Init();
USB_Init();
// connect if needed
// VBUS_CONFIGURE();

// Driver loop

while (1) {

LED_Set(18);
wait();
LED_Clear(18);
LED_Set(17);
wait();
LED_Clear(17);
wait();

}
}

Как получить прерывания ЕР0 не пойму. Смотрел немного сюда. Плавно перешел на IAR. Помогите чем можете.
aaarrr
Включение pull-up'а:
Код
AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA25; // Set in PIO mode
AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA25; // Configure in Output

На выводе '0' - это то что нужно?

USB_Init:
Код
// Отключаем все прерывания UDP кроме EP0INT - конечной точки 0
AT91C_BASE_UDP->UDP_IDR = 0xFE;
//Разрешаем прерывания по активизации шины UDP
AT91C_BASE_UDP->UDP_IER = AT91C_UDP_WAKEUP;

Совершенно лишние действия - неминуемый Bus Reset все это сбросит.

USB_InterruptHandler:
Код
// Сбрасываем конечные точки UDP
AT91C_BASE_UDP -> UDP_RSTEP = (unsigned int)-1;
AT91C_BASE_UDP -> UDP_RSTEP = 0;
// Сброс всех прерываний
AT91C_BASE_UDP -> UDP_ICR = (unsigned int)-1;

Тоже излишне - все и так будет сброшено.

Получить вы должны прежде всего ENDBUSRES (и, возможно, не один), только после этого будет SETUP.
Zliva
Получил первый запрос, обработал и отправил дескриптор. Кажись пошло. Какие танцы дальше?
Основной вопросы на повестке, какой *.sys драйвер выбрать?
Usbser.sys мне не очень нравится, может кто посоветует что-то другое?
Кто какими пользуется?
С другой стороны, нужно передавать данные на комп большого размера, что посоветуете?
Как построить сам принцип?
Насчет скорости – чем по быстрее, тем лучше. Заметил, что когда я юзал звуковуху с датчиком ускорения, я получил мах частоту считывания сигнала 96кГц, но когда я подключил энкодер, получилась фигня, то есть частоты дискретизации 96кГц недостаточно. Нужно ловить переходные процессы, а поскольку это колебательная система, трудно получается с интерполяцией сигнала, так как там присутствуют высокочастотные составляющие.
Раздумываю на счет масстореджа, загоняю данные во флеш, а потом читаю весь массив данных неспеша. Что скажете? Честно говоря – разбираться и разбираться еще. А время идет, боюсь не успею. Так что направьте ПОЖАЛУЙСТА в правильное русло.
И еще, народ как то добился такого результата. Что скажете?
aaarrr
usbser вам скорее всего не подойдет по причине его неторопливости; mass storage - во первых, здесь как жучке пятая нога, а во-вторых, с ним завязните еще на полгода.

Поэтому мой совет: возьмите для начала готовый универсальный драйвер. Здесь, например, драйвер с документацией и примерами от Cypress. Или поищите USBDevStudio_1031.exe - там еще терминалка была, но на сайте сейчас этого файла что-то нет.
Достаточно перепилить VID/PID в устройстве или inf-файле и можно использовать.

Цитата(Zliva @ Oct 16 2009, 01:14) *
И еще, народ как то добился такого результата. Что скажете?

Какого "такого"? Ничего из ряда вон выходящего я не вижу.
Zliva
Цитата(aaarrr @ Oct 16 2009, 00:53) *
Какого "такого"? Ничего из ряда вон выходящего я не вижу.

В принципе особенного ничего нет. Но такие параметры – хватило бы мне выше крыши.
USB 1.1 АЦП: 14 бит, 200 кГц, 16 диф. каналов или 32 с общ. <землей> , процессор ARM AT90SAM7S256 (48 МГц)
Здесь лежит исходник IARa для E14-140-M. Кто не будь юзал его?
aaarrr
Допилите лучше свое.
Zliva
Цитата(aaarrr @ Oct 16 2009, 00:53) *
поищите USBDevStudio_1031.exe - там еще терминалка была....

Вы имели виду программу CyConsole?
aaarrr
Цитата(Zliva @ Oct 17 2009, 02:04) *
Вы имели виду программу CyConsole?

Да. Иногда бывает удобна.
Zliva
Верно ли я понял: нужно переписать дескрипторы, и подцепить драйвер.
То есть, выбираю дескрипторы с пометкой FullSpeedConfigDscr, и в принципе дальше писать и читать? Или есть еще какие-то подводные камни? Все конечные точки нужно делать типа BULK?
aaarrr
Цитата(Zliva @ Oct 17 2009, 23:12) *
Верно ли я понял: нужно переписать дескрипторы, и подцепить драйвер.

Достаточно поменять VID и PID в Device Descriptor. Или наоборот - добавить свою пару VID/PID в inf-файле драйвера.

Цитата(Zliva @ Oct 17 2009, 23:12) *
Или есть еще какие-то подводные камни? Все конечные точки нужно делать типа BULK?

Камней нет, работает он не только с bulk'ом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.