1.ファイル一覧
1)mainシーケンス関連
ファイル名 |
修正 |
追加 |
<main.h> |
ー |
・#include "usbd_sp.h" |
<main.c> |
ー |
・usbd_sp() 呼び出し |
<stm32f4xx_it.c> |
|
・デバッグ用 |
<usbd_sp.h> |
定数定義 |
|
<usbd_sp.c> |
メインシーケンス実装 |
2)usbd audio関連
ファイル名 |
関数/定義 |
修正追加内容 |
<usbd_audio.h> |
#define USB_AUDIO_CONFIG_DESC_SIZ |
・デスクリプタサイズ変更 (エンドポイント追加用) |
USBD_AUDIO_HandleTypeDef |
・メンバー使用方法変更 |
|
<usbd_audio.c> |
#define AUDIO_PACKET_SZE(frq) |
・パケットサイズ拡張 |
Endpoint 1 |
・AUDIO_OUT_EP修正 |
|
Endpoint 2 |
・AUDIO_IN_EP追加 |
|
変数 |
・USBD_AUDIO_HandleTypeDefに追加 詳細別途 ・その他変数追加 |
|
USBD_AUDIO_Init() |
・エンドポイント追加 ・フィードバック返信 busy : tx_flag=1 |
|
USBD_AUDIO_DeInit() |
・フィードバック返信 idle : tx_flag=0 |
|
USBD_AUDIO_SOF() |
・フィードバック返信処理 |
|
USBD_AUDIO_IsoINIncomplete() |
・フィードバック返信復旧 dle : tx_flag=0 |
|
USBD_AUDIO_IsoOutIncomplete() |
・DataOut復旧 |
|
USBD_AUDIO_DataOut() |
・データハンドリング変更 ・フィードバック値算出追加 |
|
<usbd_conf.c> |
USBD_LL_Init() |
・SOF enable |
2.オーディオデータ関連定数
1)USBD AUDIO
シンボル |
設定値 |
単位 |
内容 |
USBD_AUDIO_FREQ |
48000 |
Hz |
サンプリング周波数 |
AUDIO_OUT_PACKET |
192+4 |
byte/PACKET |
1パケットのバイト数 48±1 * 4 ((USBD_AUDIO_FREQ * 2U * 2U) / 1000U + 4) |
AUDIO_OUT_PACKET_NUM |
80U |
PACKET/buff |
バッファ収容パケット数 |
AUDIO_TOTAL_BUF_SIZE |
15360+320 |
byte/buff |
AUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM |
USBD_EP_TYPE_ISOC_ASYNC |
0x5U |
|
bmAttributes |
AUDIO_IN_EP |
0x81U |
|
bEndpointAddress : ISO Input Endpoint |
AUDIO_IN_PACKET |
3U |
byte |
Input Endpoint パケットサイズ |
SOF_RATE |
0x2U |
|
P値 bRefresh : 4ms = 2^2 |
AUDIO_ISO_FS_INIT |
48000 |
|
fs基準値 |
AUDIO_ISO_FS_DMAX |
750 |
|
fsフィードバック偏差最大値 |
2)DAC
所属 |
項目 |
設定値 |
設定コード・計算式 |
SYSTEM |
システムクロック SYSTEM_FREQ |
96MHz |
ー |
USBD_SP_ISO |
DACバッファサイズ[word] DAC_BUF_SIZE |
3840 |
((USBD_AUDIO_FREQ * AUDIO_OUT_PACKET_NUM)/1000U) |
DACバッファサイズ[byte] DAC_BUF_SIZE4 |
15360 |
DAC_BUF_SIZE * 4 |
|
TIM2 |
Period (TIM2_P_BASE) |
2000-1 |
SYSTEM_FREQ/USBD_AUDIO_FREQ – 1 = TIM2_P_BASE - 1 |
TIM1 |
Period (TIM1_P_BASE) |
3840-1 |
DAC_BUF_SIZE – 1 = TIM1_P_BASE - 1 |
DMA PWM |
DMAダブルバッファサイズ DMA_BUF_SIZE2 |
7680 |
DAC_BUF_SIZE * 2 |
保存開始 |
1920 |
DMA_BUF_SIZE2 / 4 |
3.変数一覧
1)USBD_AUDIO 変更追加分
所属 |
変数名 |
G/L |
内容 |
<usbd_audio.h> |
USBD_AUDIO_HandleTypeDef haudio |
G |
構造体 使い方を一部変更 |
uint32_t alt_setting; |
|
0:再生停止 1:再生中 |
|
uint8_t buffer[]; |
|
AUDIO DATA バッファ |
|
AUDIO_OffsetTypeDef offset; |
|
AUDIO_OFFSET_NONE:データ受信中 AUDIO_OFFSET_HALF AUDIO_OFFSET_FULL:データ受信完了 AUDIO_OFFSET_UNKNOWN:START前 |
|
uint8_t rd_enable; |
|
RD_IDLE:再生開始前 RD_START:初回データ受信中 RD_PLAY:データ受信中 |
|
uint16_t rd_ptr; |
|
DACに渡すデータ数[byte] |
|
uint16_t wr_ptr; |
|
AUDIO DATAバッファへデータ格納済の数 |
|
USBD_AUDIO_ControlTypeDef control; |
|
制御関連(詳細未調査) |
|
ISO_ControlTypeDef iso_cont |
G |
構造体 アイソクロナス返信用として新設 |
|
uint32_t fs = AUDIO_ISO_FS_INIT; |
|
fs値 |
|
volatile uint32_t tx_flag = 1U; |
|
0:ISO返信 idle 1:ISO返信 busy |
|
volatile uint32_t fnsof = 0; |
|
SOFフレーム番号 ISO返信同期に使用 |
|
USBD_AUDIO_DataOut() |
uint32_t ofs_packet; |
(L) |
USBデータバッファオフセット |
uint16_t usbintn; |
(L) |
受信したパケット数 |
|
uint16_t ofs_dac; |
L |
DACバッファオフセット |
|
int32_t ofs_diff; |
L |
バッファオフセット偏差 |
2)USBD_SP
所属 |
変数名 |
G/L |
内容 |
<usbd_sp.c> |
USBD_AUDIO_HandleTypeDef *haudio; |
L |
USBD AUDIO Handle <usbd_audio.c> |
SEQ_MAIN seq_m = SEQ_IDLE; |
L |
メインシーケンス state |
|
uint32_t cnt_pwm_p; |
L |
PWM DAC バッファポインタ |
|
uint32_t pwm_buf[DMA_BUF_SIZE2]; |
L |
PWM DAC バッファ |
|
U8T2I16T dec; |
L |
オーディオデータデコード共用体 |
|
int32_t dp32[2]; |
L |
オーディオデータ [0]:L ch, [1]:R ch |
|
uint32_t dpout; |
L |
PWM DAC バッファデータ 1000±1000 |
5.シーケンスとデータフロー
処理順 |
rd_enable SEQ_RDEN |
状態 |
処理 |
遷移 |
① |
RD_IDLE |
USDBデータ受信前 再生停止 |
USBD DataOut リスタート バッファポインタ,カウンタ初期化 ISO起動 RD_START WD_PTR_1st |
RD_START 無条件 継続処理 |
③ |
RD_START |
初回パケット バッファ格納完了 |
USBDデータ受信 FS算出 パケットバッファ格納完了時 RD_START:RD_PLAY 継続処理 RD_PLAY:AUDIO_OFFSET_FULL |
RD_PLAY パケットバッファ格納完了 継続処理 |
④ ⑦⑨ |
RD_PLAY |
再生 |
RD_IDLE SEQ_PAUSEから再生再開
|
処理順 |
seq_m SEQ_MAIN |
状態 |
処理 |
遷移 |
②
|
SEQ_IDLE |
USDBデータ受信前 |
USBDデータ受信待ち WR_PTR_IDLE USBD_AUDIO_HandleTypeDef取得 SEQ_START |
SEQ_START WR_PTR_1st |
⑤ |
SEQ_START |
DAC起動 |
USBDデータ受信 タイマー, DAC起動 SEQ_PLAY |
SEQ_PLAY AUDIO_OFFSET_FULL データはSEQ_PLAYで処理 |
⑥ ⑧⑩ |
SEQ_PLAY |
再生 |
USBDデータ受信 AUDIO_OFFSET_NONE データデコードしバッファへ格納 再生停止 SEQ_PAUSE |
SEQ_PAUSE alt_setting == 0U |
⑩以降 から遷移 |
SEQ_PAUSE |
再生停止 |
再生再開 タイマー, DACリセット RD_IDLE SEQ_IDLE |
SEQ_IDLE alt_setting != 0U |
6.解説
・USBD_AUDIO_HandleTypeDef haudio は一部メンバーを転用し使い方を変更
・rd_enable再生開始で RD_IDLE→RD_START→RD_PLAY は USBD_AUDIO_DataOut() 内で継続処理
次はコード