2024年10月30日发(作者:谷齐)
USB实现PC音频播放器实验
z 意义与作用
现在的智能终端已经逐步由按键+指示灯或数码管发展为触摸屏+音频输出,前面已经
介绍了神舟系列STM开发板的触摸屏,本章节我们来学习一下如何使用神舟系列STM开发
板的USB接口和I2S音频接口在PC侧实现一个免驱动音频声卡功能。本实验USB工作在同步
传输模式。通过该实现使大家了解如何使用STM32的USB的同步传输模式实现即插即用的功
能,以及如何使用STM32的I2S音频接口实现音频播放功能。
z 实验原理
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,
接口描述符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID
协议,该协议可从Http://下载。关于STM32的USB知识可以参考附件的《STM32
USB固件的中文资料.pdf 》和《STM32的USB详解.pdf》等文档。
本实验音频部分主要是初始化DA芯片PCM1770,设置STM32的I2S接口的参数,然后将
来自USB接口的音频数据通过I2S2接口送给DA芯片PCM1770播放。
PCM1770简介:
神舟系列STM开发板采用TI公司的进口原装音频DA芯片PCM1770。PCM1770是一款
具有耳机放大器的24位低功耗立体声音频 DAC。可直接驱动耳机,具有软件控制音量大小、
芯片模式和模拟语音合成等功能。该芯片的功能框图如下:
PCM1770支持工业标准音频数据格式(industry-standard audio data formats),包括标准
模式(standard)、I2S飞利浦标准、MSB对齐标准(left-justified)。本次实验PCM1770为
从设备模式和MSB对齐标准(left-justified)。
PCM1770的I2S共需要4信号:
● SD:串行数据,用来接收2路(左右声道)时分复用通道的数据;
● WS:字选(左右声道选择),从模式下作为输入;
● CK:串行位时钟,从模式下作为输入。
● MCK:主时钟,PCM1770工作需要的时钟。
PCM1770在MSB对齐标准(left-justified)模式下的信号时序如下图所示:
神舟系列STM32开发板的I2S接口特性如下:
● 单工通信(仅发送或接收)
● 主或者从操作
● 8位线性可编程预分频器,获得精确的音频采样频率(8KHz到96kHz)
● 数据格式可以是16位,24位或者32位
● 音频信道固定数据包帧为16位(16位数据帧)或32位(16、24或32位数据帧)
● 可编程的时钟极性(稳定态)
● 从发送模式下的下溢标志位和主/从接收模式下的溢出标志位
● 16位数据寄存器用来发送和接收,在通道两端各有一个寄存器
● 支持的I2S协议:
─ I2S飞利浦标准
─ MSB对齐标准(左对齐)
─ LSB对齐标准(右对齐)
─ PCM标准(16位通道帧上带长或短帧同步或者16位数据帧扩展为32位通道帧)
● 数据方向总是MSB在先
● 发送和接收都具有DMA能力
● 主时钟可以输出到外部音频设备,比率固定为256xFs(Fs为音频采样频率)
● 在互联型产品中,两个I2S模块(I2S2和I2S3)有一个专用的PLL(PLL3),产生更加精准
得时钟
STM32的I2S的框图如下图所示:
通过将寄存器SPI_I2SCFGR的I2SMOD位置为’1’,即可使能I2S功能。此时,可以
把SPI模块用作I2S音频接口。I2S接口与SPI接口使用大致相同的引脚、标志和中断。
STM32的I2S的4个引脚:
● SD:串行数据(映射至MOSI引脚),用来发送和接收2路时分复用通道的数据;
● WS:字选(映射至NSS引脚),主模式下作为数据控制信号输出,从模式下作为输入;
● CK:串行时钟(映射至SCK引脚),主模式下作为时钟信号输出,从模式下作为输入。
● MCK:主时钟(独立映射),在I2S配置为主模式,寄存器SPI_I2SPR的MCKOE位为’1’
时,作为输出额外的时钟信号引脚使用。输出时钟信号的频率预先设置为256 × Fs,其中
Fs是音频信号的采样频率。
设置成主模式时,I2S使用自身的时钟发生器来产生通信用的时钟信号。这个时钟发生
器也是主时钟输出的时钟源。I2S模式下有2个额外的寄存器,一个是与时钟发生器配置相
关的寄存器SPI_I2SPR,另一个是I2S通用配置寄存器SPI_I2SCFGR(可设置音频标准、从/
主模式、数据格式、数据包帧、时钟极性等参数)。
本次实验PCM1770为从设备模式和MSB对齐标准(left-justified),对应神舟系列
STM32开发板的I2S接口主模式和16bit MSB对齐标准。
STM32的I2S支持的MSB对齐标准时序图:
在此标准下,WS信号和第一个数据位,即最高位(MSB)同时产生
根据以上分析所以后续代码中会看到如下配置:
z 硬件设计
本实验硬件包括“STM32的I2S音频接口” 和 “USB 2.0 OTG全速接口”两部分。
STM32的I2S音频接口:
音乐播放器要用到的硬件资源STM32的I2S接口和外部DA芯片PCM1770,将从I2S2接口
传过来的音频音频信号输出到耳机接口。
神舟IV号STM32开发板上使用了PCM1770这款具有耳机放大器的24位低功耗立体
声音频DAC芯片提供音频播放功能。处理器通过I2S接口(处理器的I2S2)传送音频信号
到PCM1770,由它进行解码输出到J3音频座。而PCM1770的配置接口与处理器的SPI3连
接,处理器通过SPI接口访问PCM1770的寄存器,实现配置和控制功能。
图表 1 音频解码电路原理图
D/A芯片PCM1770通过I2S2接口与STM32F107VCT6处理器连接。音频信号通过I2S2
接口传到D/A芯片,转换成音频信号播出。相关管脚定义如下:
GPIO管脚 功能描述 说明
PB12 I2S2_WS 左右通道时钟,频率和音频采样速率一致
PB13 I2S2_CK 串行比特位时钟。
PB15 I2S2_SD 串行音频数据信号。
PC6 I2S2_MCK 系统时钟输入,PCM1770工作需要的时钟
STM32F107VCT6处理器通过SPI3接口访问DA芯片PCM1770,对它内部数据进行读
取和配置。相关管脚定义如下:
GPIO管脚 功能描述 说明
PC7 SPI 片选 连接到PCM1770的SPI接口片选
PC10 SPI3_SCK SPI3接口SCK时钟信号
PC12 SPI3_MOSI SPI3接口的MOSI信号
DAC芯片说明
在神舟IV号中,使用了TI公司推出的低电压,低功耗带耳机放大的DAC芯片PCM1770,
来实现音频的DA转换。
PCM1770的管脚信号图:
PCM1770的管脚信号定义:
USB 2.0 OTG全速接口作为Device设备
注:本实验的硬件设计与前面“USB人机交互设备HID实验”对应章节完全相同,此处
不再重复,请参考“USB人机交互设备HID实验”对应章节。
z 软件设计
在本实验中的原理是采用的是I2S中断方式来将音频数据送到DAC芯片实现播放音乐
的功能,主程序实现如下:
1、 配置LED、串口和LCD液晶屏
2、 配置I2S管脚和参数
3、 USB时钟、USB协议相关初始化,等待USB中断
本实验USB工作在同步传输模式。
关于LED、串口、LCD液晶屏,系统滴答等知识在前面章节已经讲解过,请回顾相关
知识。
下面我们将重点讲解MAIN函数中的Speaker_Config函数:
该函数的第二行可知本实验的I2S数据传输使用的是DMA方式,继续深入看一下
I2S_Config()函数:
I2S_Config()函数配置I2S的GPIO和I2S参数:
查看神舟IV号原理图可知, D/A芯片PCM1770通过I2S2接口与STM32F107VCT6处
理器连接。音频信号通过I2S2接口传到D/A芯片,转换成音频信号播出。相关管脚定义如
下:
GPIO管脚 功能描述 说明
PB12 I2S2_WS 左右通道时钟,频率和音频采样速率一致
PB13 I2S2_CK 串行比特位时钟。
PB15 I2S2_SD 串行音频数据信号。
PC6 I2S2_MCK 系统时钟输入,PCM1770工作需要的时钟
对应的代码如下:
2S_Config()函数配置和初始化I2S管脚以及接口参数:
USB接口初始化
USB接口初始化在前面已经进行了详细的实验,在本实验中,就不再详细描述,相关的
初始化代码如下:
“pProperty->Init()”实际调用的是“void Virtual_Com_Port_init()”
中断配置函数: 该例程使用了USB中断和I2S中断,由于USB工作同步传输模式,所
以将其优先级设为最高,I2S中断优先级次之(STM32的I2S和SPI共用接口资源)。进行
中断组设置和中断优先级设计,相关代码如下:
z 下载与验证
神舟
IV
号光盘
源码
目录包含本实验的工程源码,在
神舟
IV
号光盘
源码
33.
神舟
IV
号
STM32_USB_MUSIC
实现
PC
音频播放器实验
.rarProjectAudio_StreamingEWARMv5
STM3210C-EVAL-25MHzExe目录下的神舟IV号STM32_USB_MUSIC实现PC音频播放器实
验.hex文件即为前面我们分析的神舟IV号STM32的USB实现PC音频播放器实验编译好的固
件,我们可以直接将固件下载到神舟IV号开发板中,观察运行效果。
如果使用JLINK下载固件,请按
错误!未找到引用源。错误!未找到引用源。
下载固件
到神舟IV号开发板小节进行操作。
如果使用USB下载固件,请按
错误!未找到引用源。错误!未找到引用源。
小节进行操
作。
如果使用串口下载固件,请按
错误!未找到引用源。错误!未找到引用源。
小节进行
操作。
未找到引用源。
如果在IAR开发环境中,下载编译好的固件或者在线调试,请按
错误!
错误!未找到引用源。
小节进行操作。
如果在MDK开发环境中,下载编译好的固件或者在线调试,请按
错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
z 实验现象
将实验的程序固件下载到神舟IV号后,将耳机插入音频口(J3)以后,连接USB与PC
电脑,重新为神舟IV号上电运行,PC机会提示发现新硬件并免驱自动完成安装,此时原PC
的声音会通过神舟IV号从耳机播放,在PC上打开音乐就可以通过神舟IV号听到悦耳的歌
声。同时LCD会有消息提示,串口2(波特率115200)输出打印信息,提示程序运行情况。
PC机免驱自动完成安装后,可以在PC的设备管理器里看到如下设备:
同时双击电脑任务栏右侧的喇叭
设备信息。
,可以看到-STM32 Speaker音频
可以查看-STM32 Speaker音频设备的属性信息:
2024年10月30日发(作者:谷齐)
USB实现PC音频播放器实验
z 意义与作用
现在的智能终端已经逐步由按键+指示灯或数码管发展为触摸屏+音频输出,前面已经
介绍了神舟系列STM开发板的触摸屏,本章节我们来学习一下如何使用神舟系列STM开发
板的USB接口和I2S音频接口在PC侧实现一个免驱动音频声卡功能。本实验USB工作在同步
传输模式。通过该实现使大家了解如何使用STM32的USB的同步传输模式实现即插即用的功
能,以及如何使用STM32的I2S音频接口实现音频播放功能。
z 实验原理
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,
接口描述符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID
协议,该协议可从Http://下载。关于STM32的USB知识可以参考附件的《STM32
USB固件的中文资料.pdf 》和《STM32的USB详解.pdf》等文档。
本实验音频部分主要是初始化DA芯片PCM1770,设置STM32的I2S接口的参数,然后将
来自USB接口的音频数据通过I2S2接口送给DA芯片PCM1770播放。
PCM1770简介:
神舟系列STM开发板采用TI公司的进口原装音频DA芯片PCM1770。PCM1770是一款
具有耳机放大器的24位低功耗立体声音频 DAC。可直接驱动耳机,具有软件控制音量大小、
芯片模式和模拟语音合成等功能。该芯片的功能框图如下:
PCM1770支持工业标准音频数据格式(industry-standard audio data formats),包括标准
模式(standard)、I2S飞利浦标准、MSB对齐标准(left-justified)。本次实验PCM1770为
从设备模式和MSB对齐标准(left-justified)。
PCM1770的I2S共需要4信号:
● SD:串行数据,用来接收2路(左右声道)时分复用通道的数据;
● WS:字选(左右声道选择),从模式下作为输入;
● CK:串行位时钟,从模式下作为输入。
● MCK:主时钟,PCM1770工作需要的时钟。
PCM1770在MSB对齐标准(left-justified)模式下的信号时序如下图所示:
神舟系列STM32开发板的I2S接口特性如下:
● 单工通信(仅发送或接收)
● 主或者从操作
● 8位线性可编程预分频器,获得精确的音频采样频率(8KHz到96kHz)
● 数据格式可以是16位,24位或者32位
● 音频信道固定数据包帧为16位(16位数据帧)或32位(16、24或32位数据帧)
● 可编程的时钟极性(稳定态)
● 从发送模式下的下溢标志位和主/从接收模式下的溢出标志位
● 16位数据寄存器用来发送和接收,在通道两端各有一个寄存器
● 支持的I2S协议:
─ I2S飞利浦标准
─ MSB对齐标准(左对齐)
─ LSB对齐标准(右对齐)
─ PCM标准(16位通道帧上带长或短帧同步或者16位数据帧扩展为32位通道帧)
● 数据方向总是MSB在先
● 发送和接收都具有DMA能力
● 主时钟可以输出到外部音频设备,比率固定为256xFs(Fs为音频采样频率)
● 在互联型产品中,两个I2S模块(I2S2和I2S3)有一个专用的PLL(PLL3),产生更加精准
得时钟
STM32的I2S的框图如下图所示:
通过将寄存器SPI_I2SCFGR的I2SMOD位置为’1’,即可使能I2S功能。此时,可以
把SPI模块用作I2S音频接口。I2S接口与SPI接口使用大致相同的引脚、标志和中断。
STM32的I2S的4个引脚:
● SD:串行数据(映射至MOSI引脚),用来发送和接收2路时分复用通道的数据;
● WS:字选(映射至NSS引脚),主模式下作为数据控制信号输出,从模式下作为输入;
● CK:串行时钟(映射至SCK引脚),主模式下作为时钟信号输出,从模式下作为输入。
● MCK:主时钟(独立映射),在I2S配置为主模式,寄存器SPI_I2SPR的MCKOE位为’1’
时,作为输出额外的时钟信号引脚使用。输出时钟信号的频率预先设置为256 × Fs,其中
Fs是音频信号的采样频率。
设置成主模式时,I2S使用自身的时钟发生器来产生通信用的时钟信号。这个时钟发生
器也是主时钟输出的时钟源。I2S模式下有2个额外的寄存器,一个是与时钟发生器配置相
关的寄存器SPI_I2SPR,另一个是I2S通用配置寄存器SPI_I2SCFGR(可设置音频标准、从/
主模式、数据格式、数据包帧、时钟极性等参数)。
本次实验PCM1770为从设备模式和MSB对齐标准(left-justified),对应神舟系列
STM32开发板的I2S接口主模式和16bit MSB对齐标准。
STM32的I2S支持的MSB对齐标准时序图:
在此标准下,WS信号和第一个数据位,即最高位(MSB)同时产生
根据以上分析所以后续代码中会看到如下配置:
z 硬件设计
本实验硬件包括“STM32的I2S音频接口” 和 “USB 2.0 OTG全速接口”两部分。
STM32的I2S音频接口:
音乐播放器要用到的硬件资源STM32的I2S接口和外部DA芯片PCM1770,将从I2S2接口
传过来的音频音频信号输出到耳机接口。
神舟IV号STM32开发板上使用了PCM1770这款具有耳机放大器的24位低功耗立体
声音频DAC芯片提供音频播放功能。处理器通过I2S接口(处理器的I2S2)传送音频信号
到PCM1770,由它进行解码输出到J3音频座。而PCM1770的配置接口与处理器的SPI3连
接,处理器通过SPI接口访问PCM1770的寄存器,实现配置和控制功能。
图表 1 音频解码电路原理图
D/A芯片PCM1770通过I2S2接口与STM32F107VCT6处理器连接。音频信号通过I2S2
接口传到D/A芯片,转换成音频信号播出。相关管脚定义如下:
GPIO管脚 功能描述 说明
PB12 I2S2_WS 左右通道时钟,频率和音频采样速率一致
PB13 I2S2_CK 串行比特位时钟。
PB15 I2S2_SD 串行音频数据信号。
PC6 I2S2_MCK 系统时钟输入,PCM1770工作需要的时钟
STM32F107VCT6处理器通过SPI3接口访问DA芯片PCM1770,对它内部数据进行读
取和配置。相关管脚定义如下:
GPIO管脚 功能描述 说明
PC7 SPI 片选 连接到PCM1770的SPI接口片选
PC10 SPI3_SCK SPI3接口SCK时钟信号
PC12 SPI3_MOSI SPI3接口的MOSI信号
DAC芯片说明
在神舟IV号中,使用了TI公司推出的低电压,低功耗带耳机放大的DAC芯片PCM1770,
来实现音频的DA转换。
PCM1770的管脚信号图:
PCM1770的管脚信号定义:
USB 2.0 OTG全速接口作为Device设备
注:本实验的硬件设计与前面“USB人机交互设备HID实验”对应章节完全相同,此处
不再重复,请参考“USB人机交互设备HID实验”对应章节。
z 软件设计
在本实验中的原理是采用的是I2S中断方式来将音频数据送到DAC芯片实现播放音乐
的功能,主程序实现如下:
1、 配置LED、串口和LCD液晶屏
2、 配置I2S管脚和参数
3、 USB时钟、USB协议相关初始化,等待USB中断
本实验USB工作在同步传输模式。
关于LED、串口、LCD液晶屏,系统滴答等知识在前面章节已经讲解过,请回顾相关
知识。
下面我们将重点讲解MAIN函数中的Speaker_Config函数:
该函数的第二行可知本实验的I2S数据传输使用的是DMA方式,继续深入看一下
I2S_Config()函数:
I2S_Config()函数配置I2S的GPIO和I2S参数:
查看神舟IV号原理图可知, D/A芯片PCM1770通过I2S2接口与STM32F107VCT6处
理器连接。音频信号通过I2S2接口传到D/A芯片,转换成音频信号播出。相关管脚定义如
下:
GPIO管脚 功能描述 说明
PB12 I2S2_WS 左右通道时钟,频率和音频采样速率一致
PB13 I2S2_CK 串行比特位时钟。
PB15 I2S2_SD 串行音频数据信号。
PC6 I2S2_MCK 系统时钟输入,PCM1770工作需要的时钟
对应的代码如下:
2S_Config()函数配置和初始化I2S管脚以及接口参数:
USB接口初始化
USB接口初始化在前面已经进行了详细的实验,在本实验中,就不再详细描述,相关的
初始化代码如下:
“pProperty->Init()”实际调用的是“void Virtual_Com_Port_init()”
中断配置函数: 该例程使用了USB中断和I2S中断,由于USB工作同步传输模式,所
以将其优先级设为最高,I2S中断优先级次之(STM32的I2S和SPI共用接口资源)。进行
中断组设置和中断优先级设计,相关代码如下:
z 下载与验证
神舟
IV
号光盘
源码
目录包含本实验的工程源码,在
神舟
IV
号光盘
源码
33.
神舟
IV
号
STM32_USB_MUSIC
实现
PC
音频播放器实验
.rarProjectAudio_StreamingEWARMv5
STM3210C-EVAL-25MHzExe目录下的神舟IV号STM32_USB_MUSIC实现PC音频播放器实
验.hex文件即为前面我们分析的神舟IV号STM32的USB实现PC音频播放器实验编译好的固
件,我们可以直接将固件下载到神舟IV号开发板中,观察运行效果。
如果使用JLINK下载固件,请按
错误!未找到引用源。错误!未找到引用源。
下载固件
到神舟IV号开发板小节进行操作。
如果使用USB下载固件,请按
错误!未找到引用源。错误!未找到引用源。
小节进行操
作。
如果使用串口下载固件,请按
错误!未找到引用源。错误!未找到引用源。
小节进行
操作。
未找到引用源。
如果在IAR开发环境中,下载编译好的固件或者在线调试,请按
错误!
错误!未找到引用源。
小节进行操作。
如果在MDK开发环境中,下载编译好的固件或者在线调试,请按
错误!未找到引用源。
错误!未找到引用源。
小节进行操作。
z 实验现象
将实验的程序固件下载到神舟IV号后,将耳机插入音频口(J3)以后,连接USB与PC
电脑,重新为神舟IV号上电运行,PC机会提示发现新硬件并免驱自动完成安装,此时原PC
的声音会通过神舟IV号从耳机播放,在PC上打开音乐就可以通过神舟IV号听到悦耳的歌
声。同时LCD会有消息提示,串口2(波特率115200)输出打印信息,提示程序运行情况。
PC机免驱自动完成安装后,可以在PC的设备管理器里看到如下设备:
同时双击电脑任务栏右侧的喇叭
设备信息。
,可以看到-STM32 Speaker音频
可以查看-STM32 Speaker音频设备的属性信息: