STM32 音频应用
STM32 已经成为主流平台 2 消费电子 医疗设备 楼宇安防 网络互联 工业控制 重点应用 更多跨界应用 Sensor Hub 血糖仪 可视对讲 无线网络 POS 触摸感应 血氧计 云台控制 高级航模 打印机, 游戏手柄家庭音响玩具 便携式 ECG 人工耳蜗 数据采集 处理 通风 暖气调节 汽车音响空中鼠标 LED 控制表计, 测量变频, 逆变控制
STM32 USB 音频应用 USB 音箱 音频编码 (WAV,MP3) 音频解码 (WAV,MP3,WMA,AAC) ipod Docking Android Docking 软件升级 (U_disk) STM32 其它音频应用 DSP 一些其它免费的编码和解码 Sound bar Smart Phone 音频开发板 ST 现有的音频应用 3
目标和任务 4 目标 : 主题 : USB OTG 库 (HCC 和 ST) 音频固件 --(Audio streaming, Audio Engine, Codecs, Addons, PDM) Apple 附件 --iap1 and iap2 --ihost and idevice Android 附件 --MTP,ADK,AOA Smartphone Accessory Board
目标和任务 5 目标 : 主题 : USB OTG 库 (HCC 和 ST) 音频固件 --(Audio streaming, Audio Engine, Codecs, Addons, PDM) Apple 附件 --iap1 and iap2 --ihost and idevice Android 附件 --MTP,ADK,AOA Smartphone Accessory Board
USB 概述 ( 回顾 ) 6 USB 拓扑图 只有一个主机 最多 7 层 最多 5 层是 HUB 最多 127 端点
例子 -----USB 拓扑图 7 高速 Hub 高速 480Mbps USB 2.0 主机 全速 / 低速 12M/1.5Mbps 全速 / 低速设备 高速设备 低速 Hub 全速 / 低速设备
USB 逻辑图 8 主机 buffer 应用 buffer (pipe) 设备 接口 ( 一个或者多个 ): 端点 >> 端点数 传输类型 >> 传输方向 最长包
USB Transfer 9 Host Power Data Device - 仅仅一个主机. - 初始化所有的通讯 - 能够跟一个或者多个设备在同一个总线上通讯. - 数据是基于帧进行发送和接收 (1ms/frame 或者 0.125ms/frame). - 每一帧包含多个数据包 - 数据的接收和发送都是由主机发起要求 四种传输类型 : 控制传输 : 强制要求对所有设备 批量传输 : 非周期性, 大量的数据, 保障数据的正确性 中断传输 : 非周期性, 小数据量. 实时性 同步传输 : 周期性, 实时性 数据架构基于下面三个对象 : Configuration Interface Endpoint Configuration 0 Device Configuration N Interface 0 Interface N Interface 0 Interface N Endpoint 0 Endpoint 0 Endpoint 0 Endpoint 0 Endpoint 1 Endpoint 1 Endpoint 1 Endpoint 1 Endpoint N Endpoint N Endpoint N Endpoint N
ST USB OTG library 10 ST Support USB 2.0 全速 (12M) 高速 (up to 480M) HCC Library(not Free) iap1 MP3,WMA decoder Firmware update ST Library(Free) USB Device,USB Host and OTG Apple Accessories Android Accessories MP3(encoder and decoder),wma,aac(.adts adif.loas) Audio Streaming Firmware update
USB Libraries 11 USB Device Library STM32F10xx (except F105/7) STM32L151/2 STM32F05xx STM32F3xx X Not Compatible! USB OTG Device Library STM32F2xx STM32F4xx STM32F105/7 STM32L4xx USB OTG Host Library STM32F2xx STM32F4xx STM32F105/7 SMT32L4xx
STM32 USB 类 12 USB 设备类 HID (Human Interface Device) 鼠标, 键盘, 低速率的数据传输或控制 Mass Storage Virtual ComPort USB 转 UART Audio Streaming Class 1.0, 16-bit, Stereo, In/Out (Headset/Microphone) Device Firmware Upgrade Specific examples: Dual Core(Full and High speed device) Isochronous raw USB Host Classes HID (Human Interface Device) 鼠标, 键盘, 低速率的数据传输或控制 Mass Storage CDC (Communication Device Class) Generic class for Serial/Ethernet/Composite Audio Streaming: Class 1.0, 16-bit, Stereo, In (Headset) Specific examples: Dual Core Composite Mass Storage + CDC OTG: Dual Role Device
OTG_FS & OTG_HS library 13 STM32_USB-Host-Device_Lib_V2.1.0 Host mode Mass Storage:FATFS, Read /Write HID: Only support mouse and keyboard Firmware update HID Device mode HID VCD Audio MSC HID OTG mode Mass Storage HID mouse (OTG_FS) + Mass Storage(OTG_HS)
目标和任务 14 目标 : 主题 : USB OTG 库 (HCC 和 ST) 音频固件 --(Audio streaming, Audio Engine, Codecs, Addons, PDM) Apple 附件 --iap1 and iap2 --ihost and idevice Android 附件 --MTP,ADK,AOA Smartphone Accessory Board
USB for Audio 15 虽然 USB 是一个高度标准化的接口, 但是它也是具有多功能和高度客户化的接口. USB 允许通过不同的方式传输各种类型的数据 它有多种 USB 类去允许传输数字音频数据, 这些类都有它们各自的优缺点 : USB Audio Class 1.0 & 2.0 USB Mass Storage USB MTP USB CDC
USB Audio Class 1.0 & 2.0 (1/2) 16 同步传输 : 实时性得到保障, 但是并不保障数据的完整性 占有高带宽 ( 最高可以达到 90% 的带宽 ) 允许扩展音频的一些控制 (source, sink, volume, clocks, effects: reverberation, modulation delay, encoding, decoding ) 有效的同步机制 : Synchronous: 设备从主机的 SOF 上面获取它的它的音频时钟 (Start Of Frame). ( 高可靠性 ) ( 低成本 ). Asynchronous: 设备的时钟是自己控制. 设备需要自己实现自我同步. ( 可靠性低 ( 低成本, 软件简单 ). Adaptive: 设备获取和改变它的时钟根据自己收到的数据 ( 非常高的可靠性 )( 软件简单, 硬件复杂 ).
USB Audio Class 1.0 vs. 2.0 (2/2) 17 不完全兼容! USB Audio Class 2.0 是基于 USB Audio Class 1.0 增加和适当的修改了一些功能 支持高速模式 ( 但是对于音频是真的需要吗?) 使用了时钟单元 可能是为了去同步 设备可以通过中断端点去通知主机设备端的一些改变 (volume control, clock path update ) 支持 Category, 允许主机去自动检测或判断设备具有的主要功能 (ie. Desktop Speaker, Telephone, Headset ). 等等!
USB Mass Storage (MSC) 18 大批量数据传输 : 数据得到保障, 但是不保障实时性. 没有办法同步. 尽管它被广泛应用于汽车音响 消费类电子, 但是 USB 没有任何专门协议对于音频 ( 它仅仅只是通过 USB 读取文件数据 ) 非常容易得到各种元数据 (file name, artist, album, genre ) 没有专门的控制协议 (ie. volume level, play/pause/stop ) 主机必须增加文件管理系统 需要额外的软件去编码或者解码这些压缩文件
USB Media Transfer Protocol (MTP) 19 大批量数据传输 : 保障数据的完整性, 但是不保障数据的实时性. 没有方法去同步. 它是基于 PTP (Picture Transfer Protocol). 命令 - 数据 - 响应的通讯模式. 基于抽象的音频内容和大小的数据传输. 元数据和音频控制也是可以能的. 内容数字版权加密保护技术 (DRM) 广泛应用于便携式或者掌上音频设备.
Communication Device Class (CDC) 20 任一传输类型 : CDC 是收集了任何传输接口的传输类. 一个 CDC 设备可以用作音频类 MTP. 没有专门应用于音频的协议 应用于电话和网络协议 它是多接口的应用典范 CDC Device Communications Interface Data Interface Audio Interface HID Interface 并不没有广泛的应用
实例 (1/2) 21 iphone Docking (iphone/ipod/ipad) 对所有设备来说它的结构是固定的 HID 接口作为控制 (ie. Volume, next/previous, Play/Pause 音频 2.0 或者 1.0 作为音频数据传输 通过 SOF 同步, 不支持 PIPE 反馈 Mass Storage Device Audio Class 1.0 & 2.0 HID 客户协议 (APP 应用协议 ) 另外 : 我们还可以增加 MSC, 在同一工程
实例 (2/2) 22 Android Docking 主机模式 (Android 作为 USB 主机 ) (> Android 3.1, API level 12) MTP Isochronous (JellyBean level 16). 设备模式 (Android 作为 USB 设备 ) Mass Storage: Android 设备的角色作为一个 SD 读卡器, 不需要任何的控制. MTP: Android 设备通过 MTP 接口呈现它内部的存储空间. MTP and Mass Storage are generally exclusive. Andriod Open Accessory Mode(AOA): 它是 Google 提供一种特别的通讯方式 ( 类似 IAP) 需要开发附件和设备端进入 AOA 模式 (Handshake) 2 个大数据传输端点去提供附件和 Android 设备之间的传输和控制 需要把标准的音频传输重新打包音频的传输. 需要 JellyBean(level 16) 以上的版本, 才能同步和重新打包音频
USB Device Audio( 音频数据流 ) 23
应用架构 24 USB Device I2S ADC Codec (DAC) LCD Buttons
DMA STM32 应用方案 25 USB Device I2C Clock Synthesizer I2S Codec (DAC) LCD FSMC / SPI TIM IO Expander Buttons IOs ADC / SPI STM32
应用层次 26 Application USB Audio Class Driver USB Device Core Utilities USB OTG Driver Std Peripheral Drivers CMSIS Hardware USB components Standard components Application components
USB peripheral I2S Peripheral 典型的通过 USB 的音频应用 : 同步问题 27 Microcontroller Buffer (RAM) DAC PC 时钟域 (SOF) USB 外设时钟域 I2S 外设时钟域外部功放时钟 因为同一个系统时钟的关系, 这三个时钟域是被同步了 这些不同的时钟域 (jitter, phase, drift ) 将造成音频的不同步, 出现断音或者丢失部分音频.
主要问题 28 USB 的参考时钟 (SOF) 并不跟系统时钟同步 : Jitter: Drift:. 相位, 固定的延时 读取 复制 处理 Buffer 的时间 预存音频数据的 buffering
下溢情况 ( 简单描述带有 level = 1buffer) I2S 的消耗一个 buffer< 1 ms 问题描述 29 Basic Delay Accumulated Delay Accumulated Delay Underflow I2S needs buffer 10 but it is not yet loaded I2S Buffer Consumption USB Buffer Reception 1 1 2 3 4 5 6 7 8 9 9 10 11 2 3 4 5 6 7 8 9 10 11 Start of Reception Start of Consumption Data transfer time (on the USB bus) 1 Frame = 1ms x 复写情况 ( 简单描述带有 level = 1buffer) I2S 的消耗一个 buffer>1 ms Basic Delay Accumulated Delay Overflow USB overwrites buffer 5 but it is not yet consumed by I2S I2S Buffer Consumption USB Buffer Reception 1 1 2 3 4 2 3 4 5 6 7 8 Start of Reception Start of Consumption Data transfer time (on the USB bus) 1 Frame = 1ms x
非 USB 改善 : 精准的时钟 深的存储 BUFFER DMA. 减少 USB 的复制的时间 基于 SOF 信号, 同步所有的消耗音频数据 USB 同步机制 : 主要改善 30 USB 数据速率控制机制 ( 异步 / 同步 / 高级 ) 我们会在下面的 PPT 详细介绍.
性能 同步机制比较 31 异步同步高级 时钟从属性 各自独立运行采样时钟隶属于 SOF 采样时钟锁定端点和数据流 数据率控制 端点 : 明确的反馈 源 : 明确的前反馈 绝对的 (SOF) 端点 : 明确的反馈 源 : 明确的前反馈 每帧多少数量数据 - 固定 / 可变. - 确定的. - 固定. - 确定的. - 可变. - 不确定的. 高级 异步 同步 复制度 (Hw & Sw)
STM32 同步实现 32 方式实现主要问题方案 异步 仅仅需要软件实现 需要一个精准的移位测量和纠正 已经移植在 STM32 产品 同步 需要软 / 硬件移植 ( 编程 PLLS 去隶属于 SOF ). 所要求的硬件,STM32 并不具有 不可能在 STM32 上实现 高级软件移植? ( SRC ). 理论上可行, 硬件 (I2S 动态调节采样率 + 时钟配置 ) 开发中
应用 33 STM32 USB 设备的音频数据流的例程是一个完整的软件库 提供 : USB 音频数据流的应用 :USB 耳机 喇叭 多种同步方式 : 外部 PLL USB PIPE 反馈 增加 / 减少采样个数 SRC 同步 无同步方式 在不影响系统时钟配置的情况下, 支持多种采样率 (48KHz, 44.1KHz, 32KHz )
STM32 异步机制 34 无同步 动态时钟控制 动态调节 I2S 的时钟 增加 / 移除样本 增加或者移除一个样本, 根据 BUFFER 的消耗情况 通道反馈 设备应用一个 uses a 专门的 USB 端点去通知主机在下一帧需要多少的数据 采样转换 (SRC ) 设备用 SRC 的机制去转换部分的数据, 根据 BUFFER 的消耗情况 低音质 低成本 高 / 中音质 高成本 ( 额外时钟发生器 ) 低音质 低成本 低复杂度 高音质 低复杂度 许多的主机并不支持这种功能 高 / 中音质低成本. Other Ideas?
FW version V0.2.0 Toolchain KEIL MDK-ARM V4.21 Compiler version KEIL armcc compiler: 4.1.0.713 Configuration Optimization: -O3, for Time System Clock = 120 MHz 3 Wait States on Flash 应得 MCU 负荷 35 Player: Option/Configuration CPU Load (%) 无同步 2.96% 外部时钟同步 3.22% 通道反馈 3.08% 增加 / 移除样本 2.97% SRC 22.07% 刻录 only 7.50%
应用占有的资源 36 FW version V0.2.0 Toolchain KEIL MDK-ARM V4.21 Compiler version KEIL armcc compiler: 4.1.0.713 Configuration Optimization: -O3, for Time Module Footprint (Bytes) Code Const RAM Total Demo (all options enabled) 43956 10292 11232 Common modules 24744 9964 9104 USB 10608 0 5439 LCD 2654 9168 518 Synchro management 744 0 239 外部时钟 1376 184 120 通道反馈 372 72 72 增加 / 移除样本 100 72 56 SRC 17364 0 1880