|
USB CDC (AT91SAM7S64) не работает |
|
|
|
Sep 16 2011, 19:36
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Здравствуйте... Существует следующая проблема - сделал устройство на основе отладочного Evalution Kit AT91SAM7S64, внутрисхемный отладчик IAR входил в комплект и работал только со старой версией IAR 4.22 (вроде), что была на диске с Kitом, другими (старшими) версиями не определялся этот отладчик cegger IAR, а также никакие программы от более поздних версий не компилировались из-за разницы в библиотеках... фактически - был найдет проект USB-UART, который компилировался под IAR 4.22 (но опять же с версией могу ошибиться) - плата определялась как CDC устройство... либо как класс модема, либо как usb-класс... был выбран первый случай, т.к. в этом варианте ей присваивался виртуальный COM-порт типа COM26, но хотя бы в реестре можно вынудить этот номер порта и спокойно общаться, как с обычным com-портом... и все бы хорошо... но... У заказчика 12 компов, купленных кучей... с материнской платой GA-K8NF-9, там атлон, крякнутая винда, антивир и куча неприятностей... на нем происходит следующая картина - AT91SAM7S64 принимает сколько угодно от компа, но когда отправляет всего 1 посылку Write(&pCDC,data,leng);, далее по диодикам понятно - что он работает как надо, но в компьютер кроме первой посылки ничего больше не доходит... я испробовал кучу компов на своем предприятии - со всеми работает, включая на основе Itanium, CoreQuard и Xeon - все работает... атлонов у нас вообще нет((( но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет... Что это может быть? Может кто-нибудь сталкивался с подобным? Огромное спасибо за ответ, ибо мне на душе тоскливо... я попытался уже из под линукса даже на их компьютере это запускать...
Сообщение отредактировал abit - Sep 16 2011, 19:44
|
|
|
|
|
 |
Ответов
|
Sep 19 2011, 19:03
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Цитата(prottoss @ Sep 19 2011, 20:48)  ОК. Подождем, когда код заточится, но на AMD работать не будет  в моем случае я так понимаю нет никакого SAM-BA, я же прошиваю через IAR... aaarrrОгромное спасибо!!! Хотя всё опять же по моей вине не так как надо... реально там другой код ))) я опять таки взял не от той версии BasicUSB... я уже запутался в них... при том тот же файл cdc_enumerate.с в каждой новой версии такие радикальный изменения переживает... не сиделось им прям... фактически как обернуть я понял, могу применить и к этому... только в той версии что у меня сейчас - нет разбиения на эти inline... все процедуры уже такие массивные, вот пример одной из записей: Код static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length) { AT91PS_UDP pUdp = pCdc->pUdp; uint cpt = 0;
// Send the first packet cpt = MIN(length, AT91C_EP_IN_SIZE); length -= cpt; while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++; pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
while (length) { // Fill the second bank cpt = MIN(length, AT91C_EP_IN_SIZE); length -= cpt; while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++; // Wait for the the first bank to be sent while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ) if ( !AT91F_UDP_IsConfigured(pCdc) ) return length; pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP); while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP); pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY; } // Wait for the end of transfer while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ) if ( !AT91F_UDP_IsConfigured(pCdc) ) return length; pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP); while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
return length; } возникает вопрос можно ли просто в тупую добавить store_int и disable_int в начале всей этой функции и set_interrupt_statу в конец, опоясов всю эту функцию, решив тем самым обе проблемы сразу? аналогично повесить на остальные функции - записи управляющей endpoint, конфигурирования.... или городить таки у каждого изменения CSR? извиняюсь заранее, потому что понимаю что вопрос глупый и даже подозреваю на него ответ и даже проверить просто... но... вот проверить мне тут неначем - результаты только завтра узнаем (
Сообщение отредактировал abit - Sep 19 2011, 19:10
|
|
|
|
|
Sep 19 2011, 20:37
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(abit @ Sep 19 2011, 23:03)  возникает вопрос можно ли просто в тупую добавить store_int и disable_int в начале всей этой функции и set_interrupt_statу в конец, опоясов всю эту функцию, решив тем самым обе проблемы сразу? Можно, если не смущает время запрещения прерываний. На самом деле, макрос или инлайн, выполненный со всеми возможными предосторожностями - это все-таки некоторый костыль. По-хорошему, нужно в каждом конкретном случае решать, запрещать ли прерывания, дожидаться ли установки/сброса битов в CRS (а это не всегда необходимо) и т.п. Хотя оверхед костыля в любом случае небольшой.
|
|
|
|
|
Sep 20 2011, 11:13
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426

|
Цитата(aaarrr @ Sep 20 2011, 00:37)  Можно, если не смущает время запрещения прерываний.
На самом деле, макрос или инлайн, выполненный со всеми возможными предосторожностями - это все-таки некоторый костыль. По-хорошему, нужно в каждом конкретном случае решать, запрещать ли прерывания, дожидаться ли установки/сброса битов в CRS (а это не всегда необходимо) и т.п. Хотя оверхед костыля в любом случае небольшой. Все попытки провалились что внутри процедуры.... вплоть до такого: Код __disable_interrupt; while 1 do {CDC.Write(&pCDC,'1',1)} на наших компах вываливает в порт '11111.....' на этом - '1'... и тишина prottossесли дело в том, о чём Вы говорили... чем-то другим пользоваться вместо usbser.sys? и есть ли какие-то официальные признания этой ошибки? мне чтобы снять вину со своей программы... к тому же под удивление на Linux таки это заработало через CDC-ACM...
Сообщение отредактировал abit - Sep 20 2011, 11:22
|
|
|
|
Сообщений в этой теме
abit USB CDC (AT91SAM7S64) не работает Sep 16 2011, 19:36 prottoss Покажите дескриптор устройства Sep 17 2011, 04:04 kovigor Цитата(abit @ Sep 16 2011, 22:36) Огромно... Sep 17 2011, 10:08 Sergey Reva Было такое, решилось. Посмотрите как в вашем проек... Sep 17 2011, 14:46 Andrey Vasilyev Цитата(abit @ Sep 16 2011, 23:36) но они ... Sep 17 2011, 14:48 abit prottoss
взят из старого проекта Usart-USB 1.0/Bas... Sep 19 2011, 10:01 aaarrr Цитата(abit @ Sep 19 2011, 14:01) Речь ид... Sep 19 2011, 14:11 prottoss Цитата(abit @ Sep 19 2011, 16:01) prottos... Sep 19 2011, 15:09 Sergey Reva http://www.atmel.com/dyn/resources/prod_do...nts/d... Sep 19 2011, 13:51 abit Sergey Reva, aaarrr
Спасибо за некоторые пояснения... Sep 19 2011, 16:20 abit Sergey Reva, aaarrr
Спасибо за некоторые пояснения... Sep 19 2011, 16:41 aaarrr Замените пока работу с флагами на корректный вариа... Sep 19 2011, 16:34 aaarrr 1. См. выше.
2. В примере профукано. Запрещение/ра... Sep 19 2011, 16:47 abit Цитата(aaarrr @ Sep 19 2011, 20:47) 1. См... Sep 19 2011, 16:57    prottoss Цитата(abit @ Sep 20 2011, 17:13) prottos... Sep 20 2011, 13:05 aaarrr Там стоит запрос состояния->запрет->восстано... Sep 19 2011, 17:02 shrek Посмотри по ссылке.
http://electronix.ru/forum/ind... Sep 20 2011, 12:02 shrek Менял в своем проекте USB_CDC направление по BULK ... Sep 21 2011, 06:28 abit Всем спасибо)
Проблема таки решена после недели му... Sep 22 2011, 09:54 prottoss Цитата(abit @ Sep 22 2011, 15:54) Не рабо... Sep 22 2011, 10:36 MrAlex Цитата(abit @ Sep 22 2011, 13:54) решаетс... Sep 23 2011, 07:05 sergeeff А ведь стандарт USB CDC изначально определяет три ... Sep 22 2011, 10:02 shrek Цитатарешается так:
в файле cdc_enumerate.c
наход... Sep 23 2011, 06:36 abit shrek
получается интелу по барабану... кстати в сп... Sep 23 2011, 10:13 shrek abit
Цитатада, старая 2005-2007 года.... собстна т... Sep 23 2011, 10:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|