реклама на сайте
подробности

 
 
> USB CDC (AT91SAM7S64) не работает
abit
сообщение Sep 16 2011, 19:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Sep 19 2011, 16:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



ОК. Подождем, когда код заточится, но на AMD работать не будет sad.gif


--------------------
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 19 2011, 19:03
Сообщение #3


Участник
*

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



Цитата(prottoss @ Sep 19 2011, 20:48) *
ОК. Подождем, когда код заточится, но на AMD работать не будет sad.gif

в моем случае я так понимаю нет никакого 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 19 2011, 20:37
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(abit @ Sep 19 2011, 23:03) *
возникает вопрос можно ли просто в тупую добавить store_int и disable_int в начале всей этой функции и set_interrupt_statу в конец, опоясов всю эту функцию, решив тем самым обе проблемы сразу?

Можно, если не смущает время запрещения прерываний.

На самом деле, макрос или инлайн, выполненный со всеми возможными предосторожностями - это все-таки некоторый костыль. По-хорошему, нужно в каждом конкретном случае решать, запрещать ли прерывания, дожидаться ли установки/сброса битов в CRS (а это не всегда необходимо) и т.п. Хотя оверхед костыля в любом случае небольшой.
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 20 2011, 11:13
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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'... и тишина sad.gif

prottoss
если дело в том, о чём Вы говорили...
чем-то другим пользоваться вместо usbser.sys? и есть ли какие-то официальные признания этой ошибки? мне чтобы снять вину со своей программы... к тому же под удивление на Linux таки это заработало через CDC-ACM...

Сообщение отредактировал abit - Sep 20 2011, 11:22
Go to the top of the page
 
+Quote Post
taoga
сообщение Sep 21 2011, 17:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809



Попробуйте код отсюда, может поможет?
http://electronix.ru/forum/index.php?showt...89&hl=taoga
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016