Есть задача запихать в комп поток порядка 4МБит, поэтому LUFA с её опросом по кольцу (superloop) не нравится. К тому же - _подавляющее_ большинство использовало так или иначе готовые примеры на HID/CDC/Massstorage, а потому подсказать ничего не могут.
Не кварц или тактирование, потому что залитые демки работают.
Главная проблема, с которой столкнулся - не ловлю прерывание по приёму пакета SETUP, источник UEINTX.RXSTPI, прерывание в
UEIENX.RXSTPE разрешено, глобальные
sei() - тоже.
Сделал хоть какое-то подобие отладчика - вывод информации через UART. Но это не помогло найти проблему.
По прерывания суммарно - попадаю в обработчик устройства USB General Interrupt при сбросе устройства хостом, в USB Endpoint Interrupt _только_ по UEINTX.TXINI.
Логически анализатор показывает, что хост пытается передать запрос на дескриптор, но МК его не ощущает.
То есть хост пытается запросить дескриптор. А где же, блин, пакет SETUP ?
Раздел USB даташита скоро наизусть знать буду (две опечатки нашел), USB Nutshell+перевод весь излазил, спецификацию тоже читал. Ещё: должно, по идее, прилететь тело запроса дескриптора, но где его читать? Счётчик байт в буфере UESTA0X всегда 0. Номер конечной точки пока вообще не переключал. Дамы и господа - выручайте, уже никаких идей.
Код (ниже) привожу весь. В самом низу - отчёт логического анализатора.
"Отладчик" выдаёт следующее: R 08: 21 00 00: 00 18 00: 00 18 00: 00 18 00: 00 18 00: 00 18 00
Не пинайте за
R 08 - рядом за комментарием строка со всеми разрешёнными прерываниями.
R - сброс прошёл, USB не инициализировано.
08 - регистр UEIENX перед sei()
: 21 00 00 - UECONX и, копируемые в прерывании UDINT и UEINTX. UECONX.STALLRQ -
Cleared by hardware when a new SETUP is received.: 00 18 00 - то же самое.
* - не печатается, в обработчик ENDPOINT-ов не попадаем.
CODE
/*
* USB_sample.c
*
* Created: 20.01.2014 10:31:24
* Author: t.oleg
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#define waitTXR while(!( UCSR1A & (1<<UDRE1))){;}
#define LED_ON PORTD &= ~(1<<4)
#define LED_OFF PORTD |= 1<<4
volatile uint8_t tmpreg1=0;
volatile uint8_t tmpreg2=0;
static inline void init_EP( const uint8_t EPN, const uint8_t UECFG0, const uint8_t UECFG1 );
static inline void conf_int_EP(const uint8_t EPN, const uint8_t INTMASK);
static void hexecho1 (uint8_t byte)
{
while (!( UCSR1A & (1<<UDRE1)))
{;}
UDR1 = ' ';
while (!( UCSR1A & (1<<UDRE1)))
{;}
if ((byte >> 4) < 0x0A)
{
UDR1 = (byte >> 4) + 0x30;
}
else
{
UDR1 = (byte >> 4) + 0x37;
}
while (!( UCSR1A & (1<<UDRE1)))
{;}
if ((byte & 0x0F) < 0x0A)
{
UDR1 = (byte & 0x0F) + 0x30;
}
else
{
UDR1 = (byte & 0x0F) + 0x37;
}
}
void USART_Init( const unsigned int baud )
{
/* Set baud rate*/
UBRR1H = (unsigned char)(baud>>8);
UBRR1L = (unsigned char)baud;
#define USE_2X 1
#if USE_2X
UCSR1A |= (1 << U2X1);
#else
UCSR1A &= ~(1 << U2X1);
#endif
/* Enable receiver and transmitter*/
UCSR1B = (1<<TXEN1); //|(1<<RXENn);
/* Set frame format: 8data, 2stop bit*/
// use reset values for 8N1 // UCSRnC = (1<<USBSn)|(3<<UCSZn0);
}
void setupHW(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);
wdt_disable();
clock_prescale_set(clock_div_1); // так тактовая = частота кварца
DDRD |= 1<< 4;
DDRB |= 1<<PB7|1<<PB6|1<<PB5;
USART_Init( 8 );
}
void USBinit(void)
{
// USB_Init from LUFA
REGCR &= ~(1 << REGDIS); // disable Vreg
// USB_ResetInterface();
PLLCSR = ~(0<<PLLP0|0<<PLLP1|0<<PLLP2);
PLLCSR |= 1<<PLLE;
while (!(PLLCSR & (1<<PLOCK))); // wait PLL LOCK
USBCON = 0x20; //~(1 << USBE )|(1<<FRZCLK);
USBCON |= (1 << USBE);
USBCON &= ~(1<<FRZCLK);
init_EP(0, (uint8_t)~(1<<EPTYPE1|1<<EPTYPE0|1<<EPDIR), 0x00 ); // N0, control, 16 byte
//conf_int_EP(0, 1<<FLERRE|1<<NAKINE|1<<NAKOUTE|1<<RXSTPE|1<<RXOUTE|1<<STALLEDE|1<<TXINE);
conf_int_EP(0, 1<<RXSTPE);
// UEIENX = 1<<FLERRE|1<<NAKINE|1<<NAKOUTE|1<<RXSTPE|1<<RXOUTE|1<<STALLEDE|1<<TXINE;
// all EP Interrupts for test
UDCON &= ~(1 << DETACH);
// Init USB by steps, p. 194
// Configure PLL interface
// Enable PLL
// Check PLL lock
// Enable USB interface
// Configure USB interface (USB Endpoint 0 configuration)
// Attach USB device
//UDIEN = 1<<UPRSME|1<<EORSME|1<<WAKEUPE|1<<EORSTE|1<<SOFE|1<<SUSPE; // use all interrupt for start
UDIEN = 1<<UPRSME|1<<EORSME|1<<EORSTE|1<<SOFE; // all, ex. WakeUP and SUSPEND
}
int main(void)
{
setupHW();
UDR1 = 'R';
USBinit();
hexecho1(UEIENX);
sei();
LED_OFF;
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
while(1)
{
//TODO:: Please write your application code
waitTXR;
UDR1 = ':';
hexecho1(UECONX);
hexecho1(tmpreg1);
tmpreg1 = 0;
hexecho1(tmpreg2);
tmpreg2 = 0;
_NOP();
sleep_cpu();
LED_ON;
}
}
ISR(USB_GEN_vect, ISR_BLOCK)
{
static uint8_t cntGEN=0;
// Hardware Interface
cntGEN++;
tmpreg1 = UDINT;
if (UDINT & (1<<EORSTI)) {
// поймали сброс
UDINT &= ~(1<<EORSTI);
UERST |= 1 << 0|1<<1|1<<2|1<<3|1<<4; // reset EP 0
UDADDR = 0;
UDADDR |= 1 << ADDEN;
}
}
ISR(USB_COM_vect, ISR_BLOCK)
{
static uint8_t cntCOM=0;
// Endpoint events
cntCOM++;
tmpreg2 = UEINTX;
if (UEINTX & (1<<TXINI)) {
UEINTX &= ~(1<<TXINI);
}
sei();
waitTXR;
UDR1 = '*';
hexecho1(UECONX);
hexecho1(UESTA0X);
hexecho1(UESTA1X);
}
static void init_EP( const uint8_t EPN, const uint8_t UECFG0, const uint8_t UECFG1 )
{
// Endpoint initialization
// Endpoint activation, fig. 20-2
UENUM = EPN & 0x07; // last 3 bits
// UECONX |= 1<<STALLRQ;
UECONX |= 1<<EPEN|1<<STALLRQ;
UECFG0X = UECFG0 & 0xC3; // [7:6]EPTYPE, [0] EPDIR
UECFG1X = UECFG1 & 0x7E; // - [6:4]EPSIZE2:0, [3:2]EPBK1:0, [1] ALLOC
UECFG1X = 1<<ALLOC; // 16 bytes, one bank, do ALLOCATE
while (!(UESTA0X & (1<<CFGOK))); // wait ready
}
static void conf_int_EP(const uint8_t EPN, const uint8_t INTMASK)
{
// endpoint interrupt configure
UENUM = EPN;
UEIENX = INTMASK & ~(1<<5);
}
Лог (в спойлере становится чёрным):
CODE
Please wait...
USB RESET
11,31ms SOF 288
USB RESET
12,31ms SOF 289
13,31ms SOF 290
14,31ms SOF 291
15,31ms SOF 292
16,31ms SOF 293
17,31ms SOF 294
18,31ms SOF 295
19,31ms SOF 296
USB RESET
20,31ms SOF 297
21,31ms SOF 298
22,31ms SOF 299
23,31ms SOF 300
24,31ms SOF 301
25,31ms SOF 302
26,31ms SOF 303
27,31ms SOF 304
USB RESET
28,31ms SOF 305
29,31ms SOF 306
30,31ms SOF 307
31,31ms SOF 308
32,31ms SOF 309
33,31ms SOF 310
34,31ms SOF 311
35,31ms SOF 312
USB RESET
36,31ms SOF 313
37,31ms SOF 314
37,71ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
37,73ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
37,74ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
38,31ms SOF 315
39,31ms SOF 316
40,31ms SOF 317
41,31ms SOF 318
42,31ms SOF 319
43,31ms SOF 320
USB RESET
44,31ms SOF 321
45,31ms SOF 322
46,31ms SOF 323
47,31ms SOF 324
48,31ms SOF 325
49,31ms SOF 326
50,31ms SOF 327
51,31ms SOF 328
No sync Found
51,32ms SOF 328
USB RESET
---.......-----
451,32ms SOF 728
USB RESET
452,32ms SOF 729
453,32ms SOF 730
454,32ms SOF 731
455,32ms SOF 732
456,32ms SOF 733
457,32ms SOF 734
458,32ms SOF 735
459,32ms SOF 736
USB RESET
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
463,32ms SOF 740
464,32ms SOF 741
465,32ms SOF 742
466,32ms SOF 743
467,32ms SOF 744
USB RESET
---.......---
539,32ms SOF 816
Invalid Token
No sync Found
Invalid Token
USB RESET
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
No sync Found
Invalid Token
542,32ms SOF 819
543,32ms SOF 820
544,32ms SOF 821
545,32ms SOF 822
546,32ms SOF 823
547,32ms SOF 824
USB RESET
548,32ms SOF 825
549,32ms SOF 826
550,32ms SOF 827
551,32ms SOF 828
552,32ms SOF 829
553,32ms SOF 830
USB RESET
565,32ms SOF 842
566,32ms SOF 843
567,32ms SOF 844
568,32ms SOF 845
569,32ms SOF 846
570,32ms SOF 847
571,32ms SOF 848
USB RESET
572,32ms SOF 849
573,32ms SOF 850
574,32ms SOF 851
575,32ms SOF 852
576,32ms SOF 853
577,32ms SOF 854
578,32ms SOF 855
579,32ms SOF 856
USB RESET
580,32ms SOF 857
581,32ms SOF 858
582,32ms SOF 859
583,32ms SOF 860
584,32ms SOF 861
585,32ms SOF 862
586,32ms SOF 863
587,32ms SOF 864
USB RESET
588,32ms SOF 865
589,32ms SOF 866
590,32ms SOF 867
591,32ms SOF 868
592,32ms SOF 869
593,32ms SOF 870
593,72ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
593,74ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
593,75ms SETUP Add: 0 EndPoint: 0 GET DESCRIPTOR DEVICE Length: 64 DATA0 80 06 00 01 00 00 40 00
594,32ms SOF 871
595,32ms SOF 872
USB RESET
Сообщение отредактировал IgorKossak - Feb 7 2014, 16:50
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!