static uint8_t USBD_AUDIO_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
{
UNUSED(epnum);
USBD_AUDIO_HandleTypeDef *haudio;
haudio = (USBD_AUDIO_HandleTypeDef*)pdev->pClassData;
USBD_LL_FlushEP(pdev, AUDIO_OUT_EP);
(void)USBD_LL_PrepareReceive(pdev, AUDIO_OUT_EP, &haudio->buffer[haudio->wr_ptr], AUDIO_OUT_PACKET);
return (uint8_t)USBD_OK;
}
2.コンパイル最適化
最適化すると動かない
C/C++ Build : Setting : MCU GCC Compiler : Optimization : Optimization level None(-O0) に設定
3.おまけ
おまけとして適切な対策が見つかるまでに使っていたリトライコードを参考に記載
(1)おまけリトライ
USBソフトコネクト + CPUリセット
USB接続ダウンを検出したら
・USB D+ ポートに L 出力
・10ms 以上WAIT
・CPUシステムリセット
(2)コード
#define RESTART_USB do{GPIO_InitTypeDef GPIO_InitStruct = {GPIO_PIN_12, GPIO_MODE_OUTPUT_PP};\
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);}while(0)
RESTART_USB;
HAL_Delay(12);
HAL_NVIC_SystemReset();
おまけコードのお手本
community.st.com
4.解説
1)発生原因について
・原因不明
・処理している割込フラグからアイソクロナス通信に関するエラーのようですがアイソクロナスはDisableになっている
アイソクロナス転送でのEVEN/ODD問題と同じように思われる
・USBパケットを追うと接続ダウン発生までの内容は発生有無にかかわらす同じように見える
・デバイス側のハードとホスト側の処理(OSや個体差)も絡むので原因究明は程々にしてお手本のコードを有難く使わせて頂いて対応
2)おまけのコード
・この件を対策しておかないと先へ進めなかったのでとりあえずの対策
USBソフトコネクトは他でも有効に使える
・おまけお手本の待ち時間は500msecになっていますがUSBの規格は10msec以上なので12msecに設定
WAIT設定値が適切かどうか不明であるが動く
次はオーディオデータの転送処理について