Перейти к содержанию
    

at91sam7x256 USB+IAR5.4

Добрый день!

 

Процессор AT91SAM7X256.

Работаю в IAR 5.4 с примером “usb-device-cdc-serial-project”. В примере запрещены прерывания от таймера и UARTа до момента установки переменной ‘isSerialConnected’. Я добавил таймер Т2 с обработчиком прерываний, таймер запускаю сразу не дожидаясь установки переменной ‘isSerialConnected’. После подключения к USB программа виснет в файле ‘USBD_UDP.c’ в функции ‘USBD_Write(…)’ в строке ‘SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY);’.

Возникает вопросы:

1.Неужели нельзя использовать прерывания при работе с USB?

2.Использую пример из IAR (без добавления таймера T2). При передачи пакета в USB длинной 63 байта и менее все работает, но если послать пакет длинной 64 байта, то в терминалке ничего не отображается. Может проблема в драйвере windows (специального драйвера не ставил)?

3. Какую максимальную скорость удалось получить при передачи в одну сторону?

4. Есть ли другие рабочие примеры работы CDC для SAM7?

 

 

Заранее благодарю, Сергей.

Изменено пользователем SergeySpbRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1.Неужели нельзя использовать прерывания при работе с USB?

Другие прерывания можно. Прерывания от Endpoint'ов UDP тоже можно, но в большинстве случаев не нужно.

Макросы типа SET_CSR у Атмела сделаны абсолютно неграмотно, поэтому и виснет.

 

2.Использую пример из IAR (без добавления таймера T2). При передачи пакета в USB длинной 63 байта и менее все работает, но если послать пакет длинной 64 байта, то в терминалке ничего не отображается. Может проблема в драйвере windows (специального драйвера не ставил)?

Тоже атмеловская ошибка - если размер передачи кратен размеру буфера Endpoint'а, в конце должен передаваться пакет нулевой длины.

 

3. Какую максимальную скорость удалось получить при передачи в одну сторону?

Под XP SP2 от хоста к устройству более 500 кбайт/с, от устройства к хосту - 128 кбайт/с, если память мне не изменяет.

 

4. Есть ли другие рабочие примеры работы CDC для SAM7?

Лучше разобраться и написать самостоятельно - это меньше тысячи строк кода на все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за ответы!!

Другие прерывания можно. Прерывания от Endpoint'ов UDP тоже можно, но в большинстве случаев не нужно.

Макросы типа SET_CSR у Атмела сделаны абсолютно неграмотно, поэтому и виснет.

Поправил, все заработало.

>Тоже атмеловская ошибка - если размер передачи кратен размеру буфера Endpoint'а, в конце должен передаваться пакет нулевой длины.

Т.е. после передачи моего пакета максимальной длинны я должен послать следующий пакет длинной 0?

>Под XP SP2 от хоста к устройству более 500 кбайт/с, от устройства к хосту - 128 кбайт/с, если память мне не изменяет.

Для того чтобы получить большую скорость надо писать свой драйвер, или как я прочитал, можно взять из DDK XP?

Лучше разобраться и написать самостоятельно - это меньше тысячи строк кода на все.

С этим согласен, но пока надо понять насколько сложно получить скорость от устройства к хосту ~ 1 Мбайт/с, какие трудозатраты.

Посоветуйте утилитку, которая позволит мониторить трафик на PC.

Изменено пользователем SergeySpbRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. после передачи моего пакета максимальной длинны я должен послать следующий пакет длинной 0?

Да, если это последний пакет.

 

Для того чтобы получить большую скорость надо писать свой драйвер, или как я прочитал, можно взять из DDK XP?

 

...пока надо понять насколько сложно получить скорость от устройства к хосту ~ 1 Мбайт/с, какие трудозатраты.

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

 

Посоветуйте утилитку, которая позволит мониторить трафик на PC.

Я иногда пользуюсь snoopypro.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

От какого рабочего примера лучше стартовать (желательно с исходниками драйвера)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже атмеловская ошибка - если размер передачи кратен размеру буфера Endpoint'а, в конце должен передаваться пакет нулевой длины.

У меня такая же проблема с атмеловским USB CDC, но при приёме. Если входящий пакет размером = размеру буфера Endpoint, окончание приёма не детектируется.

Может быть знаете решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня такая же проблема с атмеловским USB CDC, но при приёме. Если входящий пакет размером = размеру буфера Endpoint, окончание приёма не детектируется.

Может быть знаете решение?

Увы, по атмеловским примерам я знаю только одно решение - переписать все как следует самому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...