I am trying to enumerate a device using the MAX4321 USB Host but keep getting a toggle error when I request the config descriptor.
After the bus reset I read the first 8 bytes of device descriptor
00016691 USB1: Send Setup Packet 80 06 00 01 00 00 08 00
00016691 MAX : Wr SUDFIFO 8 bytes
00016691 MAX : Wr HIEN A0
00016691 MAX : Wr HXFR <Setup>
00016691 MAX : Rd HIRQ C8
00016691 MAX : Rd HRSL B0
00016691 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL B0 HXFR 10 ACTIVE 80
00016691 MAX : Wr HIRQ 80
00016691 MAX : Wr HIEN 20
00016691 MAX : Wr HIEN A0
00016698 MAX : Wr HXFR <BULK In>
00016698 MAX : Rd HIRQ CC
00016705 MAX : Rd HRSL A0
00016729 MAX : MAX3421E_IntHandler HIRQ CC HIEN A0 HRSL A0 HXFR 00 ACTIVE 80
00016729 MAX : Wr HIRQ 80
00016729 MAX : Wr HIEN 24
00016729 MAX : BULK IN complete
00016733 MAX : Rd HIRQ 4C
00016733 MAX : Rd HRSL A0
00016740 MAX : MAX3421E_IntHandler HIRQ 4C HIEN 24 HRSL A0 HXFR 00 ACTIVE 04
00016747 MAX : Rd RCVBC 08
00016747 MAX : Rd RCVFIFO 8 bytes 12 01 00 02 EF 02 01 40
00016754 MAX : Wr HIRQ 04
00016754 MAX : Wr HIEN 20
00016802 MAX : Wr HIEN A0
00016802 MAX : Wr HXFR <Out Handshake>
00016809 MAX : Rd HIRQ C8
00016816 MAX : Rd HRSL A0
00016823 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A0 HXFR A0 ACTIVE 80
00016830 MAX : Wr HIRQ 80
00016837 MAX : Wr HIEN 20
00016844 MAX : OUT HS complete
Next I set the device address to 1
00016935 USB1: Send Setup Packet 00 05 01 00 00 00 00 00
00016942 MAX : Wr SUDFIFO 8 bytes
00016949 MAX : Wr HIEN A0
00016949 MAX : Wr HXFR <Setup>
00016949 MAX : Rd HIRQ C8
00016956 MAX : Rd HRSL A0
00016956 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A0 HXFR 10 ACTIVE 80
00016963 MAX : Wr HIRQ 80
00016963 MAX : Wr HIEN 20
00016970 MAX : SETUP complete
00016970 MAX : INT Post HCD keyword 0061 status 0000
00016977 MAX : Rd HIRQ 48
00016977 MAX : MAX3421E_IntHandler Exit
00017002 MAX : Wr HIEN A0
00017005 MAX : Wr HXFR <In Handshake>
00017005 MAX : Rd HIRQ C8
00017012 MAX : Rd HRSL A0
00017012 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A0 HXFR 80 ACTIVE 80
00017019 MAX : Wr HIRQ 80
00017026 MAX : Wr HIEN 20
00017026 MAX : IN HS complete
00017075 MAX : Wr HCTL [Receive Toggle 1] [Send Toggle 1]
00017082 MAX : Wr PERADDR 01
Next I receive the full device descriptor from address 1
00017137 USB1: Send Setup Packet 80 06 00 01 00 00 12 00
00017138 MAX : Wr SUDFIFO 8 bytes
00017145 MAX : Wr HIEN A0
00017145 MAX : Wr HXFR <Setup>
00017145 MAX : Rd HIRQ C8
00017152 MAX : Rd HRSL B0
00017152 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL B0 HXFR 10 ACTIVE 80
00017159 MAX : Wr HIRQ 80
00017166 MAX : Wr HIEN 20
00017166 MAX : SETUP complete
00017173 MAX : Rd HIRQ 48
00017206 MAX : Wr HIEN A0
00017206 MAX : Wr HXFR <BULK In>
00017206 USB1: usb_hstd_interrupt exit
00017206 MAX : Rd HIRQ CC
00017208 MAX : Rd HRSL A0
00017208 MAX : MAX3421E_IntHandler HIRQ CC HIEN A0 HRSL A0 HXFR 00 ACTIVE 80
00017215 MAX : Wr HIRQ 80
00017215 MAX : Wr HIEN 24
00017222 MAX : BULK IN complete
00017229 MAX : MAX3421E_IntHandler Exit
00017229 MAX : Rd HIRQ 4C
00017236 MAX : Rd HRSL A0
00017236 MAX : MAX3421E_IntHandler HIRQ 4C HIEN 24 HRSL A0 HXFR 00 ACTIVE 04
00017243 MAX : Rd RCVBC 12
00017243 MAX : Rd RCVFIFO 18 bytes 12 01 00 02 EF 02 01 40
00017250 MAX : Wr HIRQ 04
00017273 MAX : Wr HIEN 20
00017273 MAX : Rd HIRQ 48
00017273 MAX : MAX3421E_IntHandler Exit
00017298 MAX : Wr HIEN A0
00017305 MAX : Wr HXFR <Out Handshake>
00017306 MAX : Rd HIRQ C8
00017312 MAX : Rd HRSL A0
00017313 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A0 HXFR A0 ACTIVE 80
00017319 MAX : Wr HIRQ 80
00017341 MAX : Wr HIEN 20
00017341 MAX : OUT HS complete
But when I try to read the config descriptor I get a toggle error
00017454 USB1: Send Setup Packet 80 06 00 02 00 00 09 00
00017479 MAX : Wr SUDFIFO 8 bytes
00017479 MAX : Wr HIRQ 80
00017479 MAX : Rd HIRQ 48
00017479 MAX : Wr HIEN A0
00017479 MAX : Wr HXFR <Setup>
00017479 MAX : Rd HIRQ C8
00017480 MAX : Rd HRSL A0
00017480 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A0 HXFR 10 ACTIVE 80
00017482 MAX : Wr HIRQ 80
00017489 MAX : Wr HIEN 20
00017489 MAX : SETUP complete
00017489 MAX : INT Post HCD keyword 0061 status 0000
00017496 MAX : Rd HIRQ 48
00017496 USB1: HCD Task 0117 Keyword 0061
00017503 MAX : MAX3421E_IntHandler Exit
00017517 MAX : Wr HIEN A0
00017517 MAX : Wr HXFR <BULK In>
00017524 MAX : Rd HIRQ C8
00017547 MAX : Rd HRSL A6
00017547 MAX : MAX3421E_IntHandler HIRQ C8 HIEN A0 HRSL A6 HXFR 00 ACTIVE 80
00017547 MAX : ERROR Toggle error/ISO over-underrun
Any idea why the toggle error?
The issue turned out to be the clearing of the Read Data Available IRQ prior to issuing the read command. The read IRQ should only be cleared after the read buffer has been read.
The example I had followed was clearing the IRQ flags for all interrupts prior to issuing the command which would activate the IRQ. This is fine for the other flags, but not for the Read Data Available IRQ which should only be cleared when data has been read as this toggles the receive buffer and also the flag.