그럼 esp32 들을 64x64 로 나누어서 대형 스크린으로 하거나, 스케일링해서 그 이상의 해상도로 출력하는걸려나?
The large number of pixels makes it impractical to wire each pixel separately—a 64×64 display has 4096 pixels and 12288 light-emitting dies. An LED matrix therefore usesrow/column scanning and shift registers, which is also the operating principle of the HUB75 interface:
USB 아이소크로노스 고대역폭(High-Bandwidth Isochronous) 전송은 오디오, 비디오, 웹캠처럼 데이터가 끊기지 않고실시간성(Time-critical)이 보장되어야 하는 장치를 위해,하나의 서비스 주기(Microframe) 내에서 여러 개의 데이터 패킷을 연속으로 전송하여 대역폭을 극대화하는 기술입니다.[1,2]
USB 엔드포인트(Endpoint) 설명자와 하드웨어 수준에서 설계된 이 방식의 핵심 원리와 동작 방식은 다음과 같습니다.
1. 고대역폭 아이소크로노스의 핵심 원리
일반적인 USB 2.0 High-Speed 모드에서 아이소크로노스 엔드포인트는 1 마이크로프레임(Microframe = 125µs)마다최대 1개의 데이터 패킷(최대 1024 바이트)만 전송할 수 있습니다.[1,2]
하지만 고화질 비디오 스트리밍처럼 1024바이트를 초과하는 대역폭이 필요할 때고대역폭 엔드포인트를 활성화합니다.[1]
추가 트랜잭션 요청:단일 마이크로프레임 내에서 최대 2개의 패킷을 추가로 더 요청할 수 있습니다.[1]
대역폭 확장 수치 (USB 2.0 High-Speed 기준):
00 (기본): 마이크로프레임당 1개 패킷 (최대 1,024 바이트)
01 (1개 추가): 마이크로프레임당 2개 패킷 (최대 2,048 바이트)
10 (2개 추가): 마이크로프레임당 3개 패킷 (최대3,072 바이트)
2. 엔드포인트 기술 사양 (Descriptor 사양)
펌웨어나 USB 컨트롤러 드라이버 레벨에서 고대역폭을 활성화하려면 엔드포인트 디스크립터(Endpoint Descriptor)의wMaxPacketSize필드의 상위 비트를 수정해야 합니다:[1]
Bit 10 ~ 0:기본 패킷 크기를 지정합니다 (예: 1024 크기면 0x400).[1,2]
Bit 12 ~ 11:마이크로프레임당 추가 전송 기회를 설정합니다.
01 : 마이크로프레임당 2번 전송 (비트 추가)
10 : 마이크로프레임당 3번 전송 (비트 추가)
3. USB 3.0(SuperSpeed) 이상에서의 확장
USB 3.0 SuperSpeed 이후부터는 구조가 더욱 확장되어 고대역폭 아이소크로노스를버스트(Burst) 전송과Mult(Multiplier)개념으로 처리합니다.[1,2,3]
이론상 최대 전송량:SuperSpeed에서는 단일 주기 내에서 최대 16개의 버스트 크기와 3개의 Mult를 조합하여 1024 바이트 × 16 × 3 = 49,152 바이트를 한 주기에 쏟아부을 수 있습니다.[1]
이를 통해 UHD(4K/8K) 카메라나 비압축 고화질 영상 캡처 장비도 지연 없이 안정적으로 데이터를 밀어줄 수 있습니다
4. 주요 특징 및 주의사항
에러 재전송 없음 (No Retries):벌크(Bulk) 전송과 달리 데이터에 CRC 에러가 발생해도 다시 보내지 않고 다음 패킷으로 넘어갑니다. 데이터의 무결성보다정해진 시간에 데이터가 도착하는 시간적 연속성이 훨씬 중요하기 때문입니다.[1,2,3,4,5]
대역폭 예약제:호스트 컨트롤러는 아이소크로노스 전송을 위해 전체 USB 대역폭의 일정 비율(최대 80~90%)을 미리 고정으로 묶어둡니다.[1]
대역폭 부족 오류 (Bandwidth Error):여러 대의 고대역폭 웹캠을 하나의 USB 허브에 물리거나, 하나의 호스트 컨트롤러에 고대역폭 아이소크로노스 장치를 동시에 여러 개 연결하면"USB 대역폭 초과"에러가 발생하며 장치 인식이 되지 않을 수 있습니다. 이 경우 기기 드라이버에서 대체 설정(Alternative Setting)을 통해 요구 대역폭을 낮추거나 별도의 USB 컨트롤러에 분산 연결해야 합니다.[1]
[188337.135281] usb 1-2: new high-speed USB device number 61 using xhci_hcd [188337.261398] usb 1-2: New USB device found, idVendor=04b4, idProduct=8613, bcdDevice=a0.01 [188337.261404] usb 1-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [188337.299924] usbtest 1-2:1.0: FX2 device [188337.299930] usbtest 1-2:1.0: high-speed {control bulk-in bulk-out} tests (+alt) [188337.299986] usbcore: registered new interface driver usbtest
전류 설정 주의 스펙표의 0.95A/phase는 센터탭을 사용하는 유니폴라(하프코일) 기준값입니다. 지금처럼 센터탭을 빼고 풀코일로 쓰는 바이폴라 방식에서는 저항이 2배가 되므로, 같은 전류를 흘리면 발열이 2배가 되어 위험합니다. 일반적인 변환 공식(÷1.4)을 적용하면:
권장 전류 ≈ 0.95A ÷ 1.4 ≈ 0.7A
TB6600 DIP 스위치를 0.7A 근처로 맞추고, 너무 뜨거워지지 않는 선에서 서서히 조정해보세요. 만약 이렇게 정확히 배선했는데도 진동만 한다면, 이전 답변의 5단계처럼 A+/A-(흑/녹) 극성만 한 번 바꿔서 테스트해보시면 됩니다.
void init_tb6600() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); // EN HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); // DIR HIGH }
int val = 0; void gpio_proc() { int uslp = 250; int cnt = 800 * 5; sprintf((char*)usb_buf, "EN:RST DIR:RST %d pulse\r\n", cnt); CDC_Transmit_FS(usb_buf, BUF_SIZE); memset(usb_buf,0,BUF_SIZE); count++;
$ sudo dmesg -w [ 34.570036] usb 3-1: new full-speed USB device number 2 using xhci_hcd [ 34.722053] usb 3-1: New USB device found, idVendor=8f0a, idProduct=5301, bcdDevice= 1.00 [ 34.722078] usb 3-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0 [ 34.722086] usb 3-1: Product: KURZWEIL DIGTAL PIANO [ 34.722091] usb 3-1: Manufacturer: KURZWEIL [ 34.787873] usb 3-1: Quirk or no altset; falling back to MIDI 1.0 [ 34.794647] usbcore: registered new interface driver snd-usb-audio