こんにちは!
MCXN947、Free-RTOS、USB ホスト、h264 カメラ コネクテッド、アイソクロナス モード、NXP USB スタックを使用します。
USB アナライザーのスクリーンショットでは、受信コールバックの最後の 4 バイトで欠落しているパケットが青で囲まれています。パケットが壊れているパターンがいくつかCAN見られますが、その理由はわかりません。アイソクロナス転送では一部のパケットが破損する可能性があることは承知していますが、ここではパケットがSO多すぎてビデオ ストリームが壊れています。壊れたものは常に末尾の 4 バイトが欠落しています。カメラは 40 バイトまたは 72 バイトのパケットを送信することはありません (USB アナライザーによる) が、そのようなサイズのパケットを頻繁に受信します (画像で確認できます)。
バッファが整列している
#定義 cam_buf_max_ 1000
USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) 静的 uint8_t s_CAM_BufferA1[cam_buf_max]; //CAM
静的void stream_callback (void *param、uint8_t *data、volatile uint32_t dataLength、usb_status_t status)
最後の受信後にバッファを完全にクリアすると、壊れた受信パケットには dataLength を超えるゼロのみが含まれます。バッファの dataLength は正しいですが、最後の 4 バイトがどこかで失われています。
ステータス = USB_HosVideoStreamRecv(ハンドル、s_CAM_BufferA、cam_buf_max、stream_callback、ハンドル);
USB_HosVideoStreamRecvはNXPビデオクラスの一部です
間隔1
最大パケットサイズ 1000
フレームあたりの数 1
こんにちは@ivaylo
ご返信よろしくお願いします。
詳細な問題を再現する必要があり、その後、特定の問題と可能な解決策を分析CAN。あなたの地域の FAE にいる私の同僚がこの問題に取り組んでいることは承知しています。彼らはすでにサポートのために社内の SE チームにエスカレーションしています。更新があればあなたに送信します。
よろしくお願いします。
BR
アリス
こんにちは@ivaylo
共有していただきありがとうございます。
確かに PC の互換性は MCU よりも強力ですね。MCU を使用する場合、外部デバイスは品質の良い評判の良いブランドのものである必要があります。これまでにも、良質の SD カード、良質の USB ケーブル、良質の USB ドライブが必要であるといった問題に遭遇したことがあります。低品質のものでは単純にうまく機能しません。
よろしくお願いします。
BR
アリス
こんにちは、
まだ解決していません。
しかし、状況を改善するために、USB ケーブルを別のものに交換し、適切な USB ハブを追加することを試しました。この状況では、結果が悪化したため、追加された時間遅延を削除しました。おそらくジッターの問題があるかもしれませんが、元のケーブルを使用したカメラはさまざまな PC で正常に動作し、NXP キットでは USB トレースのルート設定が適切に行われるはずです。
こんにちは@ivaylo
返信が遅くなり申し訳ありません。このCASEは当初私に割り当てられていなかった、SO通知を受け取りませんでした。しばらく時間が経ちましたので確認させていただきたいのですが、問題は解決されましたか?そうでない場合は、引き続き一緒に仕事をさせていただければ幸いです。
よろしくお願いします。
BR
アリス
こんにちは!
別のカメラを購入しました。こちらは一般的に大きなパケットを送信します。3x1024バイトの代替モードに設定されています。それでも、128、140、94、74、77、115バイトといった小さなパケットでバイトが失われる問題が発生します。最後に4バイトが失われます。
こんにちはヤンさん
ご回答ありがとうございます!
1.仮想カメラを使用したデモは USB デバイスです。ここでの問題はホスト モードにあります。
2. h.264 カメラを見つけるのはSO簡単ではありません。別のメーカーから 2 台目を購入しましたが、別の問題があり、選択肢にありませんでした (コンピューターでテスト済み)。
3. FPSはすでに低下しています。より小さいエンドポイント(256 バイト)の代替設定を設定すると、カメラはより少ない小さなパケットを送信します。この状況では、壊れたフレームがかなり少なくなります。また、サイズが 40 バイトおよび 72 バイトのパケットの場合、プログラムがブレーキポイントで停止する頻度は少なくなります。すでに 128 バイトでは、ビデオ (800x600) を送信するのに十分な帯域幅がありません。実際に問題となるのは、小さなパケットだけです。
4. このような時間遅延でテストした情報をすでに追加しました。さまざまな値を試しました。現在は「最適な」ものを使用していますが、少しは改善されていますが、十分ではありません。
なぜ非常に小さなパケットでのみ問題が発生するのでしょうか?
こんにちは@ivaylo
返信が遅くなり申し訳ございません。以下にいくつかの提案を示します。
USB_HostEhciTransactionDone()関数に遅延を追加CAN。ご回答をお待ちしています。
BR
アリス
(偶然のprintfによる)時間遅延を追加する
void USB_HostEhciTransactionDone(usb_host_ehci_instance_t *ehciInstance)
if (index == 8U) /* 転送が完了しました */
状況が改善され、つまり、よりまれに壊れたパケットが受信されるようになる。