Здраствуйте, у меня вопрос касательно USB модуля микропроцессора 1886ВЕ4У.
Питание микропроцессора осуществляется напряжением 5В от линейного стабилизатора.
Рабочая частота 24 МГц (48 МГц на USB модуль и 1/2 на ядро).
Использовались USB хосты чипсетов Intel ICH5, Intel ICH9R, nForce 4 Ultra, nForce 550.
Устройство тестировалось с универсальными драйверами Jungo WinDriver 9 и Thesycon USBIO 2.45 Demo.
Операционная система Windows XP SP3 PRO.
В устройстве используются 4 конечные точки:
EP1, EP3 - IN, BULK, 64 байта;
EP2, EP4 - OUT, BULK, 64 байта.
Написана небольшая тестовая программа (проект прикреплён)
Разработка ПО ведётся в IDE MPLAB 8.40 (MPASMWIN.exe v5.34, mplink.exe v4.34).
Обмен данными с устройством осуществляется тестовым ПО от производителей драйверов:
USBIO Demo Application(USBIO) и USB Diagnostic Samples(WinDriver).
Теперь суть проблеммы.
Данные принимаются хостом с пайпа 0x81 или 0x83.
При работе на скорости не превышающей 45 Кбайт/с нареканий не возникает.
С увеличением скорости обмен прерывается.
Код ошибки WinDriver'а: 0x20000200 ("Operation failed")
Код ошибки USBIO: 0xE000000C: HC Error: Buffer Overrun
В регистре микроконтроллера USB_ERROR 0x20 (установлен бит TO_ERR).
Аналогичная программа на Си работает без проблем, но скорость обмена составляет примерно 100 Кбайт/с.
Цикл заполнения FIFO EP1:
if(EMPTY1)
{
for(i=0; i<64; i++) EP1_REG = usb_tx_buffer[i];
USB_TX_READY = 0;
}
И его дизассемблер:
77: if(EMPTY1)
0080 B803 MOVLB 0x3
0081 9010 BTFSS 0x10, 0
0082 C092 GOTO 0x92
78: {
79: for(i=0; i<64; i++) EP1_REG = usb_tx_buffer[i];
0083 2924 CLRF 0x24, 0x1
0084 6A24 MOVFP 0x24, 0xa
0085 B160 ADDLW 0x60
0086 0101 MOVWF 0x1
0087 BA30 MOVLR 0x3
0088 6A00 MOVFP 0, 0xa
0089 B802 MOVLB 0x2
008A 0110 MOVWF 0x10
008B BA00 MOVLR 0
008C 1524 INCF 0x24, F
008D B040 MOVLW 0x40
008E 0424 SUBWF 0x24, W
008F 9004 BTFSS 0x4, 0
0090 C084 GOTO 0x84
80: USB_TX_READY = 0;
0091 891E BCF 0x1e, 0x1
81: }
Преимущества ассемблера очевидны. Помогите пожалуйста.
Цитата(mitayd @ Jan 5 2010, 11:12)

Здраствуйте, у меня вопрос касательно USB модуля микропроцессора 1886ВЕ4У.
....
Скорее всего нужно делать так ( взял из исходника функцию передачи хостy по EP4, SIZEEP = 64, Buf - буфер с данными, функцию модифицировал для понятности )
Код
void ReportToDriver()
{ unsigned char i;
EP4_CFG2 |= 0x40; // блокируем
i = 0;
do
{ if (( EP4_STAT & 0x22) == 0)
{ EP4_REG = Buf[ i];
i++;
};
} while( i < SIZEEP);
EP4_CFG2 &= ~0x40; // разблокируем
}
PS.Более подробно о работе USB модуля скорее всего завтра или послезавтра. Там есть тонкости, которые явно не прописаны в документации.
А вообще USB в этом микроконтроллере довольно благородно сделан, мне понравилось.
Спасибо, после праздников попробую, только один момент.
Если заблокировать EP4 (EP4_CFG2 |= 0x40;), то условие
(( EP4_STAT & 0x22) == 0) никогда не выполнится?
Или флаг BLK_Data регистра EPx_STAT устанавливается
только USB модулем, для МП, а бит BLOCK регистра
EPx_CFG2 микропроцессором для USB модуля?
Обязательно-ли нужно блокировать конечную точку
перед анализом регистра EPx_STAT, похоже это
негативно скажется на быстролействии интерфейса?
Сейчас уже четко не помню, делали год назад, но действительно бит BLOCK регистра
EPx_CFG2 относится только к USB модулю. Установка этого бита запрещает в данном случае передачу на время заполнения fifo, иначе передача может быть разорвана на несколько пакетов, причем пакеты будут передаваться в разных фреймах, что приводит к уменьшению общей скорости передачи. Возможно проверку ( EP4_STAT & 0x22) == 0) можно в принципе и не делать при установленном бите BLOCK, но если блокировка не установлена, то именно нужно проверять бит FULL в теле цикла, а не перед ним.
PS. Код, что привел, из исходника первой тестовой программы. Сейчас не могу посмотреть последний вариант. Еще раз повторюсь, USB модуль в данном МК довольно быстрый, сделан просто и очень удобен в применении. Правда заточен под одну задачу и слабо документирован, но можно в Миландре выяснить все вопросы.
-=Sergei=-
Jan 11 2010, 06:16
Цитата(mitayd @ Jan 6 2010, 13:51)

