2012-11-12 5 views
2

이전 직렬 포트를보고하는 간단한 가상 직렬 포트 장치를 쓰고 있습니다. 이 시점에서 나는 장치를 열거하고 문자를 보내고받을 수 있습니다.USB CDC 장치가 스톨 됨

호스트에서 장치로 다양한 대량 전송을 한 후 종단점이 데이터 전송을 포기하고 전송을 중지합니다. PC 쪽에서는 쓰기 오류가 발생하고 USBlyzer 추적에서 음악이 실속 (USBD_STATUS_STALL_PID)에서 멈 춥니 다. 그러나 내 코드는 의도적으로 해당 끝점에 STALL 조건을 발행하지 않으며 생성 된 상태 플래그는 결코 설정되지 않습니다.

요청과 STALL 발급 사이에 짧은 시간 (< 300μs)이 경과하면 시간 초과가 아닌 일종의 잘못된 응답으로 보입니다. 장치 측에서 버퍼의 데이터와 적절한 DATA0/1 동기화로 출력 엔드 포인트를 사용할 준비가되었지만 더 이상 발생하지는 않습니다.

"대용량"데이터를 보내기 시작할 때까지 오랫동안 장치가 작동하는 것처럼 보입니다. 가까운 곳에서 장치 열거/구성을 알 수 있으면 성공적으로 완료된 것처럼 보입니다. 아, 그리고 bulk-in 엔드 포인트는이 후에도 계속 잘 작동합니다.

기록을 위해 나는 표준 Windows usbser.sys 드라이버와 XMega128A4U μP를 사용하고 있습니다. 또한 여러 Windows Vista 및 7 컴퓨터에서 동일한 동작이 발생합니다.

내가 잘못하고있는 것에 대한 아이디어가 있습니까? 호스트 측의 출력 버퍼의 오버 플로우에 발생할 수 아웃 포인트 실속

USBlyzer log , USB CDC stack, test project

답변

3

기록상 이것은 결국 발진기 문제로 밝혀졌습니다. (분명히 FLL의 레퍼런스는 1,000Hz USB 프레임이 선택 되더라도 항상 1,024Hz이다. 약간의 클럭 오류는 연속적으로 너무 많은 1 비트를 포함하는 경우 패킷이 가끔 거부되는 것을 의미한다.)

이야기의 도덕은 상위 수준 프로토콜에 문제가 있다고 가정하기 전에 기본 사항을 확인하는 것입니다. 또한 하드웨어 USB 분석기는 가치있는 투자 였을 것입니다. 소프트웨어 대안은 대체로 뭔가 잘못되었을 때 일반적인 오류 코드 나 아무것도 표시하지 않는 것으로 보입니다.

2

. 장치가 외부 끝점을 통해 수신 한 데이터를 가져 오는 지 확신합니까? 그렇다면 적어도 데이터가 장치로 보내질 때까지 데이터를 가져옵니다.

"대용량"데이터를 보내기 시작할 때까지 시간의 오랜 기간 동안 장치가 정상적으로 작동하는 것으로 나타났습니다.

출력 버퍼의 오버플로에 대한 힌트 인 것 같습니다.

+0

아, 그래도 CDC 장치에 대한 정규 NACK을 기반으로하는 흐름 제어 메커니즘이 있습니다. 속도가 어떻게 제한되는지 아는 사람? USBlyzer 로그가 믿어 지려면 장치가 실속하기 전 ~ 30ms 전에 데이터를 마지막으로 가져 왔습니다. – doynax

관련 문제