圏9研究所 工作室

圏9研究所の開発情報資料など

STM32F411 BlackPill USB Speaker ISO(4) ファイル、定数、変数、シーケンス

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_UNKNOWNSTART

  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() 内で継続処理

 

次はコード