Спасибо, после праздников попробую, только один момент.
Если заблокировать EP4 (EP4_CFG2 |= 0x40;), то условие
(( EP4_STAT & 0x22) == 0) никогда не выполнится?
Или флаг BLK_Data регистра EPx_STAT устанавливается
только USB модулем, для МП, а бит BLOCK регистра
EPx_CFG2 микропроцессором для USB модуля?
Обязательно-ли нужно блокировать конечную точку
перед анализом регистра EPx_STAT, похоже это
негативно скажется на быстролействии интерфейса?
Предлагаю задать ваш, вопрос на форуме технической поддержки Миландра
http://forum.milandr.ru/index.php
mitayd
Jan 11 2010, 12:42
Добавил проверку флага BLK_data регистра EPx_STAT и
блокировку коенечной точки перед чтением (записью) FIFO.
Заработало стабильно, большое Спасибо за помощь.
Получил интересные показатели скорости:
Одна EP IN - 159030 байт/c;
Две EP IN - 190848 байт/с;
Две EP IN и OUT - 286720 байт/с;
Три EP 2 IN и OUT - 252864 байт/с;
Три EP IN и 2 OUT - 240256 байт/с;
Четыре EP 2 IN и 2 OUT - 214080 байт/с;
Имеется в виду скорость передачи данных хосту.
-=Sergei=-
Jan 11 2010, 13:03
Цитата(mitayd @ Jan 11 2010, 15:42)

Добавил проверку флага BLK_data регистра EPx_STAT и
блокировку коенечной точки перед чтением (записью) FIFO.
Заработало стабильно, большое Спасибо за помощь.
Получил интересные показатели скорости:
Одна EP IN - 159030 байт/c;
Две EP IN - 190848 байт/с;
Две EP IN и OUT - 286720 байт/с;
Три EP 2 IN и OUT - 252864 байт/с;
Три EP IN и 2 OUT - 240256 байт/с;
Четыре EP 2 IN и 2 OUT - 214080 байт/с;
Поиграйтесь настройками драйвера USBIO, размерами буферов, числом буферов, я выжимал из ВЕ3 чистые 900-1000 кБайт/сек. Так же можно ускорить загрузку/выгрузку FIFO в самом микроконтроллере за счет "размножения" команд чтения или записи регистров данных. т.е. читать их не в цикле, а например считать число данных в FIFO и если оно больше чем например 32, то считать последовательностью из 32 команд без анализа флагов и тп.
mitayd
Jan 12 2010, 14:41
Повторил Ваш результат, -=Sergei=-. Очень честный микроконтроллер. Большое, Спасибо.
Подскажите какой алгоритм отладки с 1886ВЕ4У пишут что ядро совместимо PIC17C756.
Возможно ли подцепиться скажем ICD2 и отлаживаться?
ааа помойму понял после прочтения Спецификации по программированию и тестированию внутренней памяти программ микроконтроллеров
есть только ISP а отладку можно вести с помощью Аппаратного эмулятора микроконтроллера 1886ВЕ3У(4У)
Кстати сколько последний стоит? а может быть возможно отлаживаться на каком то PICе и с минимальными изменениями перенести в "ВЕЗУ"
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.